Web スクレイピングに適した HTTP ヘッダー

最も一般的な HTTP ヘッダー、Web スクレイピングにおいて重要な理由、HTTP ヘッダーの最適化方法について解説します。
3 分読
HTTP Headers for Web Scraping

文化、環境、関係性など、あらゆるコミュニケーションにはコンテキストが付き物で、それによってコミュニケーションの効果が変わってきます。Web 通信における HTTP ヘッダーとは、Web サーバーとクライアントが HTTP 要求を送信したり HTTP 応答を受信したりするときに交換する技術的なコンテキストです。このコンテキストは、認証を容易にしたり、キャッシュの動作を決定したり、セッションの状態を管理したりするために使用できます。また、Web サーバーが HTTP 要求の送信元と応答方法を判断するのにも使用されます。この応答方法には、クライアントデバイスの要件を満たすように Web サイトをレンダリングしたり、データを配信したりすることも含まれます。後者をボットで実行する場合、この操作は Web スクレイピングと呼ばれ、Web サイトからデータを自動的に取得する必要がある場合に便利です。

スクレイパーを構築する際、デフォルト値でも要求を行えるため、HTTP ヘッダーの構成を見落としがちです。しかし、HTTP ヘッダーが適切に構成されていないと、スクレイパーと Web サーバーの間の継続的な通信を維持することは困難です。なぜなら、Web サーバーが User-AgentRefererAccept-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-AgentAcceptAccept-LanguageReferer などのヘッダーを正しく設定することで、通常の Web トラフィックを効果的に模倣し、Web サーバーがボットをスクレイパーとして識別しにくくできます。

カスタムヘッダーの取得と設定

HTTP ヘッダーを最適化する方法をお見せするために、ダミーの e コマースサイト Books to Scrape からミステリーカテゴリの書籍情報をスクレイピングする Python 要求を実行してみましょう。その前に、ブラウザの開発者ツールから HTTP ヘッダーを取得する必要があります。

はじめに、別のブラウザタブで Web サイトにアクセスします:

次に、ブラウザで開発者ツールを起動します。その方法の 1 つとして、ページ上の任意の場所を右クリックして [検査] を選択するか、ツールのサブリストを確認します。次に、開発者ツールの最上部のメニューにあるネットワークタブをクリックします:

ネットワークタブを開いた状態で、キャッシュを無効にするの横にあるチェックボックスをオンにします。これにより、要求ヘッダー全体を見ることができます。次に、Web サイトのカテゴリのリストにある、ミステリーカテゴリへのリンクをクリックします。これにより、そのカテゴリの本のページが開きますが、さらに重要なのは、開発者ツールウィンドウのネットワークタブに、要求のリストが表示されることです:

リストの一番上までスクロールし、最初の項目をクリックします。これにより、開発者ツールに小さなウィンドウが開きます。要求ヘッダーまでスクロールします:

要求ヘッダーに、HTTP 要求ヘッダー (特に前述のもの) が表示されます。これらのヘッダーをスクレイパーで使用するには、User-AgentAcceptAccept-LanguageCookieReferer ヘッダーの変数を含む 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-AgentRefererAccept-LanguageCookie ヘッダーを含む、HTTP ヘッダーについて解説しました。スクレイピングを長期間にわたり成功させ、有用な情報を得るには、HTTP ヘッダーを最適化する必要があります。

HTTP ヘッダーを適切に使用して Web スクレイピングプロジェクトで要求を行うと、スクレイピング防止メカニズムをすり抜けやすくなるため、ブロック率が下がり、成功率が上がります。また、スクレイピングの効率も向上します。ただし、JavaScript のテストや CAPTCHA を用いた高度なスクレイピング防止メカニズムは、依然として障害となる可能性があります。Bright Data は、受賞歴のあるユーザーフレンドリーなプロキシネットワーク、高度なスクレイピングブラウザ、包括的な Web Scraper IDE、Web Unlocker を提供し、スクレイピングを簡素化します。これらの製品は、初心者でも専門家でも、スクレイピングの目標達成に役立てることができます。今すぐ無料トライアルを開始して、Bright Data のサービスをお試しください。

あなたは下記にもご興味がおありかもしれません

web scraping with claude blog image
ウェブデータ

2025年のクロードによるウェブスクレイピング

Pythonを使ってWebスクレイピングを自動化し、構造化データを楽に抽出するClaude AIの使い方を学ぶ。
18 分読
Building AI-Ready Vector Datasets for LLMs blog image
AI

LLMのためのAI対応ベクトルデータセット構築:Bright Data、Google Gemini、Pineconeを使ったガイド

大規模言語モデル(LLM)は、私たちが情報にアクセスし、インテリジェントなアプリケーションを構築する方法を変革しています。LLMの可能性を最大限に引き出すには、特にドメイン固有の知識や独自のデータを使用する場合、高品質で構造化されたベクトルデータセットを作成することが重要です。LLMの性能と精度は、入力データの品質に直接結びついています。準備不足のデータセットは劣悪な結果をもたらす可能性があり、一方、十分にキュレーションされたデータセットはLLMを真のドメイン・エキスパートに変えることができます。 このガイドでは、AIに対応したベクターデータセットを生成するための自動パイプラインの構築方法を順を追って説明する。 課題:LLMのためのデータ収集と準備 LLMは膨大な汎用テキストコーパスで学習されますが、商品関連のクエリへの回答、業界ニュースの分析、顧客フィードバックの解釈など、特定のタスクやドメインに適用すると、不足することがよくあります。LLMを真に役立てるには、ユースケースに合わせた高品質のデータが必要です。 このデータは通常、ウェブ上に分散していたり、複雑なサイト構造の背後に隠されていたり、ボット対策によって保護されていたりする。 当社の自動ワークフローは、データセット作成の最も困難な部分を処理する合理化されたパイプラインでこれを解決します: コア技術の概要 パイプラインを構築する前に、関連するコアテクノロジーと、それぞれがワークフローをどのようにサポートしているかを簡単に見ておこう。 ブライトデータスケーラブルなウェブデータ収集 AIに対応したベクターデータセットを作成するための最初のステップは、関連性のある高品質なソースデータを収集することです。ナレッジベースやドキュメンテーションのような内部システムから得られるものもあるが、大部分は公共のウェブから得られることが多い。 しかし、最近のウェブサイトは、CAPTCHA、IPレート制限、ブラウザフィンガープリントなどの高度なボット対策メカニズムを使用しているため、大規模なスクレイピングは困難である。 Bright Dataは、データ収集の複雑さを抽象化するWeb Unlocker APIでこの課題を解決します。プロキシのローテーション、CAPTCHAの解決、ブラウザのエミュレーションを自動的に処理するため、データへのアクセス方法ではなく、データに集中することができます。 Google Gemini: インテリジェント・コンテンツ・トランスフォーメーション Geminiは、Googleによって開発された強力なマルチモーダルAIモデルのファミリーであり、様々なタイプのコンテンツを理解し処理することに優れている。私たちのデータ抽出パイプラインにおいて、Geminiは3つの重要な機能を果たします: このAIを活用したアプローチは、特に以下のような使用例において、脆弱なCSSセレクタや壊れやすい正規表現に依存する従来の方法よりも大きな利点をもたらす: AIがデータ抽出プロセスにどのような変化をもたらしているかについては、Using AI for Web Scrapingをご覧ください。スクレイピングのワークフローにGeminiを実装するための実践的なチュートリアルをお探しの場合は、包括的なガイドをご覧ください:GeminiによるWebスクレイピングをご覧ください。 文の変形意味埋め込み文の生成 エンベッディングは、高次元空間におけるテキスト(または他のデータタイプ)の密なベクトル表現である。これらのベクトルは意味的な意味を捉え、コサイン類似度やユークリッド距離のようなメトリクスを用いて測定される、類似したテキスト片を近接したベクトルで表現することを可能にする。この特性は、セマンティック検索、クラスタリング、検索拡張生成(RAG)のようなアプリケーションで重要である。 Sentence Transformersライブラリは、高品質の文や段落の埋め込みを生成するための使いやすいインターフェースを提供する。Hugging Face Transformersの上に構築され、意味タスクのために微調整された幅広い事前学習済みモデルをサポートしています。 このエコシステムで最も人気があり、効果的なモデルの1つがオールMiniLM-L6-v2である: より大きなモデルはより微妙なエンベディングを提供するかもしれないが、all-MiniLM-L6-v2は性能、効率、コストの間で非常に優れたバランスを提供する。その384次元ベクトルは ほとんどの実用的なユースケース、特に初期段階の開発やリソースに制約のある環境では、このモデルで十分すぎる。エッジケースにおける精度のわずかな低下は、通常、スピードとスケーラビリティの大幅な向上によって相殺されます。そのため、AIアプリケーションの最初のイテレーションを構築する場合や、控えめなインフラストラクチャでパフォーマンスを最適化する場合は、all-MiniLM-L6-v2を使用することをお勧めします。 Pineconeベクトル埋め込み画像の保存と検索 テキストがベクトル埋め込みデータに変換されると、それを効率的に保存、管理、照会するための専用のデータベースが必要になります。従来のデータベースはこのために設計されていません。ベクトル・データベースは、埋め込みデータの高次元の性質を扱うために特別に設計されており、RAGパイプライン、セマンティック検索、パーソナライゼーション、その他のAI駆動型アプリケーションに不可欠なリアルタイムの類似性検索を可能にします。 Pineconeは、開発者フレンドリーなインターフェイス、低レイテンシの検索パフォーマンス、完全に管理されたインフラストラクチャで知られる人気のベクトルデータベースです。ベクトル検索インフラストラクチャの複雑さを抽象化することで、複雑なベクトルインデックスと検索を効率的に管理します。主なコンポーネントは以下の通りです: Pineconeは2つのデプロイメントアーキテクチャを提供する:ServerlessとPod-Based です。ほとんどのユースケース、特に開始時や動的な負荷に対処する場合は、シンプルさとコスト効率からサーバーレスが推奨されます。 セットアップと前提条件 パイプラインを構築する前に、以下のコンポーネントが適切に設定されていることを確認する。 前提条件 各APIキーの生成方法については、以下のツール固有の設定セクションを参照してください。 必要なライブラリのインストール このプロジェクトのコアとなるPythonライブラリをインストールする: これらのライブラリーは提供している: 環境変数の設定 プロジェクトのルート・ディレクトリに.envファイルを作成し、APIキーを追加する: ブライトデータ設定 Bright DataのWeb Unlockerを使用するには: 実装例と統合コードについては、Web Unlocker GitHub […]
6 分読
AI

LLMにおけるスーパーバイズド・ファインチューニングとは?

このPythonガイドでは、概念、ツール、ワークフロー、そしてAIプロジェクトを向上させる実践的な例を取り上げています。
7 分読