0Pricing
Python Academy · レッスン

requests と httpx による HTTP リクエスト

Web ページを取得し、リダイレクト、セッション、ヘッダーを処理します。

「requests と httpx による HTTP リクエスト」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

requestsライブラリ

requests は標準的な同期HTTPライブラリです。シンプルで実績があり、スクリプトや一度きりのAPI呼び出しに最適です。

# pip install requests
import requests

r = requests.get("https://api.github.com/users/octocat")
print(r.status_code)   # 200
print(r.json()["login"])   # octocat

クエリパラメーターとヘッダー

クエリパラメーターは params= で、カスタムヘッダーは headers= で渡します。

import requests

r = requests.get(
    "https://api.example.com/search",
    params={"q": "python", "page": 1},
    headers={"Authorization": "Bearer my-token"}
)
print(r.url)    # full URL with query string

JSONボディでPOST

json= を使ってJSONデータを送信します。requestsが Content-Type: application/json を自動的に設定します。

import requests

r = requests.post(
    "https://api.example.com/users",
    json={"name": "Alice", "email": "alice@example.com"}
)
print(r.status_code)   # 201
print(r.json())

セッションオブジェクト

複数のリクエスト間でヘッダー、Cookie、コネクションプールを維持するには、requests.Session を使います。

import requests

with requests.Session() as s:
    s.headers.update({"Authorization": "Bearer token"})
    users = s.get("https://api.example.com/users").json()
    profile = s.get("https://api.example.com/me").json()

タイムアウトと再試行

必ずタイムアウトを設定します。自動的に再試行するには、HTTPAdapter と urllib3.util.retry.Retry を使います。

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

s = requests.Session()
retry = Retry(total=3, backoff_factor=1)
s.mount("https://", HTTPAdapter(max_retries=retry))

r = s.get("https://api.example.com/data", timeout=5)

エラー処理

r.raise_for_status() を呼び出すと、4xx/5xxレスポンスに対して HTTPError を発生させられます。

import requests

try:
    r = requests.get("https://api.example.com/data")
    r.raise_for_status()
    data = r.json()
except requests.HTTPError as e:
    print(f"HTTP error: {e.response.status_code}")
except requests.ConnectionError:
    print("Network unreachable")

ファイルのダウンロード

大きなファイルをダウンロードするときは、stream=True でストリーミングし、すべてのデータがメモリに読み込まれるのを防ぎます。

import requests

with requests.get("https://example.com/large.zip", stream=True) as r:
    r.raise_for_status()
    with open("large.zip", "wb") as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

httpx — 最新の非同期HTTP

httpx はrequestsと同じAPIを備えていますが、非同期処理に対応しています。FastAPIアプリや非同期ワークフローで使用します。

# pip install httpx
import httpx

# Synchronous:
r = httpx.get("https://httpbin.org/get")
print(r.json())

# Asynchronous:
import asyncio
async def main():
    async with httpx.AsyncClient() as c:
        r = await c.get("https://httpbin.org/get")
        print(r.json())
asyncio.run(main())

httpx AsyncClient

コネクションプールを利用するため、複数のリクエストで1つの AsyncClient を共有します。起動時に作成し、終了時に閉じます。

import httpx, asyncio

CLIENT: httpx.AsyncClient | None = None

async def startup():
    global CLIENT
    CLIENT = httpx.AsyncClient(timeout=10)

async def shutdown():
    await CLIENT.aclose()

認証ヘルパー

requestsとhttpxは、どちらも認証ヘルパーに対応しています。Basic認証には auth=(user, pass) を、トークン認証にはカスタム Auth クラスを使います。

import httpx

class BearerAuth(httpx.Auth):
    def __init__(self, token): self.token = token
    def auth_flow(self, request):
        request.headers["Authorization"] = f"Bearer {self.token}"
        yield request

async with httpx.AsyncClient(auth=BearerAuth("my-token")) as c:
    r = await c.get("https://api.example.com/me")

テストでのHTTPモック

テストでHTTP呼び出しをモックするには、respx(httpx用)または responses(requests用)を使います。

# pip install respx
import httpx, respx, asyncio

@respx.mock
async def test_api():
    respx.get("https://api.example.com/users").mock(
        return_value=httpx.Response(200, json=[{"id":1}])
    )
    async with httpx.AsyncClient() as c:
        r = await c.get("https://api.example.com/users")
    assert r.json() == [{"id": 1}]

確認問題

response.raise_for_status() は何をしますか。

復習

同期HTTPには requests を使います。非同期処理が必要な場合は httpx を使います。必ずタイムアウトを設定し、コネクションの再利用にはセッションを使い、raise_for_status() を呼び出し、大きなファイルはストリーミングします。テストでは respx または responses でHTTPをモックします。

よくある質問

「requests と httpx による HTTP リクエスト」レッスンは無料ですか?

はい。「requests と httpx による HTTP リクエスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「requests と httpx による HTTP リクエスト」で何を学びますか?

Web ページを取得し、リダイレクト、セッション、ヘッダーを処理します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「requests と httpx による HTTP リクエスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. requests と httpx による HTTP リクエスト
  2. BeautifulSoup による HTML の解析
  3. Scrapy スパイダーの作成
  4. JavaScript とスクレイピング対策への対応
← Python Academyに戻る