Python Requestsのユーザーエージェントガイド:設定と変更

ボット対策システムによるブロックを回避しましょう!このチュートリアルでは、Python RequestsでUser-Agentヘッダーを設定してローテーションし、安全かつ効果的にWebスクレイピングを行う方法を学びます。
3 min read
Requests User Agent Guide blog image

このチュートリアルでは次のトピックについて説明します:

  • 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レイアウトエンジンとの互換性。
  1. Chrome/125.0.0.0:ブラウザ名とそのバージョン。
  2. 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カスタムユーザーエージェントを設定するには、次のことを実行する必要があると学びました:

  1. user-agentプロパティを使用してPythonディクショナリを定義します。
  2. 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やユーザーエージェントのローテーションなどの機能を利用して、ボット対策テクノロジーを簡単にバイパスできます。自動リクエストの正常な実行が、かつてないほど簡単になりました!

スクレイピングソリューションについて当社のデータエキスパートにご相談いただくか、今すぐ登録して利用可能なすべての製品をチェックしてみてください。無料トライアルがご利用いただけます!