🌐
requests内部構造 — requests.get()が実際にやること
Session、PreparedRequest、HTTPAdapter、urllib3までの呼び出しチェーン
response = requests.get('https://api.example.com/data')
この一行の裏で起きること:
呼び出しチェーン
requests.get(url)
→ Session().request() # 一時Session生成
→ PreparedRequest # ヘッダー、Cookie、エンコーディング組立
→ HTTPAdapter.send() # アダプター選択
→ urllib3.PoolManager # コネクションプールから接続取得
→ socket.connect() # 実際のTCP接続
なぜ知る必要があるか
requests.get()をループで100回呼ぶと毎回新しいTCP接続を作る。Sessionを直接作ればコネクションプールを再利用。
urllib3 — エンジン
requestsはHTTPプロトコル処理を全てurllib3に委任。コネクションプーリング、Keep-Alive、リトライ、SSL — 全てurllib3レベル。requestsはその上に「使いやすいAPI」を載せたもの。
HTTPAdapterで細かい制御
プールサイズ、リトライ回数/間隔、最大同時接続数を制御可能。
キーポイント
1
requests.get()は内部的に一時Sessionを作る
2
PreparedRequestでヘッダー/Cookie/エンコーディングを組立
3
HTTPAdapter → urllib3.PoolManager → socket.connect()で実際TCP接続
4
Sessionを直接作ればコネクションプール再利用で性能向上
ユースケース
APIクライアント — Session + HTTPAdapterでリトライ/タイムアウト/プール設定
クローラー — Sessionでクッキー/ヘッダーを維持しながら複数ページリクエスト