WebスクレイピングやAPI連携を行う際、サーバーに対して適切な「リクエストヘッダー」を送信することは非常に重要です。デフォルトの状態では、User-Agent(利用しているクライアントの情報)が python-requests/x.x.x となり、サーバーによってはボットからのアクセスとして拒否される場合があります。
ここでは、ブラウザからのアクセスに見せかけるためのUser-Agent設定や、API利用時に必須となる認証情報の付与方法について解説します。
目次
実行可能なサンプルコード
以下のコードは、リクエストヘッダーの内容をレスポンスとして返すテスト用API(httpbin.org)を利用し、ヘッダーが正しく書き換わっているかを確認するスクリプトです。
単純なUser-Agentだけでなく、言語設定や参照元(Referer)なども含めることで、より一般的なブラウザアクセスに近づけています。
import requests
import json
def fetch_with_custom_headers():
# ヘッダー確認用のエンドポイント
target_url = "https://httpbin.org/headers"
# カスタムヘッダーの定義
# 一般的なWebブラウザ(Chrome on Windows)を模した設定
custom_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "ja,en-US;q=0.9,en;q=0.8",
"Referer": "https://www.google.com/"
}
# APIキー認証が必要な場合の例(コメントアウト)
# api_headers = {
# "Authorization": "Bearer YOUR_ACCESS_TOKEN",
# "Content-Type": "application/json"
# }
print(f"Connecting to: {target_url}")
print("--- Sending Headers ---")
print(json.dumps(custom_headers, indent=2))
try:
# headers引数に辞書を渡すことで、デフォルトのヘッダーを上書き・追加できます
response = requests.get(target_url, headers=custom_headers, timeout=10)
response.raise_for_status()
# 結果の確認
print("\n--- Server Received Headers ---")
response_data = response.json()
# サーバーが実際に受け取ったヘッダー情報を表示
# キー名はサーバーによって正規化(先頭大文字など)されることがあります
received_headers = response_data.get("headers", {})
print(json.dumps(received_headers, indent=2))
# User-Agentの検証
ua = received_headers.get("User-Agent")
if "Chrome" in ua:
print("\n>> Success: User-Agent is recognized as Chrome.")
else:
print("\n>> Warning: User-Agent was not updated.")
except requests.RequestException as e:
print(f"Error occurred: {e}")
if __name__ == "__main__":
fetch_with_custom_headers()
解説:ヘッダー設定が必要な主なケース
requests.get() や post() の headers 引数には、Pythonの辞書(dict)を渡します。
1. スクレイピング対策の回避(User-Agent)
多くのWebサイトは、プログラムによる自動アクセスを制限するためにUser-Agentを確認しています。
- デフォルト:
python-requests/2.31.0など - 対処: 上記コードのように、一般的なブラウザの文字列(User-Agent string)を設定することで、アクセスが許可される場合があります。
2. API認証(Authorization)
REST APIなどを利用する場合、認証トークンをヘッダーに含めることが一般的です。
headers = {
"Authorization": "Bearer xxxxx-token-xxxxx",
"X-Api-Key": "my-secret-key"
}
3. データ形式の指定(Content-Type / Accept)
JSONデータを送信したり、サーバーからJSON形式での返却を求めたりする場合に指定します。
headers = {
"Content-Type": "application/json", # 送るデータの形式
"Accept": "application/json" # 欲しいデータの形式
}
