Requestsライブラリ

スクレイピング

RequestsライブラリはPythonプログラミング言語のための、非常に人気があり、強力で、かつ使いやすいHTTPライブラリです。そのキャッチコピーは「HTTP for Humans(人間のためのHTTP)」であり、Pythonの標準ライブラリであるurllibシリーズの複雑さを排除し、直感的かつシンプルなAPIでHTTP通信を扱えるように設計されています。

Requestsライブラリ

Webスクレイピング、API(Application Programming Interface)の利用、ファイルのダウンロードなど、PythonでHTTPリクエストを送信する必要があるほぼすべてのタスクにおいて、Requestsはデファクトスタンダード(事実上の標準)となっています。

1. Requestsのインストール

RequestsはPythonの標準ライブラリではないため、pip(Pythonのパッケージ管理システム)を使用してインストールする必要があります。

Bash

pip install requests

2. 基本的なHTTPリクエスト

Requestsは、主要なHTTPメソッド(GET, POST, PUT, DELETEなど)を、そのまま関数名として提供しています。

2-1. GET リクエスト

最も一般的に使用されるメソッドで、サーバーから情報を取得するために使われます。

Python

import requests

try:
    # GETリクエストを送信
    response = requests.get('https://api.github.com/events')

    # ステータスコードの確認
    if response.status_code == 200:
        print("リクエスト成功!")
        
        # レスポンスヘッダーの表示
        # print(f"Content-Type: {response.headers['Content-Type']}")
        
        # テキスト形式でコンテンツを取得
        # print(response.text[:100]) # 最初の100文字
        
        # JSON形式でコンテンツを取得(API利用時に多用)
        data = response.json()
        print(f"取得したイベントの数: {len(data)}")
        
    else:
        print(f"リクエスト失敗: ステータスコード {response.status_code}")

except requests.exceptions.RequestException as e:
    print(f"エラーが発生しました: {e}")

2-2. POST リクエスト

サーバーにデータを送信するために使われます。主にフォームの送信やAPIへのデータ登録に利用されます。

  • フォームデータ (data引数): application/x-www-form-urlencoded 形式で送信されます。

    Python

    payload = {'key1': 'value1', 'key2': 'value2'}
    response = requests.post('https://httpbin.org/post', data=payload)
    # print(response.json()['form'])
    
  • JSONデータ (json引数): application/json 形式で送信されます。現代のAPIではこちらが主流です。

    Python

    payload_json = {'user': 'admin', 'action': 'create'}
    response = requests.post('https://httpbin.org/post', json=payload_json)
    # print(response.json()['json'])
    

2-3. その他のメソッド

GET, POST と同様に、他のHTTPメソッドも簡単に呼び出せます。

Python

response = requests.put('https://httpbin.org/put', data={'key': 'value'})
response = requests.delete('https://httpbin.org/delete')
response = requests.head('https://httpbin.org/get')
response = requests.options('https://httpbin.org/get')

3. レスポンスオブジェクトの操作

requests.get() などの関数は、requests.Response オブジェクトを返します。このオブジェクトには、サーバーからの応答に関するすべての情報が含まれています。

  • response.status_code: HTTPステータスコード(例: 200, 404, 500)。
  • response.ok: ステータスコードが200番台(成功)であれば True、それ以外(4xx, 5xx)であれば False を返します。
  • response.raise_for_status(): ステータスコードが4xx(クライアントエラー)または5xx(サーバーエラー)の場合に requests.exceptions.HTTPError 例外を発生させます。try...except ブロックと併用することで、エラーハンドリングが容易になります。
  • response.text: レスポンスボディをテキスト(文字列)として返します。Requestsはレスポンスヘッダーからエンコーディングを自動判別しますが、誤認識することもあります。
  • response.encoding: Requestsが判別したエンコーディング。手動で設定することも可能です(例: response.encoding = 'utf-8')。文字化けする場合に有効です。
  • response.content: レスポンスボディをバイト列(bytes)として返します。画像、動画、PDFなどのバイナリファイルを扱う際に使用します。
  • response.json(): レスポンスボディがJSON形式の場合、それをPythonの辞書またはリストにデコードします。JSONデコードに失敗した場合は例外が発生します。
  • response.headers: レスポンスヘッダーを辞書ライクなオブジェクト(大文字・小文字を区別しない)で返します。

4. リクエストのカスタマイズ(主要な引数)

Requestsの各メソッド(get, postなど)は、リクエストを詳細に制御するための多くのキーワード引数を受け取ります。

  • params: (GETリクエストで多用) URLパラメータ(クエリストリング)を辞書で指定します。

    Python

    # https://example.com/search?q=python&lang=jp と同じ
    params = {'q': 'python', 'lang': 'jp'}
    response = requests.get('https://example.com/search', params=params)
    
  • headers: カスタムHTTPヘッダーを辞書で指定します。User-Agentの偽装(スクレイピング対策)、認証トークン(APIキー)の送信などに使われます。

    Python

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
        'Authorization': 'Bearer YOUR_API_KEY'
    }
    response = requests.get('https://api.example.com/data', headers=headers)
    
  • timeout: タイムアウト時間を秒単位で指定します。指定時間内に応答がない場合、requests.exceptions.Timeout 例外が発生します。
    • timeout=5: 接続と読み取りの両方で5秒。
    • timeout=(3.05, 10): 接続に3.05秒、読み取りに10秒。
  • files: ファイルのアップロード(multipart/form-data)に使用します。

    Python

    files = {'file': open('report.xls', 'rb')}
    response = requests.post('https://httpbin.org/post', files=files)
    
  • cookies: クッキーを辞書で送信します。
  • auth: 認証情報(BASIC認証、Digest認証など)をタプルや認証ヘルパーオブジェクトで指定します。

    Python

    from requests.auth import HTTPBasicAuth
    response = requests.get('https://example.com/protected', auth=HTTPBasicAuth('user', 'pass'))
    
  • allow_redirects: デフォルトは True です。False に設定すると、リダイレクト(3xxステータスコード)を自動で追いかけません。
  • stream: デフォルトは False です。True に設定すると、レスポンスボディをすぐにダウンロードせず、接続を維持します。大容量の動画ファイルなどを少しずつダウンロード(ストリーミング)する際に使用します。

    Python

    with requests.get('https://example.com/large_file.zip', stream=True) as r:
        r.raise_for_status()
        with open('large_file.zip', 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                f.write(chunk)
    
  • verify: SSL証明書の検証を制御します。デフォルトは True です。False に設定すると証明書の検証をスキップしますが(非推奨)、セキュリティリスクが生じます。
  • proxies: プロキシサーバーを指定します。

    Python

    proxies = {
        'http': 'http://10.10.1.10:3128',
        'httpss': 'http://10.10.1.10:1080',
    }
    requests.get('https://example.com', proxies=proxies)
    

5. セッションオブジェクト (Session)

requests.Session オブジェクトは、Requestsの強力な機能の一つです。

主な利点:

  1. クッキーの永続化: セッションオブジェクトを通じて行われたリクエスト・レスポンス間のクッキーは自動的に保持されます。これにより、ログイン状態を維持したまま複数のページにアクセスする処理が極めて容易になります。
  2. 接続の再利用: 複数のリクエストを同じホストに送信する場合、TCP接続を再利用(HTTP Keep-Alive)します。これにより、リクエストごとに新しい接続を確立するオーバーヘッドがなくなり、パフォーマンスが大幅に向上します。

使い方:

Python

import requests

# セッションオブジェクトを作成
with requests.Session() as session:
    
    # ログインページにPOSTリクエスト(クッキーが自動で設定される)
    session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})
    
    # ログイン後のページにGETリクエスト(クッキーが自動で送信される)
    response = session.get('https://example.com/dashboard')
    
    print(response.text)

APIの連続呼び出しやWebスクレイピングでは、requests.get() などを直接使うのではなく、Session オブジェクトを使うことが強く推奨されます。

6. エラーハンドリングと例外

ネットワーク通信は不安定なため、適切なエラーハンドリングが不可欠です。Requestsは専用の例外クラスを提供しています。

Python

import requests

try:
    response = requests.get('https://example.com/non-existent-page', timeout=5)
    
    # HTTPエラー(4xx, 5xx)をチェック
    response.raise_for_status() 

except requests.exceptions.HTTPError as e:
    print(f"HTTPエラーが発生しました: {e}")
except requests.exceptions.ConnectionError as e:
    print(f"接続エラー(DNS障害、接続拒否など): {e}")
except requests.exceptions.Timeout as e:
    print(f"タイムアウトしました: {e}")
except requests.exceptions.RequestException as e:
    # 上記以外のRequests関連エラー(TooManyRedirectsなど)
    print(f"予期せぬRequestsエラー: {e}")
except Exception as e:
    print(f"その他のエラー: {e}")

すべてのRequests関連の例外は requests.exceptions.RequestException を継承しています。

7. まとめ

Requestsライブラリは、そのシンプルさと強力な機能により、PythonにおけるHTTP通信の標準的な選択肢となっています。基本的なGET/POSTから、複雑な認証、セッション管理、エラーハンドリングまで、Webと対話するために必要なほぼすべての機能を、クリーンで読みやすいコードで実現できます。 Web APIを利用するアプリケーション開発、データ収集のためのスクレイピング、システム連携など、その用途は無限大です。