概要
requests.get は「URLへアクセスしてデータを取得する」ための最短ルートです。インストールは簡単で、使い方も直感的。重要なのは、ステータスコードの確認、タイムアウト設定、例外処理、レスポンスの型と文字コードの扱いです。さらに、クエリパラメータやヘッダーを付ける、JSONを読む、ファイルとして保存するまでを型として身につけると、APIやWebのデータ取得が安全・確実になります。
基本の使い方
最短の GET リクエスト
# pip install requests
import requests
url = "https://httpbin.org/get"
resp = requests.get(url)
print(resp.status_code) # 200 なら成功
print(resp.text[:200]) # テキスト応答(先頭200文字)
Pythonまずは status_code で成功可否を確認します。200 は成功、404 は「見つからない」、500 はサーバー側のエラーを意味します。
JSON をそのまま辞書として読む
import requests
resp = requests.get("https://httpbin.org/json")
data = resp.json() # Pythonの辞書/リストに変換
print(data["slideshow"]["title"])
PythonAPI は JSON 応答が多いので json() が基本。エラー応答や空応答では例外になることがあるため、後述のエラーハンドリングが重要です。
パラメータ・ヘッダー・タイムアウト
クエリパラメータを安全に付与する
import requests
params = {"q": "tokyo", "lang": "ja"}
resp = requests.get("https://httpbin.org/get", params=params)
print(resp.url) # 自動で ?q=tokyo&lang=ja などに整形
Python手書きで URL を連結せず、params に辞書を渡すのが安全で読みやすい方法です。
ヘッダーで認証や言語を指定する
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer XXXX"}
resp = requests.get("https://httpbin.org/bearer", headers=headers)
print(resp.status_code)
PythonAPI はヘッダー指定が前提のことが多いです。Accept、Authorization、User-Agent などを必要に応じて設定します。
タイムアウトで待ちすぎを防ぐ
import requests
try:
resp = requests.get("https://httpbin.org/delay/3", timeout=2.0)
except requests.Timeout:
print("タイムアウトで中断")
Pythontimeout は「通信確立+応答待ち」の最大待ち時間。ネットワーク不調で処理が固まる事故を防ぐため、常に設定する癖をつけます。
レスポンスの扱い
ステータスコードと自動例外化
import requests
resp = requests.get("https://httpbin.org/status/404")
try:
resp.raise_for_status() # 4xx/5xx を HTTPError にする
except requests.HTTPError as e:
print("HTTPエラー:", e)
Pythonraise_for_status() を使うと、失敗を見落とさずに例外で検知できます。実務では必須級です。
テキスト、バイナリ、文字コード
import requests
resp = requests.get("https://httpbin.org/html")
resp.encoding = resp.apparent_encoding # 文字化け対策(推定値で上書き)
print(resp.text[:100]) # テキスト
resp_bin = requests.get("https://httpbin.org/image/png")
data = resp_bin.content # バイナリ
print(len(data)) # バイト数
Pythontext は文字列、content はバイナリ。文字化けする場合は encoding を明示するか apparent_encoding を採用します。
セッションでクッキーやヘッダーを維持する
import requests
with requests.Session() as s:
s.headers.update({"User-Agent": "MyClient/1.0"})
s.get("https://httpbin.org/cookies/set?session=abc")
r = s.get("https://httpbin.org/cookies")
print(r.json())
PythonSession は「同じ接続設定を使い回す」ための器。認証・クッキー維持・パフォーマンス向上に有効です。
エラーハンドリングと再試行
例外の基本と網羅的な捕捉
import requests
url = "https://example.invalid" # 不正ドメインで失敗する例
try:
resp = requests.get(url, timeout=5)
resp.raise_for_status()
except requests.Timeout:
print("タイムアウト")
except requests.ConnectionError:
print("接続エラー")
except requests.HTTPError as e:
print("HTTPエラー:", e)
except requests.RequestException as e:
print("その他のリクエスト例外:", e)
PythonRequestException は親クラス。最後にまとめて捕捉すると取りこぼしがありません。
自動再試行の型(失敗を一定回数までリトライ)
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)
resp = session.get("https://httpbin.org/status/503")
print(resp.status_code)
Python一時的なサーバー不調はリトライで回復することがあります。status_forcelist と backoff_factor で間隔を伸ばしつつ再試行します。
ファイル保存と OS 連携
バイナリを安全に保存する
import requests
from pathlib import Path
url = "https://httpbin.org/image/png"
out = Path("downloads") / "logo.png"
out.parent.mkdir(parents=True, exist_ok=True)
resp = requests.get(url, timeout=10)
resp.raise_for_status()
out.write_bytes(resp.content)
PythonPathlib の write_bytes が最短。保存先フォルダは事前に作成すると失敗しません。
大きなファイルはチャンクでストリーミング保存
import requests
from pathlib import Path
url = "https://speed.hetzner.de/100MB.bin"
out = Path("downloads/large.bin")
out.parent.mkdir(parents=True, exist_ok=True)
with requests.get(url, stream=True, timeout=30) as r:
r.raise_for_status()
with out.open("wb") as f:
for chunk in r.iter_content(chunk_size=8192):
if chunk: # keep-alive などの空チャンクを除外
f.write(chunk)
Pythonstream=True と iter_content でメモリに載せずに書き出します。巨大ファイルでの基本パターンです。
コンテンツ種別とファイル名のヒント
import requests
r = requests.get("https://httpbin.org/anything")
print(r.headers.get("Content-Type")) # 例: application/json
print(r.headers.get("Content-Disposition")) # 添付ファイル名のヒントが入ることあり
Pythonヘッダーに MIME タイプや推奨ファイル名が入ることがあり、保存時に参考になります。
実務の型
認証とプロキシ、証明書検証
import requests
# ベーシック認証
resp = requests.get("https://httpbin.org/basic-auth/user/pass",
auth=("user", "pass"))
# プロキシ経由
proxies = {"https": "http://proxy.example:8080"}
resp = requests.get("https://httpbin.org/get", proxies=proxies)
# 証明書検証の制御(基本は True のまま推奨)
resp = requests.get("https://expired.badssl.com/", verify=False) # 注意: セキュリティ低下
Pythonverify=False は検証を無効化しますが、セキュリティ上の理由から原則避けます。社内プロキシや自己署名証明書では証明書を信頼ストアに追加するのが正攻法です。
レート制限への配慮
API はレート制限があります。429(Too Many Requests)や特定ヘッダー(Retry-After)を見て、待機(sleep)や指数バックオフで再試行すると安全です。
よくある落とし穴の回避
タイムアウト未設定で処理が固まる
- 対策: timeout を常に指定。遅い API は大きめ、通常は数秒程度。
失敗を見落として壊れたデータを使う
- 対策: status_code の確認、または raise_for_status() を必ず呼ぶ。
文字化け
- 対策: resp.encoding を適切に設定。わからない場合は apparent_encoding を使う。
巨大ファイルでメモリ不足
- 対策: stream=True と iter_content でチャンク書き込み。
ハードコードした URL 連結
- 対策: params に辞書で渡す。手書き連結はエスケープ漏れの原因。
例題で身につける
例題1 文字列応答の取得と基本チェック
import requests
resp = requests.get("https://httpbin.org/get", timeout=5)
resp.raise_for_status()
print("OK:", resp.status_code)
print(resp.text[:200])
Python例題2 クエリとヘッダーで API 風アクセス
import requests
params = {"q": "weather", "city": "tokyo"}
headers = {"Accept": "application/json"}
resp = requests.get("https://httpbin.org/get", params=params, headers=headers, timeout=5)
resp.raise_for_status()
print(resp.json())
Python例題3 JSON を読んで値を取り出す
import requests
resp = requests.get("https://httpbin.org/json", timeout=5)
resp.raise_for_status()
data = resp.json()
print(data["slideshow"]["author"])
Python例題4 画像をストリーミング保存
import requests
from pathlib import Path
url = "https://httpbin.org/image/jpeg"
out = Path("images/photo.jpg")
out.parent.mkdir(parents=True, exist_ok=True)
with requests.get(url, stream=True, timeout=10) as r:
r.raise_for_status()
with out.open("wb") as f:
for chunk in r.iter_content(8192):
if chunk:
f.write(chunk)
print("Saved:", out)
Pythonまとめ
requests.get は、URL からデータを取得するための最短手段です。ステータス確認と raise_for_status、timeout、json と text・content の使い分け、encoding の明示が重要。ファイル保存は Pathlib とストリーミングで安全に、実務では Session、認証、プロキシ、リトライ、レート制限対応が効いてきます。この型を身につければ、初心者でも短く、壊れない Web/API 連携が書けます。

