文化、環境、関係性など、あらゆるコミュニケーションにはコンテキストが付き物で、それによってコミュニケーションの効果が変わってきます。Web 通信における HTTP ヘッダーとは、Web サーバーとクライアントが HTTP 要求を送信したり HTTP 応答を受信したりするときに交換する技術的なコンテキストです。このコンテキストは、認証を容易にしたり、キャッシュの動作を決定したり、セッションの状態を管理したりするために使用できます。また、Web サーバーが HTTP 要求の送信元と応答方法を判断するのにも使用されます。この応答方法には、クライアントデバイスの要件を満たすように Web サイトをレンダリングしたり、データを配信したりすることも含まれます。後者をボットで実行する場合、この操作は Web スクレイピングと呼ばれ、Web サイトからデータを自動的に取得する必要がある場合に便利です。
スクレイパーを構築する際、デフォルト値でも要求を行えるため、HTTP ヘッダーの構成を見落としがちです。しかし、HTTP ヘッダーが適切に構成されていないと、スクレイパーと Web サーバーの間の継続的な通信を維持することは困難です。なぜなら、Web サーバーが User-Agent
、Referer
、Accept-Language
などのデフォルトの HTTP ヘッダーの情報に基づきボットや自動スクリプトを検出するよう設定されている可能性があるからです。
しかし、ヘッダーを正しく構成すれば、通常のユーザートラフィックをシミュレートし、スクレイピングの信頼性を高めることができます。この記事では、HTTP ヘッダー、Web スクレイピングにおけるその役割、効果的なデータ収集が行えるよう HTTP ヘッダーを最適化する方法について解説します。
HTTP ヘッダーが必要な理由
HTTP ヘッダーは、Web 通信に必要な、要求と応答に含まれるキーと値の組み合わせです。Web サーバーは、要求ヘッダーからクライアントと対象のリソースに関する情報と指示を受け取ります。一方、応答ヘッダーは、取得したリソースと受け取った応答に関する詳細情報をクライアントに提供します。HTTP ヘッダーは多数ありますが、Web スクレイピングにおいて最も重要なヘッダーには次のようなものがあります:
User-Agent
User-Agent
は、要求の送信に使用されたクライアントを一意に識別する文字列です。この文字列の内容には、アプリケーションのタイプ、オペレーティングシステム、ソフトウェアバージョン、ソフトウェアベンダーなど含まれます。
デフォルトでは、このヘッダーはスクレイパーがボットであると簡単に認識できる値に設定されています。たとえば、Python 要求スクリプトを使用して e コマース Web サイトから価格データをスクレイピングする場合、スクレイパーは HTTP ヘッダーに次のような User-Agent
を含めて送信します:
"python-requests/X.X.X"
User-Agent
を別のブラウザやデバイスを模倣するように変更すると、検出を避けることができます。そのためには、Python 要求の User-Agent
ヘッダーを次のものに置き換える必要があります:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
この新しいヘッダーには、ブラウザと、ブラウザが実行されているネイティブプラットフォームに関する情報が含まれています。
Accept-Language
Accept-Language
ヘッダーでは、要求したリソースを受け取る言語を指定できます。必要に応じて、国コードや文字の種類を含めることができます。たとえば、Accept-Language
を「en-US」
に設定した場合、他の大陸にいたとしても、リソースをアメリカ英語で希望することを意味します。また、「sr-Latn」
を指定して、文字の種類でヘッダーをラテン文字のセルビア語に定義することもできます。これにより、適切にローカライズされたデータを取得できます。
複数の言語を指定する場合、Accept-Language
ヘッダーは、優先順位を定義する品質値を持つ、言語のカンマ区切りのリストになります。「en -GB;q=1.0, en-US;q=0.9, fr;q=0.8」
がその例で、q
の値が高いほど優先度が高く、q
の範囲は 0
から 1
までです。
Cookie
Cookie
ヘッダーには、Web サーバーが複数の要求/応答サイクルにわたりユーザーセッションを識別できるようにするデータが含まれています。スクレイピング中に、クライアント側で Cookie を生成 (または以前保存した Cookie を使用) して、新しい要求の HTTP ヘッダーに含めることができます。これにより、Web サーバーは要求を有効なユーザーセッションに関連付け、必要なデータを返すことができます。たとえば、e コマース Web サイトからユーザー固有のデータを取得するために複数の要求を行う必要がある場合、HTTP 要求の Cookie
ヘッダーにセッション Cookie を含めて、スクレイパーのログイン状態を保ち、関連データを保持し、Cookie ベースのボット検出システムを回避する必要があります。
Cookie
ヘッダーは、セミコロンとスペース (「;」
) で区切られた 1 つまたは複数のキーと値の組み合わせのリストで構成されます。通常、「name0=value0; name1=value1; name2=value2」
という形式になります。
Referer
Referer
には、リソースを要求した元のページの絶対 URL または URL の一部が含まれます。たとえば、e コマース Web サイトのホームページをスクロールしているときに、興味をそそるリンクをクリックしたとします。次の Web ページを開く HTTP 要求の Referer
ヘッダーは、その要求を開始した e コマース Web サイトのホームページを指します。閲覧中の Web ページから他の Web ページに移動するごとに、前に表示したページが次のページの Referer
となります。これは、人間とのやりとりにおける紹介の仕組みに似ています。
当然、一部の Web サイトでは、スクレイピング防止メカニズムの一部としてこのヘッダーをチェックしています。つまり、他の Web サイトからの自然なトラフィックフローをシミュレートしてブロックを避けたい場合は、Referer
ヘッダーを、サイトのホームページや検索エンジンの URL などの有効な URL に設定する必要があります。
Web スクレイピング用に HTTP ヘッダーを最適化する方法
スクレイを行う際は、必要なデータが所有者にとって貴重なものであり、共有したがらない可能性があることを念頭に置く必要があります。そのため、多くの所有者は、コンテンツにアクセスしようとする自動エージェントを検出するための対策を講じています。そのような対策が成功すると、ブロックされたり、無関係なデータが返されたりする可能性があります。
HTTP ヘッダーは、スクレイパーではなく Web サイトを閲覧している通常のインターネットユーザーのように見せることで、このようなセキュリティ対策をすり抜けるのに役立ちます。User-Agent
、Accept
、Accept-Language
、Referer
などのヘッダーを正しく設定することで、通常の Web トラフィックを効果的に模倣し、Web サーバーがボットをスクレイパーとして識別しにくくできます。
カスタムヘッダーの取得と設定
HTTP ヘッダーを最適化する方法をお見せするために、ダミーの e コマースサイト Books to Scrape からミステリーカテゴリの書籍情報をスクレイピングする Python 要求を実行してみましょう。その前に、ブラウザの開発者ツールから HTTP ヘッダーを取得する必要があります。
はじめに、別のブラウザタブで Web サイトにアクセスします:
次に、ブラウザで開発者ツールを起動します。その方法の 1 つとして、ページ上の任意の場所を右クリックして [検査] を選択するか、ツールのサブリストを確認します。次に、開発者ツールの最上部のメニューにあるネットワークタブをクリックします:
ネットワークタブを開いた状態で、キャッシュを無効にするの横にあるチェックボックスをオンにします。これにより、要求ヘッダー全体を見ることができます。次に、Web サイトのカテゴリのリストにある、ミステリーカテゴリへのリンクをクリックします。これにより、そのカテゴリの本のページが開きますが、さらに重要なのは、開発者ツールウィンドウのネットワークタブに、要求のリストが表示されることです:
リストの一番上までスクロールし、最初の項目をクリックします。これにより、開発者ツールに小さなウィンドウが開きます。要求ヘッダーまでスクロールします:
要求ヘッダーに、HTTP 要求ヘッダー (特に前述のもの) が表示されます。これらのヘッダーをスクレイパーで使用するには、User-Agent
、Accept
、Accept-Language
、Cookie
、Referer
ヘッダーの変数を含む Python スクリプトを作成します:
import requests
referer = "https://books.toscrape.com/"
accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"
accept_language = "en-GB,en;q=0.6"
cookie = "zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA=="
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
custom_headers = {
"User-Agent": user_agent,
"Accept": accept,
"Accept-Language": accept_language,
"Cookie": cookie,
"Referer": referer
}
このコードスニペットでは、requests
ライブラリをインポートし、各 HTTP ヘッダーの変数を文字列として定義します。次に、headers
というディクショナリを作成して、HTTP ヘッダー名を定義済みの変数にマッピングします。
次に、スクリプトに次のコードを追加して、カスタムヘッダーなしで HTTP 要求を送信し、結果を出力します。
URL = 'https://books.toscrape.com/catalogue/category/books/mystery_3/index.html'
r = requests.get(URL)
print(r.request.headers)
ここで、ミステリー書籍の URL を変数に割り当てます。次に、この URL を唯一のパラメーターとする requests.get
メソッドを呼び出し、要求ヘッダーを出力します。
出力は次のようになります:
{'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
ご覧のとおり、デフォルトの HTTP ヘッダーではスクレイパーがボットとして認識される可能性が高いです。関数に追加パラメーターを渡して requests.get
行を更新します:
r = requests.get(URL, headers=custom_headers)
ここで、作成した custom_header
ディクショナリと URL
パラメーターを requests.get
メソッドに渡します。
出力は次のようになります:
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Connection': 'keep-alive', 'Accept-Language': 'en-GB,en;q=0.6', 'Cookie': 'zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA==', 'Referer': 'https://books.toscrape.com/'}
ヘッダーがブラウザから取得した情報で更新されていることがわかります。これにより、どの Web サーバーでもユーザーが自動的にサイトにアクセスしていることを検出するのが難しくなり、ブロックされる可能性が低くなります。
ヘッダーを最適化することのメリット
スクレイピングを継続的に成功させるには、HTTP ヘッダーを適切に最適化することが重要です。
最適化のメリットの 1 つに、ブロック率の低下があります。ヘッダーが最適化されていると、スクレイパーの Web サイトとのやり取りは、一般的なユーザーのものと同様になります。その結果、一部のボット検出システムを回避して、スクレイパーが時間の経過とともにブロックされる可能性 (ブロック率) を下げることができます。
HTTP ヘッダーを最適化するもう 1 つのメリットは、ブロック率が下がることでデータのスクレイピングが容易になるため、成功率が上がることです。
さらに、HTTP ヘッダーの最適化を重視すると、スクレイピングが効率化されます。これにより、ニーズに合った関連性の高いデータを確実に受け取ることができます。
ヘッダーの最適化に関するヒント
ヘッダーを適切に構成することは、Web スクレイピングプロジェクトを成功させるために重要ですが、特にデータを大規模にスクレイピングする必要がある場合など、他にも考慮すべき点があります。スクレイパーの成功率を上げるためのヒントを以下にご紹介します:
ヘッダーのローテーション
User-Agent
などのヘッダーを定義してユーザーからの通常のトラフィックを模倣するだけにとどまらず、複数の異なる HTTP ヘッダーを定義し、リクエストごとにそれらのヘッダーをローテーションできます。これにより、複数のユーザーが Web サーバーにアクセスしている状況をシミュレートし、それらの間で生成されたトラフィックを分散できます。これにより、ボットとして認識されブロックされる可能性がさらに低くなります。
スクレイピングの規模にもよりますが、10 個から数百個の User-Agent
を使用できます。短時間で送信する必要のある要求が多ければ多いほど、より多くの User-Agent
を切り替えて使用するのが合理的になります。
ヘッダーを更新し続ける
HTTP ヘッダーの最適化に関して考慮すべきもう 1 つの点は、ヘッダーの定期的なメンテナンスです。ユーザーは通常、新しいバージョンがリリースされるたびにブラウザを更新します。そのため、最新のブラウザバージョンに対応しているヘッダーがその時点で有効なものとみなされる可能性が十分にあります。古いブラウザやソフトウェアバージョンを参照する 1 つまたは複数の User-Agent
をヘッダーに設定していると、Web サーバーによって通常のユーザーと異なることが認識され、要求がブロックされる可能性があります。同じことが、頻繁な更新を必要とする他のヘッダーにも当てはまります。
不適切なヘッダー構成を避ける
不適切なヘッダー構成を避けるようにすることも重要です。不適切なヘッダー構成とは、User-Agent
などのヘッダーが、設定した他のすべての標準ヘッダーと一致していないものを指します。たとえば、User-Agent
を Windows で実行されている Mozilla Firefox ブラウザに設定し、残りのヘッダーを Windows で実行されている Chromium ブラウザ用に定義した場合、スクレイパーがブロックされる可能性が高くなります。
さらに、クライアントとサーバーの間の仲介役となるプロキシサーバーを使用する場合、ブラウザ側の検出システムで要求が自動化されていることが認識されるヘッダーを、意図せず追加してしまう可能性があります。ヘッダーを確認するには、テスト要求を送信し、プロキシサーバーによって識別可能なヘッダーが追加されないことを確認してください。
まとめ
この記事では、Web スクレイピングにおいて最も重要なヘッダーの一部である User-Agent
、Referer
、Accept-Language
、Cookie
ヘッダーを含む、HTTP ヘッダーについて解説しました。スクレイピングを長期間にわたり成功させ、有用な情報を得るには、HTTP ヘッダーを最適化する必要があります。
HTTP ヘッダーを適切に使用して Web スクレイピングプロジェクトで要求を行うと、スクレイピング防止メカニズムをすり抜けやすくなるため、ブロック率が下がり、成功率が上がります。また、スクレイピングの効率も向上します。ただし、JavaScript のテストや CAPTCHA を用いた高度なスクレイピング防止メカニズムは、依然として障害となる可能性があります。Bright Data は、受賞歴のあるユーザーフレンドリーなプロキシネットワーク、高度なスクレイピングブラウザ、包括的な Web Scraper IDE、Web Unlocker を提供し、スクレイピングを簡素化します。これらの製品は、初心者でも専門家でも、スクレイピングの目標達成に役立てることができます。今すぐ無料トライアルを開始して、Bright Data のサービスをお試しください。