ブラウザを開かずに、あるいは 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.png

href が相対パス(/ で始まる場合)なら、先頭にドメインを追加します。より堅牢な方法としては、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 するامجに便利です。

よくある落とし穴

より自動化する方法として、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 ダウンロードをスクリプト化できます。