你需要从某个网站抓取 favicon,但又不想打开浏览器或用 GUI 工具。也许是在自动化做资产审计,又或者只是更喜欢用终端。`curl` 正是这种场景的合适工具——前提是你得知道怎么处理那些坑。本文会带你逐步走一遍用 curl 下载 favicon 的具体命令,从最简单的默认路径,一路到解析 HTML 来取自定义图标。
我们假设你已经装好了 curl(macOS 和 Linux 默认带,Windows 上也能装)。不需要其他依赖。
Step 1: 试试默认的 favicon.ico 路径
大多数网站仍然会在 /favicon.ico 提供文件。最快的抓取方式是:
curl -O https://example.com/favicon.ico其中 -O 参数会沿用远程的文件名保存。如果站点返回 404,保存下来的会是一个 HTML 错误页,文件名却是 favicon.ico——显然不是你要的。加 -f 可以在 HTTP 出错时静默失败:
curl -f -O https://example.com/favicon.ico这样文件不存在时 curl 会以非零状态码退出,方便你在脚本里判断处理。
Step 2: 跟随重定向
不少站点会把 /favicon.ico 重定向到 CDN 或其它路径。不加 -L 的话,curl 不会跟随重定向,最后拿到的就是一个 301 响应体。加上 -L 让它跟随:
curl -L -f -O https://example.com/favicon.ico这是「curl 下载 favicon」拿回一个空文件或很小的文件时最常见的修复点。
Step 3: 解析 HTML 找自定义的 icon 链接
现代站点通常会在 <head> 里通过 <link rel="icon"> 声明图标。WHATWG HTML 规范把 rel=icon 定义为页面关联图标的标准方式(来源)。要找这些 URL,可以先抓页面再 grep rel="icon":
curl -sL https://example.com | grep -o '<link[^>]*rel="[^"]*icon[^"]*"[^>]*>'这条命令会把原始的 link 标签打印出来。你可能会看到类似 <link rel="icon" href="/assets/favicon-32.png" sizes="32x32"> 的内容,把里面的 href 值抽出来,再用 curl 下载:
curl -L -f -O https://example.com/assets/favicon-32.png如果 href 是相对路径(以 / 开头),请在前面补上域名。若想采用更稳妥的方式,可以使用 Python 或 PHP 来正确解析 HTML。
第 4 步:处理多种图标格式
网站可能声明多个图标,包括 SVG、PNG、ICO 和 Apple Touch 图标。你可以通过循环逐个处理。下面的 bash 脚本会下载所有 rel="icon" 和 rel="apple-touch-icon" 链接:
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根据实际情况调整域名和路径的处理方式。审计网站的图标组合时,这段脚本会很方便。
常见问题
- 缺少
-L:遇到重定向时,curl 会得到空文件。下载 favicon 时应始终使用-L。 - 没有
-f:curl 会把错误页面也保存下来,就像它们是图标一样。使用-f,让命令在出现 HTTP 错误时失败。 - 相对 URL:HTML 中的
href可能是相对路径。你必须根据页面 URL 解析出完整地址。 - Content-Type 不匹配:某些服务器在 favicon 不存在时会返回
text/html。可以使用file favicon.ico检查文件,确认它确实是图片。 - SVG favicon:网站使用 SVG favicon 时,curl 可以正常下载,但某些旧工具无法处理 SVG;如有需要,先进行转换。
如果想进一步实现自动化,可以考虑使用专门的 favicon 下载工具。我们这篇favicon 下载指南介绍了浏览器技巧和 API 方法,可以与 curl 配合使用。
总结
只要处理好重定向、错误处理和 HTML 解析,用 curl 下载 favicon 并不复杂。先从默认的 /favicon.ico 路径开始,加上 -L -f 提高可靠性;需要特定格式时,再解析 HTML。按照这些步骤,你就可以为任何站点编写 favicon 下载脚本。