Python Requestsライブラリの完全ガイド

Python RequestsライブラリをWebスクレイピングに使用する方法を学びましょう。ここではインストール、HTTPメソッド、サーバーレスポンスについて説明しています。
7 min read
Guide to the Python Requests Library blog image

この総合ガイドでは次のトピックについて説明します:

  • requestsの概要、インストール方法、なぜ最も人気のあるPython HTTPクライアントライブラリなのか。
  • RequestsをさまざまなHTTPメソッドで使用する方法。
  • サーバーのレスポンスを処理するためにRequestsが提供するもの。
  • どのRequestsカスタマイズがサポートされているか。
  • Python requestsライブラリでカバーされている高度なシナリオ

さっそく始めましょう!

Requestsライブラリの紹介

Requestsの概要、インストール方法、使用タイミング、提供内容をご覧ください。

定義

Requests はPython用のエレガントでシンプルなHTTPライブラリです。具体的には、HTTPリクエストの作成とレスポンスの処理を、簡単かつ人間が読める方法で行うための直感的なAPIが提供されています。GitHubでは5万個以上のスターが付いており、毎日何百万回もダウンロードされているRequestsは、Pythonで最も人気のあるHTTPクライアントです。

このライブラリが提供する主な機能には、すべてのHTTPメソッド、応答処理、要求のカスタマイズ、認証、SSL 証明書管理などを網羅する包括的なAPIがあります。さらに、Python RequestsモジュールはHTTP/1.1を初期状態でサポートしています。

セットアップ

Requestsをインストールする最も簡単でお勧めの方法はpipを使用することです。特に、Requestsライブラリに関連付けられているpipパッケージはrequestsです。そのため、次のコマンドでHTTPクライアントをインストールできます:

pip install requests

Pythonスクリプトでrequestsを使用するには、以下の行でインポートしてください:

import requests

完了です!これでRequestsパッケージがインストールされ、使用できる状態になりました。

ユースケース

Python requestsライブラリの主な使用例は次のとおりです。

  • WebサーバーへのHTTPリクエストの実行:GETリクエストを送信してWebサーバーからデータを取得します。
  • APIの利用:APIエンドポイントにリクエストを送信してそのレスポンスを処理し、さまざまなWebサービスとやり取りし、それらのデータにアクセスします。
  • Webスクレイピング:Webページに関連付けられたHTMLドキュメントを取得します。これらのドキュメントは、BeautifulSoup などのライブラリを使用して解析し、特定の情報を抽出できます。詳細については、「PythonのWebスクレイピングガイド」をご覧ください。
  • Webアプリケーションのテスト:HTTPリクエストをシミュレートしてレスポンスを検証し、テストプロセスを自動化してWebサービスが適切に機能することを確認します。
  • ファイルのダウンロード:HTTPGETリクエストを各URLに送信して、画像、ドキュメント、その他のメディアファイルなどのファイルをWebサーバーから取得します。

メソッド

次の表のrequestsライブラリによって公開されているパブリックメソッドをご覧ください:

メソッド 説明
requests.request() 指定されたメソッドで、カスタムHTTPリクエストを指定されたURLに送信します
requests.get() GETリクエストを指定されたURLに送信します
requests.post() POSTリクエストを指定されたURLに送信します
requests.put() PUTリクエストを指定されたURLに送信します
requests.patch() PATCHリクエストを指定されたURLに送信します
requests.delete() DELETEリクエストを指定されたURLに送信します
requests.head() HEADリクエストを指定されたURLに送信します

ご覧のとおり、これらは最も有用なHTTPリクエストメソッドを網羅しています。使用方法の詳細については、「公式APIドキュメント」を参照してください。

これらの実際の仕事ぶりを見てみましょう!

HTTPメソッド

HTTPのGETPOSTPUTDELETE、およびHEADメソッドを扱いながら、Python requestsライブラリの実際の動作を見てみましょう。

GET

HTTPでは、GET メソッドを使用してサーバーから特定のリソースをリクエストします。これは、requests.get()を使用してHTTP GETリクエストを作成する方法です:

import requests

# send a GET request to the specified URL

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

同様に、requests.request()を使用しても、以下のように同じ結果を得られます:

import requests

response = requests.request('GET', 'https://api.example.com/data')

この場合、使用するHTTPメソッドを、追加の文字列変数で手動で指定する必要があります。

POST

HTTP POSTメソッドは、データをサーバーに送信してさらに処理するために使用されます。requests.post()を使用してPOSTリクエストを作成する方法は次の通りです:

import requests

# data to be sent in the POST request

product = {

'name': 'Limitor 500',

'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',

'price': 199.99,

'manufacturer': 'TechCorp Inc.',

'category': 'Electronics',

'availability': 'In Stock'

}

# send a POST request to the specified URL

response = requests.post('https://api.example.com/product', data=product)

GETリクエストのときとは異なり、この場合はサーバーに送信するデータをdataオプションを使用して指定することも必要です。requestsは、このデータをHTTPリクエストのボディに追加します。

JSONボディの場合は、データオブジェクトをdataの代わりにjsonオプションに渡してください:

response = requests.post('https://api.example.com/product', json=product)

同様に、次のようにrequest.request()を使用して同じリクエストを実行できます:

import requests

product = {

'name': 'Limitor 500',

'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',

'price': 199.99,

'manufacturer': 'TechCorp Inc.',

'category': 'Electronics',

'availability': 'In Stock'

}

response = requests.request('POST', 'https://api.example.com/product', data=product)

PUT

PUT メソッドは、サーバー上のリソースの更新または置換に使用されます。Python requestsモジュールでPUTリクエストを送信するのは簡単で、POSTリクエストと同様のパターンに従います。変更点は、使用するメソッドがrequests.put()であることです。また、requests.request()内のHTTPメソッド文字列は'PUT'になります。

PATCH

PATCH メソッドは、オンラインリソースに部分的な変更を適用するために使用されます。PUTリクエストの場合と同様、Python requestsライブラリでのPATCHリクエストの送信プロセスはPOSTリクエストに似ています。変更点は、使用するメソッドがrequests.patch()で、requests.request()内のHTTPメソッド文字列が'PATCH'であることです。

DELETE

DELETE メソッドは、指定されたURIにより識別されるリソースを削除するために使われます。delete()メソッドを使用してrequestsでHTTPDELETEリクエストを作成する方法は次の通りです:

import requests

# send a DELETE request for the product with id = 75

response = requests.delete('https://api.example.com/products/75')

同様に、requests.request()を使用してDELETEリクエストを実行できます:

import requests

response = requests.request('DELETE', 'https://api.example.com/products/75')

HEAD

HEAD メソッドはGETと似ていますが、実際のボディコンテンツはリクエストせず、レスポンスのヘッダーのみをリクエストします。そのため、HEADリクエストに対してサーバーから返されるレスポンスはGETリクエストのレスポンスと同格ですが、ボディデータはありません。

requests.head()を使用してPythonでHTTP HEADリクエストを実行してください:

import requests

# send a HEAD request to the specified URL

response = requests.head('https://api.example.com/resource')

同じ方法で、requests.request()を使用してHEADリクエストを実行できます:

import requests

response = requests.request('HEAD', 'https://api.example.com/resource')

Requestsからのレスポンスオブジェクトの分解

requestsを使ってHTTPリクエストを行う方法がわかったところで、今度はレスポンスオブジェクトの処理方法を見てみましょう。

レスポンスオブジェクト

HTTPリクエストを行った後、requestsはサーバーからレスポンスを受け取り、それを特別なレスポンスオブジェクトにマッピングします。

以下のPython requestsの例をご覧ください:

import requests

response = requests.get('http://lumtest.com/myip.json')

print(response)

これにより、以下が返されます:

<Response [200]>

responseレスポンスオブジェクトで、いくつかの便利なメソッドとプロパティを公開しています。次のセクションで最も重要なものについて説明します。

警告requestsは常にレスポンスを返すとは限りません。エラー(URLが無効であるなど)が発生した場合は、RequestExceptionが発生します。以下のロジックでこの例外を防止してください:

try:

response = requests.get('http://lumtest.com/myip.json')

# handle the response

except requests.exceptions.RequestException as e:

print('An error occurred during the request:', e)

ステータスコード

HTTPの場合、レスポンスステータスコードは、リクエストの成功、失敗、またはその他の状態を示すためにサーバーから返される標準化された値です。これらのステータスコードは、リクエストが成功したか、失敗した場合は何が問題だったかを即座にフィードバックしてくれるので、非常に重要です。

これらは特にエラー処理に役立ち、クライアントがさまざまなタイプのエラーを適切に識別して処理できるようになります。たとえば、4xxステータスコードはクライアント側のエラー(無効なリクエストなど)を示し、5xxステータスコードはサーバー側のエラーを示します。

requestsライブラリを使用してPythonでレスポンスを処理するには、通常、ステータスコードの制御が最初のステップです。リクエストを行った後は、必ずレスポンスのステータスコードを確認して、リクエストが成功したかどうかを判断する必要があります。レスポンスオブジェクトのstatus_code属性を使用してステータスコードにアクセスします:

response.status_code # 200

受け取ったステータスコードに応じて、条件付き命令を使用してさまざまなシナリオを適切に処理する必要があります:

import requests

response = requests.get('http://lumtest.com/myip.json')

# check if the request was successful (status code 200)

if response.status_code == 200:

print('Successful request!')

# handle the response...

elif response.status_code == 404:

print('Resource not found!')

else:

print(f'Request failed with status code: {response.status_code}')

ほとんどのシナリオでは、成功したリクエストとエラーレスポンスを区別するだけで済みます。カスタム__bool()__オーバーロードのおかげで、requestsはそのプロセスを簡略化できます。具体的には、レスポンスオブジェクトを条件式で直接使用できます。ステータスコードが200399の間の場合はTrueと評価され、それ以外の場合はFalseと評価されます。

言い換えれば、成功したリクエストの結果は次のロジックで確認できます:

if response:

print('Successful request!')

# handle the response...

else:

print(f'Request failed with status code: {response.status_code}')

レスポンスヘッダー

headers属性を使用してサーバーレスポンスのヘッダーにアクセスします:

import requests

response = requests.get('http://lumtest.com/myip.json')

response_headers = response.headers

print(response_headers)

これは次のように出力されます:

{'Server': 'nginx', 'Date': 'Thu, 09 May 2024 12:51:08 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '279', 'Connection': 'keep-alive', 'Cache-Control': 'no-store', 'Access-Control-Allow-Origin': '*'}

ご覧のとおり、response.headersはディクショナリに似たオブジェクトを返します。つまり、ヘッダー値にはキーでアクセスできます。たとえば、レスポンスのContent-Typeヘッダーにアクセスしたいとします。以下がその方法です:

response_headers['Content-Type'] # 'application/json; charset=utf-8'

HTTPの仕様ではヘッダーは大文字と小文字を区別しないため、requestsを使用すれば、ヘッダーの大文字と小文字を気にせずにアクセスできます:

response_headers['content-type'] # 'application/json; charset=utf-8'

レスポンスコンテンツ

requestsには、レスポンスのペイロードにアクセスするためのさまざまな属性とメソッドが用意されています。

  • response.content:レスポンスの内容をバイト単位で返します。
  • response.text:レスポンスの内容をUnicodeの文字列として返します。
  • response.json():JSONエンコードされたレスポンスのコンテンツをディクショナリに返します。

次の例で実際の動作を確認してください:

import requests

response = requests.get('http://lumtest.com/myip.json')

# access the response as bytes

response_bytes = response.content

print(type(response_bytes))

print(response_bytes)

print()

# retrieve the response as text

response_text = response.text

print(type(response_text))

print(response_text)

print()

# retrieve the response as a JSON-encoded dictionary

response_json = response.json()

print(type(response_json))

print(response_json)

print()

http://lumtest.com/myip.jsonは呼び出し元のIPに関する情報を返す特別なエンドポイントです。上記のスニペットの結果は次のようになります:

<class 'bytes'>

b'{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}'

<class 'str'>

{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}

<class 'dict'>

{'ip': '45.85.135.110', 'country': 'US', 'asn': {'asnum': 62240, 'org_name': 'Clouvider Limited'}, 'geo': {'city': 'Ashburn', 'region': 'VA', 'region_name': 'Virginia', 'postal_code': '20149', 'latitude': 39.0469, 'longitude': -77.4903, 'tz': 'America/New_York', 'lum_city': 'ashburn', 'lum_region': 'va'}}

3つの異なるレスポンス形式に注意してください。ディクショナリとしてのresponse.json()は、データアクセスを簡略化するので特に便利です:

response_json['country'] # 'US'

詳細は、「PythonでJSONを解析する方法」に関するガイドをご覧ください。

レスポンスクッキー

HTTPクッキーはヘッダーを介して定義されますが、レスポンスオブジェクトはそれらを処理するための特別なクッキー属性を提供します。これにより、サーバーが送り返したクッキーを含むhttp.cookiejarオブジェクトが返されます。

Python requestsライブラリのレスポンスオブジェクトからクッキーにアクセスする方法を示す以下の例をご覧ください:

import requests

# define the login credentials

credentials = {

'username': 'example_user',

'password': 'example_password'

}

# send a POST request to the login endpoint

response = requests.post('https://www.example.com/login', data=credentials)

# access the cookies set by the server

cookies = response.cookies

# print the cookies received from the server

for cookie in cookies:

print(cookie.name, ':', cookie.value)

上記のサンプルスニペットは次のような内容を生成することがあります:

session_id : be400765483cf840dfbbd39

user_id : 7164

expires : Sat, 01 Jan 2025 14:30:00 GMT

Python Requestsライブラリによるリクエストのカスタマイズ

HTTPリクエストには、多くの場合、特殊なフィルタリングパラメーターとカスタムヘッダーが含まれます。requestsでそれらを指定する方法を見てみましょう。

クエリ文字列パラメーター

クエリパラメーターはURLパラメーターとも呼ばれ、HTTPリクエストのURLの末尾に追加される追加パラメーターです。これらは通常、データのフィルタリング方法やレスポンスのカスタマイズ方法など、リクエストに関する追加情報をサーバーに提供します。

次のURLをご覧ください:

https://api.example.com/data?key1=value1&key2=value2

この例では、?key1=value1&key2=value2はクエリ文字列で、key1key2はクエリパラメータです。

クエリ文字列が?で始まり、等号(=)で区切られ、 &で連結されたキーと値のペアで構成されています。Pythonコードでこのクエリ文字列をプログラミング的に指定するのは、特にオプションパラメータを扱う場合、必ずしも簡単ではありません。これがrequestsparamsオプションを提供している理由です:

import requests

# define query parameters as a dictionary

params = {

'page': 1,

'limit': 10,

'category': 'electronics'

}

# send a GET request to the following URL:

# 'https://api.example.com/products?page=1&limit=10&category=electronics'

response = requests.get('https://api.example.com/products', params=params)

同様に、パラメーターをタプルのリストとしてrequestsに渡すことができます:

import requests

# define query parameters as a list of tuples

params = [

('page', '1'),

('limit', '10'),

('category', 'electronics')

]

response = requests.get('https://api.example.com/products', params=params)

またはバイト文字列として渡します:

import requests

# define query parameters as a bytes string

params = b'page=1&limit=10&category=electronics'

response = requests.get('https://api.example.com/products', params=params)

リクエストヘッダー

リクエスト内のHTTPリクエストのヘッダーをカスタマイズするには、それらをディクショナリとしてheadersオプションに渡します。たとえば、次のようにrequestsにカスタムUser-Agent文字列を設定できます:

import requests

# define custom headers

custom_headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',

# other headers...

}

# send a GET request with custom headers

response = requests.get('https://api.example.com/data', headers=custom_headers)

クッキーのリクエスト

HTTPクッキーはヘッダーを介してサーバーに送信されますが、requestsには、それらをカスタマイズするためのクッキー専用オプションが用意されています。次の例のように使用してください:

# define custom cookies

custom_cookies = {

'session_id': 'be400765483cf840dfbbd39',

'user_id': '7164'

}

# send a GET request with custom cookies

response = requests.get('https://www.example.com', cookies=custom_cookies)

クッキーはディクショナリまたはhttp.cookiejarオブジェクトを使用することに注意してください。

その他の構成

requestsには豊富なAPIが用意されており、高度なテクニックも多数用意されています。最も関連性の高いものをいくつかご紹介します!

プロキシ設定

プロキシとrequestsを統合することで、HTTPリクエストをプロキシサーバー経由でルーティングできます。これは、IPアドレスを隠したり、レート制限を回避したり、地理的に制限されたコンテンツにアクセスしたりするための強力なメカニズムです。

プロキシオプションを使用すると、プロキシサーバーをPython requestsライブラリと統合できます:

import requests

# define the proxy settings

proxy = {

'http': 'http://username:[email protected]:8080',

'https': 'https://username:[email protected]:8080'

}

# Make a request using the proxy

response = requests.get('https://www.example.com', proxies=proxy)

完全なチュートリアルについては、「Python Requestsとプロキシを使用する」のガイドに従ってください。

Basic認証

HTTP認証は、「Basic認証」として知られる、HTTP プロトコルに組み込まれているシンプルな認証スキームです。これには、Base64フォーマットでエンコードされたユーザー名とパスワードをAuthorizationヘッダーに送信する必要があります。

Authorizationヘッダーを手動で設定して実装することもできますが、requestsではauth専用オプションを公開しています。ユーザー名とパスワードを備えたタプルを使用できます。Python requestsライブラリでBasic認証を扱うときに使います:

import requests

# define the username and password for basic authentication

username = 'sample_username'

password = 'sample_password'

# send a GET request with basic authentication

response = requests.get('https://api.example.com/private/users', auth=(username, password))

SSL証明書の検証

SSL証明書の検証は、インターネットを介したクライアントとサーバー間の安全な通信を確保するために不可欠です。同時に、送信先サーバーが信頼できるため検証を実施する必要がない場合もあります。

特に、HTTPトラフィックをプロキシサーバー経由でルーティングする場合、SSL証明書に関連するエラーが発生する可能性があります。この場合、SSL証明書の検証を無効にする必要があるかもしれません。requestsでは、これはverify オプションで可能です:

import requests

# send a GET request to a website with SSL certificate verification disabled

response = requests.get('https://api.example.com/data', verify=False)

タイムアウト

デフォルトでは、requestsはサーバーがレスポンスするまで自動的に無期限に待機します。サーバーに過負荷がかかったり、ネットワークが遅くなったりすると、この動作が問題になる可能性があります。

来るか分からないレスポンスを待つ間にアプリケーションが遅くなるのを避けるため、requestsにはtimeout オプションがあります。レスポンスを待つ秒数を整数または浮動小数点数で指定できます:

import requests

# timeout after 2 second

response1 = requests.get("https://api.example.com/data", timeout=2)

あるいは、timeoutには、接続タイムアウトと読み取りタイムアウトの2つの要素を持つタプルを使用できます。次の例のように指定します:

import requests

# timeout after 2.5 seconds for connections and 4 seconds for reading response

response = requests.get("https://api.example.com/data", timeout=(2.5, 4))

リクエストが指定された接続タイムアウト内に接続を確立し、読み取りタイムアウト内にデータを受信した場合、レスポンスは通常どおり返されます。リクエストがタイムアウトすると、Timeout例外が発生します:

import requests

from requests.exceptions import Timeout

try:

response = requests.get("https://api.example.com/data", timeout=(2.5, 4))

except Timeout:

print("The request timed out")

まとめ

この記事では、requestsライブラリについて掘り下げ、その概要やメソッド、使用方法などを理解しました。Python requestsモジュールは、いくつかのユースケースをカバーする便利で一般的なHTTPライブラリであることがお分かりいただけたと思います。

問題は、すべてのHTTPリクエストでパブリックIPが公開されてしまうことです。これは素性や居住地の情報を提供するものであり、プライバシーの観点から好ましくないことです。IPアドレスを隠す方法はいくつかありますが、セキュリティとプライバシーを強化する最も効果的な方法は、プロキシサーバーを使用することです。

Bright Dataは世界最高レベルのプロキシサーバーを保有しており、フォーチュン500企業を含む20,000社以上の顧客にサービスを提供しています。Bright Dataは次のような様々な種類のプロキシを提供しています:

クレジットカードは必要ありません