このチュートリアルでは次のトピックについて説明します:
- User-Agentヘッダーを設定する必要がある理由
- デフォルトのPython
requests
ユーザーエージェント - Requestsでユーザーエージェントを変更および設定解除する方法
- Pythonでユーザーエージェントのローテーションを実装する方法
さっそく始めましょう!
User-Agentヘッダーを常に設定する必要がある理由
HTTP User-Agentヘッダーは、リクエストを行うクライアントソフトウェアを識別するために、ブラウザ、Webリクエストを実行するアプリケーション、HTTPクライアントによって設定されます。この値には通常、リクエストの元となったブラウザまたはアプリケーションの種類、オペレーティングシステム、アーキテクチャに関する詳細が含まれます。
たとえば、この記事の執筆時点でWebページにアクセスしたときにChromeにより設定されたユーザーエージェントは次のとおりです:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
このユーザーエージェントの構成要素は次のとおりです。
Mozilla/5.0:
以前はMozillaブラウザとの互換性を示すために使用されていました。現在では、互換性上の理由からユーザーエージェントに追加される共通のプレフィックスになりました。Windows NT 10.0; Win64; x64
:オペレーティングシステム(Windows NT 10.0
)、プラットフォーム(Win64
)、アーキテクチャ(x64)。AppleWebKit/537.36
:リクエストを行っているChromeのバージョンで使用されているブラウザエンジン。KHTML(Geckoなど)
:Mozillaが使用しているKHTML エンジンおよびGeckoレイアウトエンジンとの互換性。
Chrome/125.0.0.0
:ブラウザ名とそのバージョン。Safari/537.36
:Safariとの互換性。
簡単に言えば、ユーザーエージェントは、リクエストが知名度の高いブラウザから送信されたのか、別の種類のソフトウェアから送信されたのかを識別するために非常に重要です。
スクレイピングボットは、デフォルトまたは一貫性のないユーザーエージェント文字列を使用する傾向があり、自動化されていることが明らかになっています。そのため、スクレイピング対策ソリューションはUser-Agent
ヘッダーを見て、現在のユーザーが正規のユーザーかボットかを判断することで、Webページ上のデータを保護します。
詳細は、「WebスクレイピングにおけるUser-Agent」に関するガイドをご覧ください。
Pythonユーザーエージェントのデフォルトリクエストとは
ほとんどのHTTPクライアントと同様に、RequestsはHTTPリクエストを行う際にUser-Agent
ヘッダーを設定します。特に、requests
で設定されたデフォルトのユーザーエージェントは以下の形式に従います:
python-requests/X.Y.Z
ここでのX.Y.Z
は、プロジェクトにインストールされているrequests
パッケージのバージョンです。
httpbin.io /user-agent
エンドポイントにGETリクエストを送信して、上記の文字列が実際にRequestsユーザーエージェントであることを確認してください。このAPIは、受信リクエストから読み込まれたUser-Agent
ヘッダーを返します。つまり、HTTPクライアントによって自動的に設定されたユーザーエージェントを確認することができます。
requests
をインポートし、そのget()メソッドを使用して目的のHTTPリクエストを実行します:
import requests
# make an HTTP GET request to the specified URL
response = requests.get('https://httpbin.io/user-agent')
# parse the API response as JSON and print it
print(response.json())
上記のPythonスニペットを実行すると、次のような結果が得られます:
{'user-agent': 'python-requests/2.32.3'}
ユーザーエージェントはpython-requests/2.32.3
です。これにより、リクエストがrequests
ライブラリから送信されたことが明確にわかります。その結果、ボット対策システムは、このようなリクエストを人間のユーザーから発信されていないものとしてマークし、すぐにブロックできます。これが、Python Requestsユーザーエージェント値を変更することが非常に重要である理由です。
詳細については、「Python Requestsライブラリガイド」完全版をご覧ください。
Python Requestsユーザーエージェントを変更する方法
リクエストのUser-Agent
ヘッダーの値を変更および設定解除する方法を見てみましょう。
カスタムユーザーエージェントの設定
Requestsには、ユーザーエージェント値を設定するための直接のオプションはありません。同時に、User-Agent
はひとつのHTTPヘッダーに過ぎません。そのため、次のようにheaders
オプションを使用すると、他のHTTPヘッダーと同様に値をカスタマイズできます:
import requests
# custom user agent header
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
# make an HTTP GET request to the specified URL
# setting custom headers
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# parse the API response as JSON and print it
print(response.json())
もう一度上記のPythonスニペットを実行すると、今度は次のように出力されます:
{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}
素晴らしい!Python Requestsカスタムユーザーエージェントを設定するには、次のことを実行する必要があると学びました:
- user-agentプロパティを使用して
Pythonディクショナリ
を定義します。 - HTTPリクエストの作成に使用している
requests
メソッドのheaders
パラメーターにディクショナリを渡します。
HTTPヘッダー名では大文字と小文字が区別されないため、ヘッダーディクショナリのプロパティ名は好きな形式にできることをお忘れなく。
注:このアプローチはrequest()
、post()
、patch()
、put()
、delete()
、head()
でも機能します。
グローバルrequests
ユーザーエージェントを設定するには、次のようにカスタムHTTPセッションを設定する必要があります:
import requests
# initialize an HTTP session
session = requests.Session()
# set a custom header in the session
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
# perform a GET request within the HTTP session
response = session.get('https://httpbin.io/user-agent')
# print the data returned by the API
print(response.json())
# other requests with a custom user agent within the session ...
これにより、以前と同じ出力が生成されます。リクエストのHTTPセッションに不慣れな場合は、ドキュメントを参照してください。
ユーザーエージェントの設定解除
ユーザーエージェントを設定せずにHTTPリクエストを行うのは、ボット対策ソリューションをすぐに発動させてしまう不適切な習慣です。ただし、User-Agent
ヘッダーを削除する必要があるケースがあります。
Requestsのユーザーエージェント設定を解除する方法として最初に思いつくのは、User-Agent
ヘッダーをNone
に設定することかもしれません:
import requests
# custom user agent header
headers = {
'user-agent': None
}
# make an HTTP GET request to the specified URL
# setting custom headers
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# parse the API response as JSON and print it
print(response.json())
requests
はバックグラウンドでurllib3
を使用しているため、これは機能しません。したがって、デフォルトはurllib3
ユーザーエージェント値になります:
python-urllib3/2.2.1
詳しく説明すると、/user-agent
エンドポイントは次のようなものを返します:あいtお
{'user-agent': 'python-urllib3/2.2.1'}
その代わりにすべきことは、urllib3.util.SKIP_HEADER
を使用してデフォルトのユーザーエージェント値をスキップするようにurllib3
を設定することです。受信リクエストのHTTPヘッダーを返すhttpbin.ioの/
headers
エンドポイントをターゲットにして、ユーザーエージェントが設定解除されていることを確認します:
import requests
import urllib3
# exclude the default user agent value
headers = {
'user-agent': urllib3.util.SKIP_HEADER
}
# prepare the HTTP request to make
req = requests.Request('GET', 'https://httpbin.io/headers')
prepared_request = req.prepare()
# set the custom headers with no user agent
prepared_request.headers = headers
# create a requests session and perform
# the request
session = requests.Session()
response = session.send(prepared_request)
# print the returned data
print(response.json())
上記のPythonコードを実行すると、次のメッセージが表示されます:
{'headers': {'Accept-Encoding': ['identity'], 'Host': ['httpbin.io']}}
できました!予想どおり、Python Requestsのユーザーエージェントがありません。
Requestsにユーザーエージェントローテーションを実装する
デフォルトのUser-Agent
ヘッダーを実際のブラウザから適切な値に変更するだけでは不十分な場合があります。同じユーザーエージェントを使用して同じIPアドレスから多数のリクエストを行うと、ボット対策テクノロジーから疑われる可能性があります。こうしたシステムは、自動リクエストが通常規則的なパターンに従うことを認識して、すべての受信リクエストを監視しています。
ボット検出を回避する鍵は、リクエストをランダム化することです。それぞれのリクエストを異なるものにする賢い方法は、ユーザーエージェントローテーションです。この手法の基礎となるアイデアは、HTTPクライアントが使用するユーザーエージェントヘッダーを変更し続けることです。これにより、自動リクエストを別のブラウザからのものとして表示して、ブロックや一時的なアクセス制限が発生するリスクを減らすことができます。
では、以下の手順に従ってリクエストにユーザーエージェントのローテーションを実装してみましょう。
ステップ1:有効なユーザーエージェントのリストを取得する
User Agent String.comなどのWebサイトから適切なユーザーエージェントのリストを収集し、それをPython配列に保存してください:
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# other user agents...
]
ステップ2:ランダムユーザーエージェントを抽出する
random.choice()
を使用して配列からユーザーエージェント文字列をランダムに抽出します:
random_user_agent = random.choice(user_agents)
上記の行には次のインポートが必要であることに注意してください:
import random
ステップ3:ランダムユーザーエージェントを設定し、HTTPリクエストを行う
ランダムなユーザーエージェントを使用してヘッダーディクショナリを定義し、それをrequests
のリクエストで使用してください:
headers = {
'user-agent': random_user_agent
}
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
これらの命令には次のインポートが必要です:
import requests
ステップ4:仕上げ
Python Requestsユーザーエージェントのローテーションロジックは次のようになります:
import random
import requests
# list of user agents
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# other user agents...
]
# pick a random user agent from the list
random_user_agent = random.choice(user_agents)
# set the random user agent
headers = {
'user-agent': random_user_agent
}
# perform a GET request to the specified URL
# and print the response data
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
このスクリプトを数回実行すると、異なるユーザーエージェント文字列が表示されます。
ほら、このとおり!これでRequests Pythonユーザーエージェント値の設定をマスターできました。
まとめ
このガイドでは、User-Agent
ヘッダーを設定することの重要性と、そのrequests
での設定方法を学習しました。そうすれば、基本的なボット対策システムを欺いて、正規のブラウザからのリクエストだと勘違いさせることができます。ただし、高度なソリューションは、これらも検出してブロックできる場合があります。IPアドレス制限を防ぐには、プロキシとrequests
を併用することもできますが、それでも十分ではないかもしれません。
Webスクレイパー APIを使えば、こうした煩わしさを解消できます。この次世代スクレイピングAPIには、requests
またはその他のHTTPクライアントを使用して自動Webリクエストを実行するために必要なものがすべて揃っています。IPやユーザーエージェントのローテーションなどの機能を利用して、ボット対策テクノロジーを簡単にバイパスできます。自動リクエストの正常な実行が、かつてないほど簡単になりました!
スクレイピングソリューションについて当社のデータエキスパートにご相談いただくか、今すぐ登録して利用可能なすべての製品をチェックしてみてください。無料トライアルがご利用いただけます!
クレジットカードは必要ありません