こちらは、2025年のWebスクレイピング向けに、主要なPython HTTPクライアント、その機能、および最適なユースケースを概観したものです。
Requestsは最も広く使用されているPython HTTPクライアントで、週あたり3,000万回という驚異的なダウンロード数を誇ります。
以下は、さまざまなHTTPメソッドのテスト用にサンプルレスポンスを提供する httpbin.org を使用して、RequestsでHTTPリクエスト/レスポンスを処理する例です。
import requests
print("Testing `requests` library...")
resp = requests.get('https://httpbin.org/get', params={"foo": "bar"})
if resp.status_code == 200: # success
print(f"Response Text: {resp.text} (HTTP-{resp.status_code})")
else: # error
print(f"Error: HTTP-{resp.status_code}")requests.get(...) メソッドでは、クエリ文字列を手動で追加することなく、params 引数でURLパラメータを簡単に渡せます。
Requestsは、クエリ文字列のエンコード、JSONデータ処理、HTTPリダイレクトを自動的に処理します。また、組み込みのSSLサポートも提供します。内部的には低レベルのHTTP処理にurllib3を活用しつつ、より直感的なインターフェースを提供します。
セッション管理も強力な機能の1つで、複数のリクエスト間でCookie、ヘッダー、認証を維持できます。これは、Webスクレイピングで保護されたコンテンツにアクセスする際に不可欠です。
大きなレスポンスを効率良く処理するために、Requestsはストリーミング機能も提供します。
import requests
print("Testing `requests` library with streaming...")
resp = requests.get('https://httpbin.org/stream/10', stream=True)
for chunk in resp.iter_content(chunk_size=1024):
print(chunk.decode('utf-8'))Requestsにはいくつか制限があります。ネイティブの非同期機能とHTTP/2サポートがなく、後者についてはこの議論によると追加予定もありません。組み込みのキャッシュはありませんが、requests-cache のような拡張を使用できます。
Note: HTTP/2は、複数のリクエストを単一のTCP接続上で処理できる多重化などの機能により、HTTP/1.1を改善し、ページの読み込みを高速化します。
Requestsは、分かりやすい構文、自動コネクションプーリング、JSON処理、そして包括的なドキュメントにより、引き続き高い人気を保っています。
urllib3 はHTTPリクエストの堅牢な基盤として機能し、多くの他のHTTPクライアントを支えつつ、低レベルのHTTP機能へ直接アクセスできるようにします。
以下はurllib3を使った基本例です。
import urllib3
print("Testing `urllib3` library...")
http = urllib3.PoolManager() # PoolManager for connection pooling
resp = http.request('GET', 'https://httpbin.org/get', fields={"foo": "bar"})
if resp.status == 200: # success
print(f"Response: {resp.data.decode('utf-8')} (HTTP-{resp.status})")
else: # error
print(f"Error: HTTP-{resp.status}")urllib3.PoolManager() は再利用可能な接続プールを作成し、各リクエストごとに新しい接続を確立するオーバーヘッドを排除してパフォーマンスを向上させます。
urllib3はストリーミングレスポンスの処理に優れており、メモリを逼迫させずに大規模なデータセットを処理するのに最適です。また、自動リダイレクトとSSL接続もサポートします。
ただし、urllib3には組み込みの非同期機能、キャッシュ、セッション管理、HTTP/2サポートがありません。
urllib3のコネクションプーリング実装はRequestsより複雑ですが、スクリプト向けの構文は分かりやすく、よく整備されたドキュメントも提供しています。
セッション管理は不要だが、より強力な機能が必要な基本的なWebスクレイピングタスクにはurllib3をご検討ください。
Uplink は、クラスベースのインターフェースを通じてHTTPリクエストを扱う独自のアプローチを提供し、特にAPI中心のWebスクレイピングで有用です。
以下は、Uplinkを使ってAPIとやり取りする方法です。
import uplink
@uplink.json
class JSONPlaceholderAPI(uplink.Consumer):
@uplink.get("/posts/{post_id}")
def get_post(self, post_id):
pass
def demo_uplink():
print("Testing `uplink` library...")
api = JSONPlaceholderAPI(base_url="https://jsonplaceholder.typicode.com")
resp = api.get_post(post_id=1)
if resp.status_code == 200: # success
print(f"Response: {resp.json()} (HTTP-{resp.status_code})")
else: # error
print(f"Error:HTTP-{resp.status_code}")この例では、uplink.Consumer を継承した JSONPlaceholderAPI クラスを定義しています。@uplink.get デコレータは、エンドポイントパスに動的な post_id パラメータを含むHTTP GETリクエストを作成します。
UplinkはSSL接続と自動リダイレクトを処理します。また、独自の Bring Your Own HTTP Library 機能もサポートします。
このライブラリには、ストリーミングレスポンス、非同期リクエスト、キャッシュ(ただし requests-cache は使用可能)、HTTP/2の組み込みサポートがありません。
Uplinkは良いドキュメントを提供していますが、活発にはメンテナンスされていません(最終リリースは2022年3月の0.9.7です)。クラスベースのアプローチはオブジェクト指向の開発者には魅力的ですが、Pythonのスクリプトスタイルを好む方には直感的でない場合があります。
HTMLページではなく、RESTful APIエンドポイントが主対象のスクレイピングではUplinkを選択してください。
GRequests は、人気のRequestsライブラリを非同期機能で拡張し、複数ソースからの同時データ取得を可能にします。
以下はGRequestsの動作例です。
import grequests
print("Testing `grequests` library...")
# Fetching data from multiple URLs
urls = [
'https://www.python.org/',
'http://httpbin.org/get',
'http://httpbin.org/ip',
]
responses = grequests.map((grequests.get(url) for url in urls))
for resp in responses:
print(f"Response for: {resp.url} ==> HTTP-{resp.status_code}")このコードは grequests.map(...) を使用して3つの同時GETリクエストを送信し、レスポンスを収集します。GRequestsは gevent を活用し、複雑な同時実行管理を必要とせずに非同期処理を実現します。
GRequestsは自動リダイレクト、SSL接続、ストリーミングレスポンスをサポートします。HTTP/2の組み込みサポートとキャッシュはありませんが(requests-cache は使用可能です)。
Requestsに似た直感的なAPIで非同期リクエストを簡素化し、複雑なasync/awaitパターンの必要性を減らします。ただし、コードベースが小さい(0.7.0で213行)ことと開発活動が限定的であることから、ドキュメントは最小限です。
最小限の複雑さで複数ソースから同時にデータを収集する必要がある場合は、GRequestsをご検討ください。
HTTPX は、Python HTTPクライアントの現代的な進化形で、Requestsの置き換えとして設計され、非同期サポートの追加とパフォーマンス改善を提供します。
以下はHTTPXの非同期機能の例です。
import httpx
import asyncio
async def fetch_posts():
async with httpx.AsyncClient() as client:
response = await client.get('https://jsonplaceholder.typicode.com/posts')
return response.json()
async def httpx_demo():
print("Testing `httpx` library...")
posts = await fetch_posts()
for idx, post in enumerate(posts):
print(f"Post #{idx+1}: {post['title']}")
# async entry point to execute the code
asyncio.run(httpx_demo())このコードは、httpx.AsyncClient() を使用してAPIからデータを取得する非同期関数 fetch_posts() を定義します。httpx_demo() 関数は結果をawaitして処理します。
HTTPXは組み込みのHTTP/2サポートが際立っており、単一接続で複数リソースをより高速に読み込めます。また、Webスクレイピング中のブラウザフィンガープリントをより困難にします。
HTTPXでHTTP/2を使用するには次のとおりです。
import httpx
client = httpx.Client(http2=True)
response = client.get("https://http2.github.io/")
print(response)HTTP/2サポートには追加のインストールが必要な点にご注意ください。
pip install httpx[http2]HTTPXは、大きなレスポンスを効率良く処理するための優れたストリーミングサポートも提供します。
with httpx.stream("GET", "https://httpbin.org/stream/10") as resp:
for text in resp.iter_text():
print(text)HTTPXには組み込みのキャッシュはありませんが、Hishel を統合できます。
Requestsとは異なり、HTTPXはデフォルトではリダイレクトに追従しませんが、設定で有効化できます。
import httpx
# test http --> https redirect
response = httpx.get('http://github.com/', follow_redirects=True)非同期機能により複雑さが増す面はあるものの、HTTPXは同期/非同期の両方に対してシンプルなメソッドを提供します。包括的なドキュメントと活発なコミュニティに支えられ、人気は引き続き高まっています。
HTTPXは、非同期機能を備えた多機能なHTTPクライアントを必要とするプロジェクトに最適です。
aiohttp は非同期プログラミングに特化しており、同時接続かつノンブロッキングなリクエストが求められる高性能なWebスクレイピングのシナリオで優れています。
以下はaiohttpを使った同時スクレイピングの方法です。
import asyncio
import aiohttp
async def fetch_data(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def demo_aiohttp():
print("Testing `aiohttp` library...")
urls = [
'https://www.python.org/',
'http://httpbin.org/get',
'http://httpbin.org/ip',
]
tasks = [fetch_data(url) for url in urls]
responses = await asyncio.gather(*tasks)
for resp_text in responses:
print(f"Response: {resp_text}")
# async entry point to execute the code
asyncio.run(demo_aiohttp())このコードは、セッションを確立してGETリクエストを送る非同期関数 fetch_data() を作成します。demo_aiohttp() 関数は複数URLのタスクを作成し、asyncio.gather() を使用して同時実行します。
aiohttpはHTTPリダイレクトを自動処理し、大きなファイルを処理する際の効率的なメモリ管理のためにストリーミングレスポンスもサポートします。また、幅広いサードパーティ製ミドルウェアと拡張機能も提供します。
さらに、aiohttpは開発サーバーとして機能させることもできますが、この記事ではクライアント機能に焦点を当てています。
このライブラリにはHTTP/2サポートと組み込みキャッシュがありませんが、aiohttp-client-cache のようなライブラリでキャッシュを追加できます。
aiohttpは非同期である性質上、Requestsのようなシンプルなクライアントより複雑で、非同期プログラミングの十分な理解が必要です。しかし、GitHub starsが14.7Kと人気が高く、多数のサードパーティ拡張があります。包括的なドキュメントも提供しています。
株価の監視やライブイベントの追跡といったリアルタイムのデータスクレイピングタスクでは、aiohttpを選択してください。
主要なPython HTTPクライアントを手早く把握するには、次の表をご覧ください。
| Requests | urllib3 | Uplink | GRequests | HTTPX | aiohttp | |
|---|---|---|---|---|---|---|
| 使いやすさ | 簡単 | 簡単〜中程度 | 中程度 | 簡単 | 中程度 | 中程度 |
| 自動リダイレクト | はい | はい | はい | はい | 有効化が必要 | はい |
| SSLサポート | はい | はい | はい | はい | はい | はい |
| 非同期機能 | いいえ | いいえ | いいえ | はい | はい | はい |
| ストリーミングレスポンス | はい | はい | いいえ | はい | はい | はい |
| HTTP/2サポート | いいえ | いいえ | いいえ | いいえ | はい | いいえ |
| キャッシュサポート | Via: requests-cache |
いいえ | Via:requests-cache |
Via:requests-cache |
Via: Hishel |
Via: aiohttp-client-cache |
このレビューで取り上げた各HTTPクライアントには、それぞれ独自の利点があります。Requests、Uplink、GRequestsはシンプルさを提供し、Requestsが最も高い人気を維持しています。一方で、aiohttpとHTTPXは非同期機能により引き続き注目を集めています。どの選択肢がプロジェクトに最適かは、具体的な要件によって決まります。
効果的なWebスクレイピングには、HTTPクライアントの選定以上のものが必要です。アンチボット対策を回避する戦略や、プロキシの管理が求められます。Bright Dataは、Web Scraper IDE のようなツールにより、既製のJavaScript関数とテンプレートを提供し、さらにCAPTCHAやアンチボット対策を回避する Web Unlocker も提供して、Webスクレイピングを簡素化します。
今すぐ無料トライアルを開始して、Bright Dataが提供するすべてを体験してください。
