【问题标题】:How can I get a web site's favicon?如何获取网站的图标?
【发布时间】:2021-12-21 16:57:14
【问题描述】:

很简单的问题:我创建了一个小应用程序,它基本上只是位于我的系统托盘中的收藏夹,这样我就可以从同一个地方打开常用的站点/文件夹/文件。从我的系统中获取已知文件类型的默认图标并不复杂,但我不知道如何从网站获取图标。 (例如,地址栏中有灰色->橙色堆栈图标)

有人知道我会怎么做吗?

【问题讨论】:

  • 我不确定自动加载/解析此页面有多容易(或可能),但它似乎拥有一切:Favicon-Checker。至少,您可以将其用作参考/检查。
  • 您可以使用Statvoo Favicon API,这样会非常快速且轻松。
  • Favicon Kit 允许您在sizes much larger than 16 pixels 中获取和嵌入像普通图像一样的网站图标(如果有)。 (披露:我是作者)

标签: c# .net-4.0 favicon


【解决方案1】:

您需要通过以下几种方式解决此问题:

  1. 在域的根目录中查找favicon.ico

    www.domain.com/favicon.ico

  2. 查找带有rel="shortcut icon" 属性的<link> 标记

    <link rel="shortcut icon" href="/favicon.ico" />

  3. 查找具有rel="icon" 属性的<link> 标记

    <link rel="icon" href="/favicon.png" />

后两者通常会产生更高质量的图像。


只是为了涵盖所有基础,有些设备特定的图标文件可能会产生更高质量的图像,因为这些设备在设备上的图标通常比浏览器需要的更大:

<link rel="apple-touch-icon" href="images/touch.png" />

<link rel="apple-touch-icon-precomposed" href="images/touch.png" />


要下载图标而不关心图标是什么,您可以使用像 http://www.google.com/s2/favicons 这样的实用程序来完成所有繁重的工作:

var client = new System.Net.WebClient();

client.DownloadFile(
    @"http://www.google.com/s2/favicons?domain=stackoverflow.com",
    "stackoverflow.com.ico");

【讨论】:

【解决方案2】:

2020 年更新

您可以在 2020 年以后使用以下三项服务

<img height="16" width="16" src='https://icons.duckduckgo.com/ip3/www.google.com.ico' />

<img height="16" width="16" src='http://www.google.com/s2/favicons?domain=www.google.com' />

<img height="16" width="16" src='https://api.statvoo.com/favicon/?url=google.com' />

【讨论】:

  • grabicon.com 现在是付费服务,每月 9 美元起
  • 另一个:favicon.allesedv.com
  • 谢谢@AO_,这些天我实际上在使用duckduckgo,我已经更新了我的答案
  • @AO_ 那么 stavoo api 只是 google 服务的包装器
  • @saintvixalien 我相信这对于不使用 API 密钥进行初始化的人来说最近发生了变化,因为服务器正在受到冲击;)我使用带有 API 密钥的主要服务并直接获得响应而无需包装器。我确实在没有 API 密钥的情况下进行了测试,它按照您所说的那样重定向到 Google 的服务..
【解决方案3】:

【讨论】:

【解决方案4】:

最好尽量减少每个页面所需的请求数。 因此,如果您需要多个图标,yandex 可以在一个查询中创建一个 favicon 精灵。 这是一个例子 http://favicon.yandex.net/favicon/google.com/stackoverflow.com/yandex.net/

【讨论】:

    【解决方案5】:

    首先要查找的是站点根目录中的 /favicon.ico; WebClient.DownloadFile() 之类的东西应该可以。但是,您也可以在元数据中设置图标 - 所以这是:

    <link rel="shortcut icon"
       href="http://sstatic.net/stackoverflow/img/favicon.ico">
    

    并注意可能有其他图标可用; “触摸”的往往是更大和更高的分辨率,例如:

    <link rel="apple-touch-icon"
       href="http://sstatic.net/stackoverflow/img/apple-touch-icon.png">
    

    所以您可以在 HTML Agility Pack 或 XmlDocument(如果是 xhtml)中解析它并使用 WebClient.DownloadFile()

    这是我用来通过敏捷包获取此信息的一些代码:

    var favicon = "/favicon.ico";
    var el=root.SelectSingleNode("/html/head/link[@rel='shortcut icon' and @href]");
    if (el != null) favicon = el.Attributes["href"].Value;
    

    注意图标是他们的,不是你的。

    【讨论】:

    • 谢谢马克。我很欣赏这个例子。 Wrt 图片,我不打算修改它们或将它们用于快捷方式标签旁边的上下文菜单中的图标以外的任何东西。
    【解决方案6】:

    您可以从网站的 HTML 中获取网站图标 URL。

    这里是favicon 元素:

    <link rel="icon" type="image/png" href="/someimage.png" />
    

    您应该在这里使用正则表达式。如果未找到标记,请在站点根目录中查找 favicon.ico。如果没有找到,则该网站没有网站图标。

    【讨论】:

      【解决方案7】:

      无需编程只需 3 个步骤即可完成:

        1。只需打开网站,右键单击并选择“查看源代码”,即可打开该网站的 HTML 代码。然后在文本编辑器中搜索 "favicon" - 它会引导您找到类似的内容

        &lt;link rel="icon" href='/SOMERELATIVEPATH/favicon.ico' type="image/x-icon" /&gt;

        获取href 中的字符串并将其附加到网站的基本URL(假设它是"http://WEBSITE/"),所以它看起来像

        http://WEBSITE/SOMERELATIVEPATH/favicon.ico

        这是网站图标的绝对路径。如果你没有通过这种方式找到它,它也可以在根目录中,在这种情况下,URL 是http://WEBSITE/favicon.ico

        2。获取您确定的 URL 并将其插入到以下代码的 href-Parameter 中:
        <html>
          <head>
           <title>Capture Favicon</title>   
          </head>
          <body>
            <a href='http://WEBSITE/SOMERELATIVEPATH/favicon.ico' alt="Favicon"/>Favicon</a> 
          </body>
        </html>
        
        3。将此 HTML 代码在本地(例如在您的桌面上)保存为 GetFavicon.html,然后双击打开它。它只会显示一个名为 Favicon 的链接。右键单击此链接并选择“将目标另存为...”,将 Favicon 保存在本地 PC 上 - 大功告成!

      【讨论】:

        【解决方案8】:

        这个问题是我一直在搜索网站图标API时得到的第一个谷歌搜索结果。所以我认为它在未来仍然会有所帮助。

        https://icon.horse/icon/[url.hostname] 会给你一个更好的网站图标。

        https://icon.horse/icon/stackoverflow.com

        【讨论】:

          【解决方案9】:

          2020 年,通过 CLI 使用 duckduckgo.com 的服务

          curl -v https://icons.duckduckgo.com/ip2/<website>.ico > favicon.ico
          

          例子

          curl -v https://icons.duckduckgo.com/ip2/www.cdc.gov.ico > favicon.ico
          

          【讨论】:

          • 非常适合我。
          【解决方案10】:

          有时,由于某些网站使用 .png 或其他图像扩展名,因此我们无法通过专门的解决方案获取网站图标图像。这是可行的解决方案。

          1. 使用 firefox 浏览器打开您的网站。
          2. 右键单击网站,然后单击列表中的“查看页面信息”选项。
          3. 它会打开一个对话框并点击“媒体”标签。
          4. 在该选项卡中,您将看到所有图片,包括网站图标。
          5. 选择 favicon.ico 图像或单击图像以查看哪个图像用作 favicon。一些网站也使用 .png 图片。
          6. 然后点击“另存为”按钮,您应该一切顺利。

          谢谢!

          【讨论】:

            【解决方案11】:
            HttpWebRequest w = (HttpWebRequest)HttpWebRequest.Create("http://stackoverflow.com/favicon.ico");
            
            w.AllowAutoRedirect = true;
            
            HttpWebResponse r = (HttpWebResponse)w.GetResponse();
            
            System.Drawing.Image ico;
            using (Stream s = r.GetResponseStream())
            {
                ico = System.Drawing.Image.FromStream(s);
            }
            
            ico.Save("favicon.ico");
            

            【讨论】:

              【解决方案12】:

              SHGetFileInfo(检查pinvoke.net 的签名)让您可以检索小图标或大图标,就像您处理文件/文件夹/Shell 项目一样。

              【讨论】:

                【解决方案13】:

                http://realfavicongenerator.net/favicon_checker?site=http://stackoverflow.com 为您提供网站图标分析,说明哪些网站图标以何种尺寸存在。您可以处理页面信息以查看哪个是质量最好的网站图标,并将其文件名附加到 URL 以获取它。

                【讨论】:

                  【解决方案14】:

                  你可以使用Getfv.co

                  要检索网站图标,您可以将其热链接到...http://g.etfv.co/[URL]

                  此页面的示例:http://g.etfv.co/https://stackoverflow.com/questions/5119041/how-can-i-get-a-web-sites-favicon

                  下载内容,我们走吧!

                  编辑:

                  Getfv.co 和 fvicon.com 看起来已经死了。如果你愿意,我找到了一个非免费的替代品:grabicon.com

                  【讨论】:

                  • 链接失效,错误:未找到
                  • @tttony 确实如此。 fvicon.com 看起来也死了。我将使用付费内容编辑我的评论。如果您找到一个有效的免费链接,请分享它!
                  【解决方案15】:

                  使用 jquery

                  var favicon = $("link[rel='shortcut icon']").attr("href") ||
                                $("link[rel='icon']").attr("href") || "";
                  

                  【讨论】:

                    【解决方案16】:

                    这是一个较晚的答案,但为了完整起见:很难接近获取 90% 的所有网站图标。

                    不久前我写了a WordPress plugin,试图接近100%。

                    这就是它的工作原理:

                    1. 首先搜索现有的网站图标存储库,例如 Google 网站图标和 GetFavicons 以查找网站图标。

                    2. 如果它们都没有返回图标,插件会尝试获取图标本身。这涉及遍历域上的多个页面。

                    3. 插件然后检查物理图像文件,因为在某些服务器上返回的文件包含不正确的 mime 类型。

                    代码仍然不完美,因为在细节中你会发现许多奇怪的情况:人们有错误编码的路径,例如img/favicon.ico 其中img 不在根目录中,HTML 输出中的标题重复,来自头部和正文的不同服务器响应等。

                    获取部分的核心is here,因此您可以对其进行逆向工程,但请注意应该验证响应(检查图像文件类型、mime 等)。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-11-17
                      • 2016-10-13
                      • 2015-07-08
                      • 1970-01-01
                      • 2021-03-09
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多