ハイパーテキスト転送プロトコル(HTTP)は、クライアントがリクエストを送信しサーバーからの応答を待つクライアント・サーバーモデルに従うステートレスプロトコルです。リクエストにはHTTPメソッド、サーバー位置、パス、クエリ文字列、ヘッダーなどの詳細が含まれます。
HTTPヘッダーは、メタデータや指示の伝達を可能にするキーと値のペアで構成されるフィールドまたは文字列のリストです。コンテンツタイプ、キャッシュ動作、認証などのパラメータを定義する上で重要であり、クライアントとサーバー間の効率的かつ安全なやり取りを保証します。ウェブスクレイピングでは、HTTPヘッダーによりリクエストをカスタマイズでき、ウェブスクレイパーがユーザーエージェントを模倣したり、コンテンツネゴシエーションを制御したり、各ウェブサイトのポリシーやプロトコルに応じた認証を処理したりすることが可能になります。
ウェブスクレイピングにおけるHTTPヘッダーの一般的な使用例には、ユーザーエージェント(UA)やレスポンスタイプの変更、条件付きリクエストの実行、アプリケーションプログラミングインターフェース(API)への認証などが含まれます。
この記事では、curl を使用して HTTP ヘッダーを送信する方法について学びます。
cURL を使用した HTTP ヘッダーの送信
チュートリアルを始める前に、ターミナルで次のコマンドを実行し、お使いのOSにcurlがインストールされていることを確認してください:
curl --version
インストールされている場合、出力にバージョン番号が表示されます。例:
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
「curl は内部コマンドまたは外部コマンド、操作可能なプログラム、バッチ ファイルとして認識されません」や「コマンドが見つかりません」といったエラーメッセージが表示された場合は、curl をインストールする必要があります。
ヘッダーを検査するツールも必要です。例えばhttpbin.org はシンプルな HTTP リクエストとレスポンスを提供するサービスです。
curlを使用したことがある方ならご存知のように、curlの構文は次のようになります:
curl [オプション] [URL]
つまり、mywebpage.comからウェブページをダウンロードしたい場合、次のコマンドを実行する必要があります:
curl www.mywebpage.com
cURLヘッダー
httpbin.orgでcurlが送信したヘッダーを確認するには、コマンドラインを開き以下を実行します:
curl http://httpbin.org/headers
出力にはヘッダーの一覧が含まれます:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd2eb0-0617353714d52f3777c9c267"
}
Accept、Host、User-Agentヘッダーは、curlではデフォルトで送信されます。
Acceptヘッダーは、クライアントが受け入れ可能なメディアタイプをサーバーに伝えます。クライアントが受け入れ可能なコンテンツタイプをサーバーに通知し、クライアントとサーバー間のコンテンツネゴシエーションを可能にします。
クライアントがJSONを優先することを示すAcceptヘッダーは次のようになります:
Accept: application/json
User-Agentフィールドにはクライアントの詳細情報が含まれます。この例では、バージョン7.55.1を実行しているcurlアプリケーションです(このバージョン番号はご使用のバージョンと一致します)。
Hostヘッダーは、HTTPリクエストが送信されるWebドメイン(ホスト)とポートを一意に識別します。リクエストにポートが含まれていない場合、デフォルト値(HTTPはポート80、HTTPSはポート443)が使用されます。
X-Amzn-Trace-Idは出力中のヘッダーで唯一デフォルトではないものです。このヘッダーはリクエストがAWSロードバランサーなどのAmazon Web Services(AWS)サービスに送信されたことを示し、HTTPリクエストの追跡に使用できます。
これらのヘッダーがcurlによってデフォルトで送信されたことを確認するには、詳細モードを使用できます。このためのフラグは-vまたは --verboseであり、ヘッダーを含むリクエストとレスポンスの詳細情報を表示します。
curlが送信するデフォルトヘッダーを確認するには、次のコマンドを実行します:
curl -v http://httpbin.org/headers
出力例:
* Trying 50.16.63.240...
* TCP_NODELAY set
* Connected to httpbin.org (50.16.63.240) port 80 (#0)
> GET /headers HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 22 Mar 2024 07:18:00 GMT
< Content-Type: application/json
< Content-Length: 173
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd30a8-624365ad52781957578cd5b1"
}
}
* Connection #0 to host httpbin.org left intact
大なり記号(>)が付いた行は、クライアント(curl)がエンドポイントに送信した内容を示しています。この出力により、以下のヘッダーが送信されたことが確認できます:
- エンドポイントへの
GET(HTTP メソッド) / ヘッダー Host:httpbin.orgUser-Agent:curl/7.55.1Accept:*/*
出力内の「<」記号が付いた行(例:< Content-Type: application/json)は、送信したヘッダーを反映しています。
-H フラグを使用したデフォルトヘッダーの変更
-H または--header フラグは、カスタムヘッダーをサーバーに渡すために使用され、テストにも使用できます。
例えば、User-Agent をcurl/7.55.1 からYour-New-User-Agent に変更するには、次のコマンドを使用します:
curl -H "User-Agent: Your-New-User-Agent" http://httpbin.org/headers
出力例:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "Your-New-User-Agent",
"X-Amzn-Trace-Id": "Root=1-65fd5123-3ebe566a4681427c6996c72c"
}
}
Acceptヘッダーを、あらゆるコンテンツタイプを受け入れる`*/*`から、JSON形式のコンテンツのみを受け入れる`application/json`に変更したい場合は、次のコマンドを使用します:
curl --header "Accept: application/json" http://httpbin.org/headers
出力は次のようになります:
{
"headers": {
"Accept": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd55c3-05c21f81770c1c5e6343b1fc"
}
}
注: 2番目の例では、
-Hの代わりに--headerが使用されています。--headerと-Hは互換性があり、同じ機能を果たします。
curl バージョン 7.55.0 以降では、ヘッダーをファイルで渡すことも可能です。例えば、ヘッダーを含むファイル名をheader_file とした場合、以下のコマンドでヘッダーファイルを渡せます:
Curl -H @header_file
カスタムヘッダーの送信
カスタムヘッダーは開発者によって定義され、標準ヘッダーで提供される情報に加えて、HTTPリクエストに関する追加情報を含みます。
curl でカスタムヘッダーを送信するには、-H フラグを使用します。例えば、My-Custom-Header というカスタムヘッダーをvalue という値で送信したい場合、次のコマンドを実行します:
curl -H "My-Custom-Header: Value of custom header" http://httpbin.org/headers
出力例:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"My-Custom-Header": "Value of custom header",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd7d2a-3b683be160ff2965023b3a31"
}
}
空のヘッダーを送信する
特定のAPI要件で、内容がなくとも特定のヘッダーを送信することが義務付けられている場合など、空のヘッダーを送信する必要があるシナリオがあります。例えば、HTTP Strict Transport Security(HSTS)ヘッダーは、ウェブサイト上で安全なHTTPS接続を強制するために使用されます。このヘッダーには通常、HSTSの期間や動作に関する指示が含まれますが、空の値で送信することで、即座にHSTSを強制することができます。
また、ヘッダーをクリアまたはリセットするためにも空ヘッダーを使用できます。例えば、以前にデフォルトで設定されたヘッダーをリセットまたはクリアしたい場合、空ヘッダーを送信することでヘッダーの値をクリアできます。
curlで空ヘッダーを送信するには、ヘッダー名の後にセミコロンを付けて空値を示す必要があります。以下のコマンドは、My-Custom-Headerという空のカスタムヘッダーを送信する方法を示しています:
curl -H "My-Custom-Header;" http://httpbin.org/headers
出力には空の値を持つMy-Custom-Header が表示されます:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"My-Custom-Header": "",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd84e2-7a42d9d62a42741e448c426f"
}
}
ヘッダーの削除
curlでヘッダーを削除するには、ヘッダー名にコロンを付け、値を指定せずに記述します。
例えば、デフォルトのUser-Agent ヘッダーを削除するには、次のコマンドを送信します:
curl -H "User-Agent:" http://httpbin.org/headers
応答にはUser-Agentヘッダーが含まれておらず、ヘッダーが削除されたことを確認できます:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-65fd862d-13b181583501ae11046374a1"
}
}
複数のヘッダーを送信する
これまでは1つのヘッダーのみを含む例を見てきましたが、curlでは複数のヘッダーを送信することも可能です。必要なのは-Hフラグを複数回指定することだけです。
例えば、Custom-Header-1 とCustom-Header-2 の2つのヘッダーをそれぞれ値one とtwo で送信したい場合、次のコマンドを実行します:
curl -H "Custom-Header-1: one" -H "Custom-Header-2: two" http://httpbin.org/headers
出力結果は次のようになります:
{
"headers": {
"Accept": "*/*",
"Custom-Header-1": "one",
"Custom-Header-2": "two",
"Host": "httpbin.org",
"User-Agent": "curl/7.55.1",
"X-Amzn-Trace-Id": "Root=1-65fd8781-143be3502c559bc5605fc6f1"
}
}
結論
この記事では、HTTPヘッダーについて、またcurlでHTTPヘッダーを送信する方法について学びました。
包括的なウェブスクレイピングソリューションをお探しなら、Bright Dataをお試しください。プロキシサービス(匿名性の確保やIPブロックの防止に役立ちます)や、地理的に制限されたコンテンツにCAPTCHAなしでアクセスできるWeb Unlockerなどのツールやサービスを提供しています。
今すぐ無料トライアルを開始しましょう!