MAGAZINE

ルーターマガジン

クローリング/スクレイピング

curl -s -f -D /dev/stderr が優勝

2025.04.04
Pocket

curlのレスポンスでheaderとbodyを分けて取得したい

スクレイピングの際にはcurlコマンドを使うケースが多いですが、その際にレスポンスヘッダを取得したいケースがあります。

curl -i

で、レスポンスヘッダも含めて取得できますが、レスポンスボディと結合されてでてきます。

レスポンスヘッダとレスポンスボディは空行で分割できますが、やや煩雑です。多くの処理系では文字列をUTF8扱いで処理しますが、レスポンスボディがバイナリが混じった際に文字列としての分割処理ではなくなります。

やはり最初からレスポンスヘッダとボディは分割して取得したいです。

curlのオプションにはヘッダをダンプするオプション-D があります。-D オプションは出力先のファイル名をパラメータとして与えます。

-D  /dev/stderr

とすることで、レスポンスヘッダを標準エラー出力に出すことができます。レスポンスボディは標準出力に

curlで失敗したら終了コードも失敗にしたい

curlコマンドで404や503などのステータスでリクエストが失敗するケースがあります。ただしcurlコマンドとしては正常に終了していますので、終了コードは成功として終わります。

curlコマンドには-fというオプションがあり、「HTTPステータスコードが失敗のときにはコマンド終了ステータスも失敗にする」ということができます。

コマンド終了ステータスは0が成功でそれ以外が失敗です。

まとめるとこれが優勝

 curl -s -f -D  /dev/stderr http://example.com
  • -s 進捗を出さずに
  • -f 404や503はcurlコマンドも失敗扱いで
  • -D ヘッダーを標準エラー出力に出す

例えばrubyのようなスクリプト言語でもこのように呼び出すことで、レスポンスボディ、レスポンスヘッダ、成功/失敗を受け取れます。

body, header, status = Open3.capture3( "curl -s -f -D  /dev/stderr http://example.com")
Pocket

CONTACT

お問い合わせ・ご依頼はこちらから