Web スクレイピングや API 作業など、Web サーバーと対話する場合、Python リクエスト ヘッダーは強力なツールですが、見落とされがちです。これらのヘッダーはサイレントに通信し、誰が呼び出しているのか、なぜ呼び出しているのか、どの形式でデータを返すべきかをサーバーに伝えます。
このガイドでは、Python のリクエスト ライブラリを使用したヘッダーの設定、ヘッダーの順序が重要な理由、ヘッダーを理解することで Web インタラクションの成功をどのように改善できるかについて、知っておくべきことをすべて説明します。
ライブラリを初めて使用する場合は、このガイドに従って pip install リクエストを使用してライブラリをインストールすることから始めることができます。
HTTP では、ヘッダーは各リクエストとレスポンスに付随するキーと値のペアであり、サーバーにリクエストの処理方法を指示します。ヘッダーは期待、形式、権限を指定し、サーバーとクライアントの通信において重要な役割を果たします。たとえば、ヘッダーは、リクエストを送信するデバイスのタイプや、クライアントが JSON レスポンスを期待しているかどうかをサーバーに伝えることができます。
各リクエストはクライアント (ブラウザーやアプリケーションなど) とサーバー間の対話を開始し、ヘッダーは命令として機能します。最も一般的なヘッダーには次のものがあります:
ヘッダーは Python のリクエスト ライブラリを使用して簡単に管理できるため、応答からヘッダーを取得したり、カスタム ヘッダーを設定して各リクエストを調整したりできます。
例: Python リクエストでヘッダーを取得する
Python では、ヘッダーを取得するリクエストは、response.headers を使用して実行できます。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
出力には、サーバーが送り返すヘッダーと、次のような詳細が表示されます
例: カスタムヘッダーの設定
デバイス エミュレーション用のユーザー エージェントの追加などのカスタム ヘッダーを使用すると、リクエストをより本物のように見せることができます。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
この設定により、各リクエストがブラウザーのように表示され、ボット対策が発動される可能性が低くなります。 Python リクエストでは、ヘッダーを設定することでサーバーとのやり取りを正確に制御できます。
Python リクエスト ヘッダーを使用するときによくある質問は、ヘッダー名で大文字と小文字が区別されるかどうかです。
HTTP/1.1 仕様によれば、ヘッダー名では大文字と小文字が区別されません。これは、Content-Type、content-type、および CONTENT-TYPE がすべて同等であることを意味します。ただし、大文字と小文字を区別する代わりに、Content-Type などの標準の命名規則に従うことをお勧めします。形式を標準化すると、特にヘッダーを異なる方法で解釈する可能性のあるサードパーティの API やシステムと統合する場合の混乱を防ぐのに役立ちます。
Web サーバーがリクエストを評価するとき、一貫性のないヘッダーの大文字小文字などの微妙な詳細によってクライアントの性質が明らかになる可能性があります。多くの正規のブラウザとアプリケーションは、Content-Type を大文字にするなど、特定の大文字と小文字の規則に従っています。ただし、ボットやスクリプトはこれらの規則に一律に従っていない場合があります。特殊な大文字と小文字でリクエストを分析することで、サーバーは潜在的なボットにフラグを立てたり、ブロックしたりできます。
実際には、Python リクエスト セット ヘッダーなどの関数を使用する場合、Python のリクエスト ライブラリはヘッダーの大文字と小文字の正規化を自動的に処理します。つまり、ヘッダー名の記述方法に関係なく、ライブラリはヘッダー名を標準化された形式に変換し、サーバーとの互換性を確保します。ただし、ヘッダー名自体は大文字と小文字が区別されませんが、ヘッダー値 (Content-Type の「application/json」など) は文字通り解釈される可能性があり、正確にフォーマットする必要があることに注意してください。
Python のリクエスト ライブラリでは、どのような場合でもヘッダーを設定でき、ライブラリはヘッダーを正しく解釈します。
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
上に示したように、リクエストは content-type を標準 Content-Type に自動的に変換しました。これは、Python のリクエスト ライブラリがヘッダー名を正規化し、元のコードで使用されている大文字と小文字に関係なく Web サーバーとの互換性を維持することを示しています。
ほとんどの標準的な API インタラクションでは、HTTP 仕様ではヘッダーの特定の順序が要求されていないため、Python リクエスト ヘッダー呼び出しで送信されるヘッダーの順序は機能に影響しません。ただし、高度なボット対策およびスクレイピング対策システムを扱う場合、ヘッダーの順序がリクエストが受け入れられるかブロックされるかを決定する際に予想外に重要な役割を果たす可能性があります。
Cloudflare、DataDome、PerimeterX などのボット対策システムは、多くの場合、単純なヘッダー検証を超えて、リクエストの「フィンガープリント」を分析します。これには、ヘッダーが送信される順序が含まれます。人間のユーザーは (ブラウザ経由で) 通常、一貫した順序でヘッダーを送信します。たとえば、ブラウザのリクエストは通常、User-Agent、Accept、Accept-Language、Referer などの順序に従います。対照的に、自動化ライブラリまたはスクレイパーは、ヘッダーを異なる順序で送信したり、非標準のヘッダーを追加したりする可能性があり、検出アルゴリズムの危険信号として機能する可能性があります。
例: ブラウザヘッダーと Python リクエストヘッダー
ブラウザでは、ヘッダーは次の順序で表示されます。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
Python のリクエスト ライブラリでは、ヘッダーが若干異なる場合があります:
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
ヘッダーの順序におけるこのわずかな違いは、特にユーザー エージェント形式やヘッダーの欠落など、他のシグナルと組み合わされた場合に、リクエストが自動化されている可能性があることをボット対策システムに示唆する可能性があります。
この順序を分析することで、高度な検出システムは、自動化されたスクリプトやボットに関連することが多いパターンを識別できます。リクエストが通常の順序と一致しない場合、サーバーはリクエストがボットから送信されたものであると想定し、リクエストがブロックされたり、キャプチャ チャレンジが発生したりする可能性があります。
ブラウザーのリクエストを模倣するために Python リクエスト ヘッダーを設定する場合、ほとんどの Web ブラウザーでどのヘッダーが標準であるかを知っておくと役立ちます。これらのヘッダーはクライアントの機能と設定についてサーバーに通知し、リクエストがより正当であるように見せます。
標準ヘッダーはブラウザーの動作を模倣し、リクエストの成功率を高めます。主要なヘッダーには次のものが含まれます:
リクエストが実際のブラウザを模倣していることを確認するには:
ブラウザ開発者ツール :
プロキシ ツール :
例: Python でのヘッダーの模倣
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
このリクエストは、ブラウザーのようなヘッダーを使用して、対話をより自然に見せます。ブラウザー ツールからヘッダーとヘッダーの順序を観察することで、これらを Python でカスタマイズして、リクエストを実際のブラウザー リクエストにできるだけ近づけることができます。
ユーザー エージェント文字列は、サーバーがリクエストにどのように応答するかにおいて重要な役割を果たします。リクエストを行っているアプリケーション、オペレーティング システム、デバイスを識別し、サーバーがそれに応じて応答を調整できるようにします。
ユーザー エージェント文字列は通常、ブラウザ自体によって生成され、ブラウザのバージョン、オペレーティング システム、さらにはハードウェア構成によっても異なります。
Web スクレイピングにユーザー エージェントを効果的に使用する方法について詳しくは、専用の記事をご覧ください:
(https://scrapfly.io/blog/user-agent-header-in-web-scraping/)
POST リクエストで Python リクエスト ヘッダーを使用する場合、ヘッダーはクライアントから送信されたデータをサーバーが解釈する方法において重要な役割を果たします。 POST リクエストは通常、リソースを作成、更新、または変更するためにサーバーにデータを送信するために使用され、多くの場合、データの構造、形式、目的を明確にするために追加のヘッダーが必要になります。
Content-Type : JSON データの場合は application/json、フォーム送信の場合は application/x-www-form-urlencoded、フォーム送信の場合は multipart/form-data などのデータ形式を示します。ファイル。これを正しく設定すると、サーバーはデータを期待どおりに解析します。
User-Agent : API アクセスとレート制限ポリシーに役立つクライアント アプリケーションを識別します。
認可 : 安全なエンドポイントがリクエストを認証するために必要で、多くの場合トークンまたは資格情報が使用されます。
Accept : 必要な応答形式 (例: application/json) を指定し、一貫したデータ処理とエラー処理を支援します。
POST リクエストのヘッダーの使用例
JSON 形式でデータを送信するには、通常、Content-Type ヘッダーを application/json に設定し、データを JSON として渡します。 JSON ペイロードを送信するための Python リクエストのポストヘッダーの例を次に示します。
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
この方法で Python リクエストのポストヘッダーを使用すると、サーバーがデータを正しく処理し、リクエストがブロックされるのを防ぐことができます。
サーバーが実際のユーザーからのトラフィックを予期する場合、通常は実際の Web ブラウザーによってのみ送信される特定のブラウザー固有のヘッダーをチェックすることがあります。これらのヘッダーは、自動スクリプトからブラウザを識別して区別するのに役立ちます。これは、特定のサイトでボット対策保護をナビゲートする場合に特に重要です。これらのブラウザ固有のパターンを模倣するように Python リクエスト ヘッダーを構成すると、リクエストがより人間らしく見えるようになり、多くの場合、リクエストが成功する可能性が高まります。
DNT (Do Not Track): ユーザーの追跡設定をサーバーに通知し (1 は「追跡しない」を意味します)、リクエストをよりブラウザーに似たものにします。
Sec-Fetch-Site : 同一オリジン、クロスサイト、なしなどの値を使用してオリジンの関係を示し、本物のナビゲーション コンテキストを模倣するのに役立ちます。
Sec-Fetch-Mode : ページ読み込み時の移動などのリクエストの目的を定義し、典型的なブラウザーの動作を複製するのに役立ちます。
Sec-Fetch-Dest : コンテンツ タイプ (ドキュメント、画像、スクリプト) を示し、特定のリソース リクエストを模倣するのに役立ちます。
Python リクエストのブラウザ固有のヘッダーの例:
Python のリクエスト ライブラリを使用してリクエストを行うときに、ブラウザ固有のヘッダーを設定します。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
これらのヘッダーを含めることで、リクエストをブラウザーによって通常送信されるものに近づけることができ、ボットとしてフラグが立てられたり、アクセス制限に遭遇したりする可能性を軽減できます。
アンチボット検出 : ブラウザー固有のヘッダーにより、リクエストが通常のユーザー トラフィックに似るようになり、アンチボット システムがリクエストにフラグを立てるのが難しくなります。
互換性の強化 : 一部のサイトはブラウザーのようなリクエストに対して異なる応答を提供するため、これらのヘッダーは非ブラウザーのトラフィックを制限するサイトに役立ちます。
リクエストの信頼性 : これらのヘッダーを使用してブラウザの動作を模倣すると、ブロックされる可能性が減り、リクエストの成功率が向上します。
Python リクエスト ヘッダーを使用する場合は、有効で正しくフォーマットされたヘッダーを使用することが重要です。多くのサーバーは、受信ヘッダーを積極的に監視して、異常なリクエストや不完全なリクエストを検出します。 User-Agent の欠落、Content-Type の不適切な設定、ヘッダーの矛盾など、ヘッダーが無効または欠落しているリクエストは、自動トラフィックまたは不審なトラフィックの一般的な兆候であり、即時ブロックにつながる可能性があります。
たとえば、Accept: text/html と Content-Type: application/json を組み合わせるなど、互いに矛盾するヘッダーを使用すると、この組み合わせが通常のブラウザーの動作と一致しないため、サーバーがリクエストを拒否する可能性があります。
さらに、一部の Web サイトでは AI を活用したアンチボット ツールを使用してヘッダーを精査し、ボットのような不一致を特定します。ヘッダーの潜在的な問題のテストは、管理されたプラットフォームで行うのが最適です。
User-Agent の使用、Content-Type の一致、過剰なヘッダーの回避など、ヘッダー設定に関するこれらの実践的なヒントは、検出を減らし、リクエストのブロックを最小限に抑えるのに役立ちます。
ヘッダーを設定するときに次の予防措置を講じると、リクエストの成功率が大幅に向上し、潜在的なブロックを効果的に回避できます。
リクエストは強力な HTTP クライアント ライブラリですが、拡張するのが難しく、識別してブロックするのが簡単であるため、スクレイピングには最適なツールではありません。
ScrapFly は、大規模なデータ収集のための Web スクレイピング、スクリーンショット、抽出 API を提供します。
このガイドの締めくくりとして、Python リクエスト ヘッダーに関するよくある質問への回答を次に示します。
ヘッダーは、予想されるデータの種類、クライアント情報、承認の詳細など、各リクエストの追加情報を伝えます。これらは、設定を伝達し、サーバーがリクエストを正しく処理することを保証するために不可欠です。
ヘッダーは、アンチボット検出をバイパスし、リクエストを認証し、レスポンス内の正しいデータ形式を保証するのに役立ちます。実際のブラウザリクエストに似たヘッダーのカスタマイズは、制限付き API のスクレイピングやアクセスに特に役立ちます。
ブラウザ開発者ツールを使用すると、Web サイトへの各リクエストで送信されるヘッダーを検査できます。これらのヘッダーを Python リクエストにコピーすると、リクエストでブラウザのトラフィックを模倣することができます。
Python リクエスト ヘッダーの操作は、Web スクレイピングと API 対話の両方に不可欠です。ヘッダーの設定、取得、操作方法を理解すると、より効果的で信頼性の高いリクエストを作成するのに役立ちます。 GET リクエストや POST リクエストを処理する場合でも、ブラウザのヘッダーを模倣する場合でも、検出を回避する場合でも、ヘッダーの処理方法によってスクレイピングが成功するかどうかが決まります。
標準ヘッダーの使用、POST リクエストの適切な値の設定、ヘッダーの順序の確保などのベスト プラクティスに従うことで、リクエストは最新の Web サービスの複雑な状況をより適切にナビゲートできるようになります。
以上がPython リクエストヘッダーのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。