Python requests でカスタムヘッダーを設定する方法

PythonBeginner
オンラインで実践に進む

はじめに

ウェブ開発とデータ取得の世界において、Python の requests でカスタムヘッダーを設定する方法を理解することは、非常に重要なスキルです。このチュートリアルでは、Python の requests にカスタムヘッダーを追加するプロセスを詳しく解説し、ウェブスクレイピング、API インタラクションなど、幅広い可能性を切り開きます。

カスタムヘッダーを使用すると、ウェブサーバーや API がリクエストをどのように処理するかを制御できます。リクエストの認証、コンテンツタイプの指定、キャッシュの管理、さらにはブラウザの動作の模倣などを行うことができます。このチュートリアルを終える頃には、特定の要件を満たすために HTTP リクエストをカスタマイズするための実践的な知識を習得しているでしょう。

HTTP ヘッダーと Requests ライブラリの理解

コードを書き始める前に、HTTP ヘッダーとは何か、そしてなぜ重要なのかを理解しましょう。

HTTP ヘッダーとは?

HTTP ヘッダーは、クライアントとサーバー間でリクエストとレスポンスで送信されるキーと値のペアです。コンテンツタイプ、認証情報、クライアント情報など、リクエストまたはレスポンスに関する追加情報を提供します。

たとえば、ウェブサイトにアクセスすると、ブラウザは自動的に User-Agent (ブラウザを識別)、Accept (処理できるコンテンツタイプを指定) などのヘッダーを含めます。

Requests ライブラリのインストール

Python の Requests ライブラリは、HTTP リクエストの操作を簡単にします。環境にインストールされていることを確認しましょう。

  1. WebIDE でターミナルを開き、以下を実行します。
pip install requests

requests がインストールされているか、すでにインストールされていることを示す出力が表示されるはずです。

Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (2.28.1)
...

Requests を使用した最初の Python スクリプトの作成

Requests ライブラリをテストするための簡単な Python スクリプトを作成しましょう。

  1. WebIDE の左側のサイドバーにあるエクスプローラーアイコンをクリックします。
  2. ファイルエクスプローラーを右クリックし、「新しいファイル」を選択します。
  3. ファイル名を test_requests.py とします。
  4. ファイルに次のコードを追加します。
import requests

## テストウェブサイトへの簡単な GET リクエストを行う
response = requests.get('https://httpbin.org/get')

## レスポンスのステータスコードを出力する
print(f"Status Code: {response.status_code}")

## レスポンスヘッダーを出力する (サーバーが返送したもの)
print("\nResponse Headers:")
for header, value in response.headers.items():
    print(f"{header}: {value}")

## レスポンスの内容を出力する
print("\nResponse Content:")
print(response.text[:300] + "...")  ## 最初の 300 文字のみ表示
  1. ターミナルを開き、以下を実行してスクリプトを実行します。
python test_requests.py

次のような出力が表示されるはずです。

Status Code: 200

Response Headers:
Date: Wed, 12 Apr 2023 10:15:23 GMT
Content-Type: application/json
Content-Length: 267
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Response Content:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-643..."
  },
  "origin": "123.45.67.89",
  "url": "https://httpbin.org/get"
}
...

この出力は以下を示しています。

  1. サーバーはステータスコード 200 (成功) で応答しました。
  2. サーバーが返送したヘッダー
  3. レスポンスの実際のコンテンツ (JSON 形式)

サーバーが、Python の requests ライブラリからのリクエストであることを識別する自動生成された User-Agent ヘッダーなど、私たちから受け取ったヘッダーを記録していることに注目してください。

次のステップでは、これらのヘッダーをカスタマイズして、リクエストをより詳細に制御する方法を学びます。

Python Requests での基本的なカスタムヘッダーの設定

HTTP ヘッダーが何であるかを理解し、requests ライブラリをテストしたので、リクエストでカスタムヘッダーを設定する方法を学びましょう。

なぜカスタムヘッダーを設定するのか?

カスタムヘッダーを設定する理由はいくつかあります。

  1. 認証 (Authentication): 多くの API は、ヘッダーで送信される認証トークンを必要とします。
  2. User-Agent: ウェブサイトに対する自己識別方法を変更します。
  3. Content-Type: 送信するデータの形式を指定します。
  4. Accept: 処理できるコンテンツタイプを示します。
  5. カスタムヘッダー (Custom Headers): 一部の API は、特定のカスタムヘッダーを必要とします。

Requests でのヘッダーの設定

カスタムヘッダーの設定を練習するために、新しい Python スクリプトを作成しましょう。

  1. WebIDE で、custom_headers.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

## リクエストを行う URL を定義します
url = 'https://httpbin.org/headers'

## ディクショナリでカスタムヘッダーを定義します
custom_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'X-Custom-Header': 'Hello World',
    'Accept-Language': 'en-US,en;q=0.9'
}

## カスタムヘッダーを使用してリクエストを行います
response = requests.get(url, headers=custom_headers)

## ステータスコードを出力します
print(f"Status Code: {response.status_code}")

## サーバーが受信したヘッダーを表示するレスポンスの内容を出力します
print("\nHeaders received by server:")
print(response.json())
  1. スクリプトを実行します。
python custom_headers.py

次のような出力が表示されるはずです。

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'X-Custom-Header': 'Hello World', 'X-Amzn-Trace-Id': 'Root=1-6430a123-abc123def456'}}

何が起こっているのか?

このスクリプトでは、次のことを行いました。

  1. custom_headers という名前のディクショナリを作成し、3 つのヘッダーを含めました。

    • User-Agent: デフォルトの Python requests の値から、ウェブブラウザを模倣するように変更しました。
    • X-Custom-Header: 私たちが考案した完全にカスタムなヘッダーです。
    • Accept-Language: コンテンツの優先言語を指定します。
  2. headers パラメータを使用して、ヘッダーを requests.get() に渡しました。

  3. httpbin.org/headers からのレスポンスは、実際に受信したヘッダーを正確に示しており、カスタムヘッダーが正常に送信されたことを確認しています。

特定のユースケースに合わせてヘッダーを変更する

モバイルデバイスになりすます別の例を作成しましょう。これは、モバイル対応のウェブサイトをテストする際に役立ちます。

  1. mobile_headers.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

url = 'https://httpbin.org/headers'

## iPhone をシミュレートするヘッダー
mobile_headers = {
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}

print("Making request with mobile device headers...")
response = requests.get(url, headers=mobile_headers)

## レスポンスの内容を出力します
print(response.json())
  1. スクリプトを実行します。
python mobile_headers.py

次のような出力が表示されるはずです。

Making request with mobile device headers...
{'headers': {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1', 'X-Amzn-Trace-Id': 'Root=1-6430a456-abc123def456'}}

これは、特定の User-Agent ヘッダーを設定することにより、私たちが iPhone であることをサーバーに正常に伝えていることを示しています。

認証ヘッダーの操作

カスタムヘッダーの最も一般的な用途の 1 つは、Web サービスと API での認証です。多くの API では、リクエストヘッダーに認証情報を含める必要があります。

認証ヘッダーの理解

一般的な認証方法はいくつかあります。

  1. API キー (API Keys): ヘッダーまたは URL パラメータに含まれるシンプルなトークン
  2. Basic 認証 (Basic Authentication): Base64 エンコードされたユーザー名とパスワード
  3. ベアラートークン (Bearer Tokens): OAuth および JWT 認証で使用
  4. カスタム認証 (Custom Authentication): 独自の認証スキーム

Python requests を使用して、これらの認証方法を実装する方法を見てみましょう。

API キー認証

多くの API は、API キーを使用してアクセスを許可します。これらは通常、ヘッダーまたは URL パラメータに含まれます。

  1. api_key_auth.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

url = 'https://httpbin.org/headers'

## API キー認証をシミュレートする
api_key = 'my_fake_api_key_12345'

## API キーをヘッダーに追加する
headers = {
    'X-API-Key': api_key,
    'User-Agent': 'My API Client/1.0'
}

## リクエストを行う
response = requests.get(url, headers=headers)

## 結果を出力する
print(f"Status Code: {response.status_code}")
print("\nHeaders received by server:")
print(response.json())
  1. スクリプトを実行します。
python api_key_auth.py

次のような出力が表示されるはずです。

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'My API Client/1.0', 'X-API-Key': 'my_fake_api_key_12345', 'X-Amzn-Trace-Id': 'Root=1-6430a789-abc123def456'}}

これにより、X-API-Key ヘッダーに API キーを正常に送信したことが確認できます。

Basic 認証

Basic 認証には、base64 形式でエンコードされたユーザー名とパスワードの送信が含まれます。Requests ライブラリを使用すると、これが簡単になります。

  1. basic_auth.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

## Basic 認証を必要とする URL
url = 'https://httpbin.org/basic-auth/user/pass'

## 方法 1: auth パラメータを使用する (推奨)
print("Method 1: Using the auth parameter")
response = requests.get(url, auth=('user', 'pass'))
print(f"Status Code: {response.status_code}")
print(response.json())

## 方法 2: Authorization ヘッダーを手動で設定する
print("\nMethod 2: Setting the Authorization header manually")
import base64

## 基本認証文字列を作成する:base64 でエンコードされた "username:password"
auth_string = base64.b64encode('user:pass'.encode('utf-8')).decode('utf-8')
headers = {
    'Authorization': f'Basic {auth_string}'
}

response = requests.get(url, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json())
  1. スクリプトを実行します。
python basic_auth.py

次のような出力が表示されるはずです。

Method 1: Using the auth parameter
Status Code: 200
{'authenticated': True, 'user': 'user'}

Method 2: Setting the Authorization header manually
Status Code: 200
{'authenticated': True, 'user': 'user'}

どちらの方法も、サービスで正常に認証されました。

  • 方法 1 は、組み込みの auth パラメータを使用しており、より便利です。
  • 方法 2 は、Authorization ヘッダーを手動で作成することにより、Basic 認証が「内部で」どのように機能するかを示しています。

ベアラートークン認証

ベアラートークン認証は、OAuth 2.0 および JWT ベースのシステムで一般的に使用されます。

  1. bearer_auth.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

url = 'https://httpbin.org/headers'

## ベアラートークンをシミュレートする (実際のアプリでは、これは OAuth プロセスから取得されます)
bearer_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Q6CM1qIQkXA_DqyJq9MI0-mnRRCRR3c0SIM-Nul5MZs'

## Authorization ヘッダーにベアラートークンを追加する
headers = {
    'Authorization': f'Bearer {bearer_token}'
}

## リクエストを行う
response = requests.get(url, headers=headers)

## 結果を出力する
print(f"Status Code: {response.status_code}")
print("\nHeaders received by server:")
print(response.json())
  1. スクリプトを実行します。
python bearer_auth.py

次のような出力が表示されるはずです。

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Q6CM1qIQkXA_DqyJq9MI0-mnRRCRR3c0SIM-Nul5MZs', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430a901-abc123def456'}}

これは、Authorization ヘッダーにベアラートークンを含めてリクエストが成功したことを示しています。

ベアラートークンは通常、OAuth 2.0 サーバーとの認証プロセスが成功した後に取得されますが、この例では、デモンストレーション目的でサンプル トークンを使用しています。

実用的なアプリケーションとベストプラクティス

さまざまな種類のカスタムヘッダーを設定する方法を学んだので、実際のシナリオでヘッダーを操作するための実用的なアプリケーションとベストプラクティスを見てみましょう。

JSON データの送受信

最新の API を操作する場合、JSON が最も一般的なデータ形式です。JSON リクエストのヘッダーを適切に設定する方法を見てみましょう。

  1. json_requests.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests
import json

url = 'https://httpbin.org/post'  ## このエンドポイントは POST リクエストを受け入れます

## 送信するデータ
data = {
    'name': 'John Doe',
    'email': 'john@example.com',
    'message': 'Hello, world!'
}

## JSON に適切なヘッダーを設定する
headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
}

## 方法 1: json パラメータを使用する (推奨)
print("Method 1: Using the json parameter")
response = requests.post(url, json=data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers'])  ## 受信したヘッダーを表示する
print(f"\nData sent (as received by server): {response.json()['json']}")

## 方法 2: 手動で JSON に変換する
print("\nMethod 2: Manually converting to JSON")
json_data = json.dumps(data)
response = requests.post(url, data=json_data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers'])  ## 受信したヘッダーを表示する
print(f"\nData sent (as received by server): {response.json()['json']}")
  1. スクリプトを実行します。
python json_requests.py

次のような出力が表示されるはずです。

Method 1: Using the json parameter
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab12-abc123def456'}

Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}

Method 2: Manually converting to JSON
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab13-abc123def456'}

Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}

どちらの方法も機能しますが、方法 1 の方が便利です。Requests ライブラリが JSON 変換を処理してくれるからです。

デフォルトヘッダーを持つ再利用可能なセッションの作成

同じヘッダーで複数のリクエストを行う必要がある場合は、Session オブジェクトを使用すると、時間を節約し、コードをよりクリーンにすることができます。

  1. session_headers.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests

## セッションオブジェクトを作成する
session = requests.Session()

## このセッションで行われるすべてのリクエストのデフォルトヘッダーを設定する
session.headers.update({
    'User-Agent': 'MyCustomApp/1.0',
    'Accept-Language': 'en-US,en;q=0.9',
    'X-API-Key': 'my_session_api_key'
})

## セッションを使用してリクエストを行う - デフォルトヘッダーが含まれます
print("First request with session:")
response = session.get('https://httpbin.org/headers')
print(response.json())

## このリクエスト専用のカスタムヘッダーを追加する
print("\nSecond request with additional header:")
response = session.get('https://httpbin.org/headers',
                      headers={'X-Custom-Header': 'Just for this request'})
print(response.json())

## 元のヘッダーは、今後のリクエストでは変更されません
print("\nThird request (original headers only):")
response = session.get('https://httpbin.org/headers')
print(response.json())
  1. スクリプトを実行します。
python session_headers.py

次のような出力が表示されるはずです。

First request with session:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab45-abc123def456'}}

Second request with additional header:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Custom-Header': 'Just for this request', 'X-Amzn-Trace-Id': 'Root=1-6430ab46-abc123def456'}}

Third request (original headers only):
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab47-abc123def456'}}

セッションを使用することは、いくつかの理由からベストプラクティスです。

  1. パフォーマンスの向上 (接続プーリング)
  2. リクエスト全体での一貫したヘッダー
  3. 自動 Cookie 処理
  4. 必要に応じてリクエストごとのカスタマイズを追加する機能

ヘッダーを操作するためのベストプラクティス

まとめとして、HTTP ヘッダーを操作する際に従うべきベストプラクティスをいくつか紹介します。

  1. 同じドメインへの複数のリクエストには、Session オブジェクト を使用します。
  2. 送信するデータに対して、Content-Type ヘッダー を正しく設定します。
  3. 認証を適切に処理する - 可能であれば、組み込みの認証を使用します。
  4. 機密情報を安全に保つ - API キーやトークンをハードコードしないでください。
  5. 必要なヘッダーについては、API ドキュメントを注意深く確認してください

これらのベストプラクティスを示す最終的な例を次に示します。

  1. best_practices.py という名前の新しいファイルを作成します。
  2. 次のコードを追加します。
import requests
import os

## 実際のアプリケーションでは、これらを環境変数または安全な設定から取得します
## この例では、シンプルに保っています
API_KEY = os.environ.get('API_KEY', 'default_api_key')
BASE_URL = 'https://httpbin.org'

def create_api_client():
    """デフォルトヘッダーを持つ再利用可能なセッションを作成します。"""
    session = requests.Session()

    ## 共通ヘッダーを設定する
    session.headers.update({
        'User-Agent': 'MyApp/1.0',
        'X-API-Key': API_KEY,
        'Accept': 'application/json'
    })

    return session

def get_data(client, endpoint):
    """指定されたエンドポイントに GET リクエストを行います。"""
    url = f"{BASE_URL}/{endpoint}"
    response = client.get(url)
    return response.json()

def post_data(client, endpoint, data):
    """JSON データを使用して POST リクエストを行います。"""
    url = f"{BASE_URL}/{endpoint}"
    response = client.post(url, json=data)
    return response.json()

## 使用例
def main():
    ## API クライアントを作成する
    client = create_api_client()

    ## GET リクエストの例
    print("Making GET request...")
    get_response = get_data(client, 'headers')
    print(f"Headers sent: {get_response['headers']}")

    ## POST リクエストの例
    print("\nMaking POST request...")
    data = {'name': 'John', 'age': 30}
    post_response = post_data(client, 'post', data)
    print(f"Data received by server: {post_response['json']}")

if __name__ == '__main__':
    main()
  1. スクリプトを実行します。
python best_practices.py

次のような出力が表示されるはずです。

Making GET request...
Headers sent: {'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'MyApp/1.0', 'X-API-Key': 'default_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab78-abc123def456'}

Making POST request...
Data received by server: {'name': 'John', 'age': 30}

この例は、再利用可能なセッションの作成、コードを関数への整理、ハードコードされた機密情報の回避など、ベストプラクティスに従い、カスタムヘッダーを使用して HTTP リクエストを行うための構造化されたアプローチを示しています。

まとめ

このチュートリアルでは、Python requests でカスタムヘッダーを操作する方法を学びました。これは、効果的な Web 通信と API 統合に不可欠なスキルです。

これで、次のことが理解できるようになりました。

  • HTTP ヘッダーとは何か、そして Web リクエストにとってなぜ重要なのか
  • 個々のリクエストに対してカスタムヘッダーを設定する方法
  • ヘッダーを使用したさまざまな認証方法 (API キー、Basic 認証、ベアラートークン)
  • JSON データとコンテンツタイプヘッダーを適切に操作する方法
  • セッションオブジェクトを使用したヘッダー管理のベストプラクティス

これらのスキルにより、あらゆる Web API とより効果的に対話し、保護されたリソースにアクセスし、リクエストの処理方法を制御し、より洗練された Web アプリケーションを構築できるようになります。

Python のスキルを開発し続ける中で、ヘッダー、ステータスコード、コンテンツタイプなどの HTTP の基本を理解することが、Web アプリケーションの問題をトラブルシューティングし、より高度な機能を実装するのに役立つことを忘れないでください。