ブラウザを開かずに、あるいは GUI ツールを使わずに、サイトの favicon を取得したいことがあります。アセット監査の自動化に取り組んでいる、あるいは単にターミナルでの作業のほうが好みという場合もあるでしょう。そんなときに適しているのが curl です。ただし、その特有のクセを把握しておく必要があります。本記事では、デフォルトパスからの単純な取得から、HTML を解析してカスタムアイコンを取り出すところまで、curl で favicon をダウンロードするための具体的なコマンドを順を追って紹介していきます。
ここでは curl がすでにインストールされている前提で進めます(macOS や Linux では標準で付属しており、Windows でも入手可能です)。追加の依存関係は一切ありません。
ステップ 1: デフォルトの favicon.ico パスを試す
多くのサイトでは今でも /favicon.ico というファイルを提供しています。これを取得する最も手軽な方法は次のとおりです。
curl -O https://example.com/favicon.ico-O フラグは、リモート側と同じファイル名で保存するものです。もしサーバーが 404 を返してきた場合、保存されるのは HTML のエラーページで、ファイル名は favicon.ico のままとなり、意図したものとは異なります。そこで、HTTP エラー時にはメッセージを出さずに失敗扱いとする -f を併用します。
curl -f -O https://example.com/favicon.icoこれで、ファイルが存在しないときには curl がエラーステータスで終了するようになるため、スクリプト側で適切にハンドリングできます。
ステップ 2: リダイレクトを追従する
多くのサイトでは /favicon.ico を CDN や別のパスへリダイレクトしています。-L を付けないと、curl はそのリダイレクトを追わないため、得られるのは 301 のレスポンスボディにすぎません。リダイレクトを辿らせるには -L を追加します。
curl -L -f -O https://example.com/favicon.ico「curl で favicon をダウンロードしたのに、中身が空っぽだったり極端に小さなファイルしか返ってこない」というケースでは、このオプションが抜けていただけ、ということがほとんどです。
ステップ 3: カスタムアイコンのリンクを HTML から抽出する
近年のサイトでは、<head> 内の <link rel="icon"> タグでアイコンを宣言するのが一般的です。WHATWG の HTML 仕様では、rel=icon がページとアイコンを結びつける標準的な手段として定義されています(仕様)。これらの URL を見つけるには、ページを取得して rel="icon" を grep します。
curl -sL https://example.com | grep -o '<link[^>]*rel="[^"]*icon[^"]*"[^>]*>'これで link タグがそのまま出力されます。実際の出力はたとえば <link rel="icon" href="/assets/favicon-32.png" sizes="32x32"> のような形になります。この href の値を取り出したら、curl でダウンロードすれば OK です。
curl -L -f -O https://example.com/assets/favicon-32.pnghref が相対パス(/ で始まる場合)なら、先頭にドメインを追加します。より堅牢な方法としては、HTML を適切に解析できる Python や PHP などのツールを使用してください。
Step 4: 複数の icon format に対応する
サイトによっては、SVG、PNG、ICO、Apple Touch など、複数の icon が宣言されている場合があります。それらを loop 処理できます。次の bash スニペットは、すべての rel="icon" と rel="apple-touch-icon" link をダウンロードします。
curl -sL https://example.com | grep -oE 'href="[^"]+\.(ico|png|svg)"' | cut -d'"' -f2 | while read -r path; do
url="https://example.com${path}"
curl -L -f -O "$url"
done必要に応じて、ドメインとパスの処理を調整してください。サイトの icon stack を audit するامجに便利です。
よくある落とし穴
-Lの付け忘れ:redirect によって空ファイルが保存されます。favicon をダウンロードするときは、必ず-Lを使用してください。-fの付け忘れ:curl は icon であるかのように error page を保存してしまいます。HTTP error で失敗するように-fを使用してください。- 相対 URL:HTML 内の
hrefは相対パスになっている場合があります。page URL を基準に解決する必要があります。 - Content-Type の不一致:一部の server では、存在しない icon に対して
text/htmlが返されます。file favicon.icoでファイルを調べ、画像であることを確認してください。 - SVG favicon:サイトが SVG favicon を使っている場合、curl では問題なくダウンロードできますが、一部の古い tool は SVG を扱えません。必要に応じて変換してください。
より自動化する方法として、favicon 専用の downloader の使用も検討してください。favicon のダウンロード方法に関するガイドでは、curl を補完する browser の的小技や API method を解説しています。
まとめ
redirect、error handling、HTML parsing に注意すれば、curl で favicon をダウンロードするのは_logs/_logs относительно straightforward です。デフォルトの /favicon.ico path から始め、信頼性を高めるために -L -f を追加し、特定|format が必要になったときは HTML を解析してください。これらの手順を使えば/sites/file.html#site-panel で、任意のサイトの favicon ダウンロードをスクリプト化できます。