URLのリストのHTTPステータスコードを取得するスクリプト?


87

それでも機能するかどうかを確認するために確認する必要のあるURLのリストがあります。それを行うbashスクリプトを書きたいと思います。

返されたHTTPステータスコード、つまり200、404、500などだけが必要です。これ以上何もない。

編集ページに「404notfound」と表示されているが、200OKメッセージが返される場合は問題があることに注意してください。これは誤って構成されたWebサーバーですが、このケースを考慮する必要がある場合があります。

詳細については、「404」というテキストを含むページにURLが移動するかどうか確認するをご覧ください。


2
公平を期すために、私のスクリプトの「バグ」は、サーバーがHTTPコード200を返した場合のみですが、本文には「404 not found」と表示されます。これは、不正なWebサーバーです。
Phil

2
wgetの終了ステータスは、応答コードが200の場合は0、404の場合は8、302の場合は4になります... $?を使用できます。前のコマンドの終了ステータスにアクセスするための変数。
ケイシーワトソン

回答:


194

Curlには、次の特定のオプションがあります--write-out

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null 通常の出力を破棄します
  • --silent プログレスメーターを捨てる
  • --head GETの代わりにHEADHTTPリクエストを作成します
  • --write-out '%{http_code}\n' 必要なステータスコードを出力します

これを完全なBashスクリプトでまとめるには:

#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt

(イーグルアイの読者は、これがURLごとに1つのカールプロセスを使用することに気付くでしょう。これにより、フォークとTCP接続のペナルティが課せられます。1つのカールに複数のURLを組み合わせると高速になりますが、怪物の繰り返しを書き出すスペースがありません。カールがこれを行うために必要なオプションの。)


非常に素晴らしい。ファイル内のすべてのURLでそのコマンドを実行できますか?
マヌー

1
@Manu:はい、curlコマンドをまとめる1つの可能な方法を示すために、回答を編集しました。url-list.txtには1行に1つのURLが含まれていることを前提としています。
フィル

1
上記のandswerのスクリプトが常に出力で000を取得する理由はわかりませんが、ループなしでコマンドを1回だけ実行すると、機能します...
Karol F

1
@KarolFiturski私は同じ問題を抱えていました(おそらくそれ以来修正されていますが、誰かがこれに遭遇した場合に備えて...)私の場合、入力ファイルの行末にキャリッジリターンがあり、URLが次のようになりましたhttp://example.com/\rループを通過するとき
ジョーダンロビンソン

1
この問題が発生し、行末をWindowsタイプからLinuxタイプに切り替えることで修正できました。
トリスタン

38
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

ステータスコードのみを出力します


9
+1 URLがリダイレクトされるときに、それぞれが改行で複数のコードを表示します。
Ashfame 2012

--spiderを削除して、私が作成しようとしていた要求で機能するようにする必要がありましたが、機能します。
amitavk 2015

30

フィルによってすでに提供された答えを拡張します。呼び出しにxargsを使用する場合、並列処理を追加するのは簡単です。

ここにコードがあります:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst

-n1 :(リストからの)1つの値のみをcurl呼び出しの引数として使用します

-P10:いつでも10個のカールプロセスを存続させます(つまり、10個の並列接続)

write_outそれを使用して抽出できるその他のデータ(時間など)については、curlのマニュアルのパラメーターを確認してください。

それが誰かを助ける場合、これは私が現在使用している電話です:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv

大量のデータをcsvファイルに出力するだけで、Officeツールにインポートできます。


2
並列処理、ファイル入力、およびcsv。まさに私が探していたもの。
Agey 2016年

素晴らしい、私の一日を作りました。
xlttj 2017年

これはすごいです、まさに私が探していたものです、ありがとうございます。1つの質問ですが、csv結果にページのページタイトルを含めるにはどうすればよいですか?
MitchellK

@estani - stackoverflow.com/users/1182464/estani 1は、.csvファイルにページのページタイトルを取得含めることができますか。再投稿して申し訳ありません。この質問について通知が届くように、タグを付けるのを忘れました。どうもありがとう。
MitchellK

@MitchellKこれはhttp呼び出しの内容をまったく処理していません。「ページタイトル」(それが何であれ)がURLにある場合は、それを追加できます。そうでない場合は、ページ全体を解析してその「タイトル」を抽出する必要があります(httpによって取得されたhtmlページを意味すると仮定します)。スタックオーバーフローで他の答えを探すか、その特定の質問をしてください。
estani 2017

15

これは、wgetAlpine Linuxでも、ほとんどどこにでも存在する、広く利用可能なものに依存しています。

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

説明は次のとおりです。

--quiet

Wgetの出力をオフにします。

ソース-wgetのmanページ

--spider

[...]ページはダウンロードされず、そこにあることを確認するだけです。[...]

ソース-wgetのmanページ

--server-response

HTTPサーバーから送信されたヘッダーとFTPサーバーから送信された応答を出力します。

ソース-wgetのmanページ

彼らが言っていないの--server-responseは、それらのヘッダー出力が標準エラー(sterr)に出力されるため、stdinにリダイレクトする必要があるということです。

出力は標準入力に送信されawk、HTTPステータスコードを抽出するためにパイプすることができます。そのコードは:

  • 2番目の($2)空白でない文字グループ:{$2}
  • ヘッダーの最初の行: NR==1

そして、我々はそれを印刷したいので... {print $2}

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

1
私は、このいずれかを使用2>&1 | head -1 | awk '{ print $2 }'
Evhz

7

使用するcurlHTTPヘッダのみ(全体ではなくファイル)を取得し、それを解析します:

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200

wgetが404と言うと、curlは200を教えてくれます... :(
Manu

この-Iフラグにより​​、curlはHTTP HEADリクエストを作成します。これは、一部のサーバーでは通常のHTTP GETとは別に扱われるため、異なる値を返す可能性があります。コマンドはそれがなくても機能するはずです。
lambshaanxy 2012

4

wget -S -i *file* ファイル内の各URLからヘッダーを取得します。

ただしgrep、ステータスコードを具体的にフィルタリングします。


1

私はPythonで書かれたツール「webchk」を発見しました。URLのリストのステータスコードを返します。 https://pypi.org/project/webchk/

出力は次のようになります。

▶ webchk -i ./dxieu.txt | grep '200'
http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.389)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)

お役に立てば幸いです。


0

以下のためにhttps://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(並列ジョブからの出力xargs混合されるリスクが)、私はGNUが平行ではなく、使用するxargs並列化します:

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile

この特定のケースではxargs、出力が非常に短いため安全に使用できる可能性があります。したがって、使用の問題xargsは、後で誰かがコードを変更してより大きなことを行うと、安全でなくなることです。または、誰かがこの質問を読んで、curl他のものに置き換えることができると思った場合、それも安全ではない可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.