PythonでWebからデータを取得するrequests

プログラミング

PythonでWebからデータを取得するrequestsライブラリ:機能と活用法

PythonでWebサイトからデータを取得する際に、最も広く利用されているライブラリの一つがrequestsです。このライブラリは、HTTPリクエストを非常に簡単かつ直感的に実行できるように設計されており、WebスクレイピングやAPI連携など、多岐にわたる用途で活躍します。

requestsライブラリの基本

requestsライブラリの最も基本的な使い方は、HTTPのGETリクエストを送信することです。これにより、指定したURLからWebページのHTMLコンテンツなどを取得できます。

GETリクエストの送信

GETリクエストを送信するには、requests.get()関数を使用します。この関数は、URLを引数として受け取り、Responseオブジェクトを返します。


import requests

url = 'https://example.com'
response = requests.get(url)

# レスポンスの内容を表示
print(response.text)

response.text属性には、取得したWebページのHTMLコンテンツが文字列として格納されます。また、response.content属性には、バイナリデータ(画像など)がバイト列として格納されます。

ステータスコードの確認

HTTPリクエストが成功したかどうかは、ステータスコードで確認できます。response.status_code属性でステータスコードを取得できます。


if response.status_code == 200:
    print("リクエストは成功しました。")
else:
    print(f"リクエストは失敗しました。ステータスコード: {response.status_code}")

一般的に、ステータスコード200は成功を意味します。その他の一般的なステータスコードとしては、404(Not Found)、500(Internal Server Error)などがあります。

ヘッダー情報の取得

レスポンスヘッダーには、サーバーからの追加情報が含まれています。response.headers属性で辞書形式でヘッダー情報を取得できます。


print(response.headers)
print(response.headers['Content-Type'])

requestsライブラリの応用機能

requestsライブラリは、基本的なGETリクエスト以外にも、様々なHTTPメソッドやオプションをサポートしており、より高度なWeb操作を可能にします。

POSTリクエスト

POSTリクエストは、サーバーにデータを送信する際に使用されます。例えば、フォームの送信やAPIへのデータ登録などに利用されます。requests.post()関数を使用し、data引数に送信したいデータを辞書形式で渡します。


payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=payload)
print(response.text)

JSON形式のデータを送信する場合は、json引数を使用します。


import json

payload = {'name': 'Alice', 'age': 30}
response = requests.post('https://httpbin.org/post', json=payload)
print(response.text)

その他のHTTPメソッド

requestsライブラリは、GET、POST以外にも、PUT、DELETE、HEAD、OPTIONSなどのHTTPメソッドに対応しています。それぞれのメソッドに対応する関数が用意されています。

  • requests.put(url, data=...)
  • requests.delete(url)
  • requests.head(url)
  • requests.options(url)

クエリパラメータの追加

URLにクエリパラメータを追加したい場合、params引数に辞書形式で渡すことができます。requestsライブラリが自動的にURLエンコードしてくれます。


payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=payload)
print(response.url) # 実際に送信されたURLを確認
print(response.text)

タイムアウトの設定

Webサーバーからの応答が遅い場合、リクエストが無限に待機してしまう可能性があります。timeout引数でタイムアウト時間を秒単位で指定できます。


try:
    response = requests.get('https://example.com', timeout=5) # 5秒でタイムアウト
    print("リクエスト成功")
except requests.exceptions.Timeout:
    print("タイムアウトしました")
except requests.exceptions.RequestException as e:
    print(f"エラーが発生しました: {e}")

認証

Basic認証やDigest認証など、HTTP認証が必要なWebサイトにアクセスする場合、auth引数を使用します。


# Basic認証
response = requests.get('https://httpbin.org/basic-auth/user/password', auth=('user', 'password'))

# Digest認証 (requires 'requests.auth.HTTPDigestAuth')
from requests.auth import HTTPDigestAuth
response = requests.get('https://httpbin.org/digest-auth/auth/user/password', auth=HTTPDigestAuth('user', 'password'))

セッション管理

複数のリクエストでクッキーや接続情報を共有したい場合は、requests.Sessionオブジェクトを使用します。


s = requests.Session()

# 最初のリクエスト(ログインなど)
s.get('https://example.com/login', data={'username': 'user', 'password': 'password'})

# 2回目以降のリクエストでは、前のリクエストで設定されたクッキーが自動的に送信される
response = s.get('https://example.com/profile')
print(response.text)

セッションオブジェクトを使用することで、ログイン状態を維持したり、リソースの再利用によるパフォーマンス向上を図ったりできます。

SSL証明書の検証

requestsライブラリは、デフォルトでSSL証明書の検証を行います。これにより、HTTPS接続の安全性を確保します。証明書の検証を無効にしたい場合は、verify=Falseを指定しますが、セキュリティリスクがあるため、信頼できるサイト以外では推奨されません。


# 証明書検証を無効にする(非推奨)
response = requests.get('https://example.com', verify=False)

カスタムヘッダーの設定

特定のユーザーエージェントを指定したり、APIキーを送信したりするために、カスタムヘッダーを設定できます。


headers = {'User-Agent': 'MyPythonScraper/1.0', 'Authorization': 'Bearer YOUR_API_KEY'}
response = requests.get('https://example.com', headers=headers)

エラーハンドリング

Webリクエストでは、ネットワークエラー、タイムアウト、サーバーエラーなど、様々なエラーが発生する可能性があります。try-exceptブロックを使用して、これらのエラーを適切に処理することが重要です。


try:
    response = requests.get('https://example.com/nonexistent-page')
    response.raise_for_status() # ステータスコードが4xxまたは5xxの場合にHTTPErrorを発生させる
    print("リクエスト成功")
except requests.exceptions.HTTPError as err:
    print(f"HTTPエラーが発生しました: {err}")
except requests.exceptions.ConnectionError as err:
    print(f"接続エラーが発生しました: {err}")
except requests.exceptions.Timeout as err:
    print(f"タイムアウトしました: {err}")
except requests.exceptions.RequestException as err:
    print(f"予期しないエラーが発生しました: {err}")

response.raise_for_status()メソッドは、リクエストが失敗した場合(ステータスコードが400番台または500番台の場合)にHTTPError例外を発生させる便利な機能です。

まとめ

requestsライブラリは、PythonでWebからデータを取得するための強力かつ使いやすいツールです。GET、POSTといった基本的なリクエストから、認証、セッション管理、エラーハンドリングまで、幅広い機能を提供しています。Webスクレイピング、APIクライアントの実装、Webアプリケーションのバックエンド開発など、様々な場面でrequestsライブラリを活用することで、効率的かつ堅牢なWeb連携処理を実装することが可能です。