Python | Web / API:requests.get

Python Python
スポンサーリンク

概要

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"])
Python

API は 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)
Python

API はヘッダー指定が前提のことが多いです。Accept、Authorization、User-Agent などを必要に応じて設定します。

タイムアウトで待ちすぎを防ぐ

import requests

try:
    resp = requests.get("https://httpbin.org/delay/3", timeout=2.0)
except requests.Timeout:
    print("タイムアウトで中断")
Python

timeout は「通信確立+応答待ち」の最大待ち時間。ネットワーク不調で処理が固まる事故を防ぐため、常に設定する癖をつけます。


レスポンスの扱い

ステータスコードと自動例外化

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)
Python

raise_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))                        # バイト数
Python

text は文字列、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())
Python

Session は「同じ接続設定を使い回す」ための器。認証・クッキー維持・パフォーマンス向上に有効です。


エラーハンドリングと再試行

例外の基本と網羅的な捕捉

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)
Python

RequestException は親クラス。最後にまとめて捕捉すると取りこぼしがありません。

自動再試行の型(失敗を一定回数までリトライ)

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)
Python

Pathlib の 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)
Python

stream=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)  # 注意: セキュリティ低下
Python

verify=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 連携が書けます。

タイトルとURLをコピーしました