Как я могу получить веб-сайт favicon?

Достаточно простой вопрос: я создал небольшое приложение, которое в основном является фаворитом, который сидит в моем системном лотке, чтобы я мог открывать часто используемые сайты/папки/файлы с одного и того же места. Получение значков по умолчанию из моей системы для известных типов файлов не очень сложно, но я не знаю, как получить значок с веб-сайта. (SO имеет значок grey- > оранжевого стека в адресной строке, например)

Кто-нибудь знает, как я могу это сделать?

Ответ 1

Вам нужно решить несколько способов:

  • Найдите favicon.ico в корне домена

    www.domain.com/favicon.ico

  • Найдите тег <link> с атрибутом rel="shortcut icon"

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

  • Ищите тег <link> с атрибутом rel="icon"

    <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

Вот 2 варианта, я проверил более 100 URL-адресов и получил разные результаты, которые каждый вариант. Обратите внимание, что это решение не С#, но С# может не понадобиться.

<img height="16" width="16" src='http://grabicon.com/edocuments.co.uk' />

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

Ответ 4

Первое, что нужно искать, это /favicon.ico в корне сайта; что-то вроде WebClient.DownloadFile() должно преуспеть. Однако вы также можете установить значок в метаданных - для SO это:

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

и обратите внимание, что доступны альтернативные значки; например, "touch", как правило, больше и выше res, например:

<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;

Обратите внимание, что значок принадлежит им, а не вашему.

Ответ 5

Это хорошая практика для минимизации количества запросов, необходимых каждой странице. Поэтому, если вам нужно несколько значков, yandex может сделать спрайт favicons в одном запросе. Вот пример http://favicon.yandex.net/favicon/google.com/stackoverflow.com/yandex.net/

Ответ 6

Yo может получить URL-адрес favicon с HTML-кода веб-сайта.

Вот тег favicon:

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

Здесь вы должны использовать регулярное выражение. Если тег не найден, найдите "favicon.ico" в корневом каталоге сайта. Если ничего не найдено, на сайте нет значка.

Ответ 7

        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");

Ответ 8

Вы можете сделать это без программирования. Просто откройте веб-сайт, щелкните правой кнопкой мыши и выберите "источник" , чтобы открыть HTML-код этого сайта. Затем в текстовом редакторе найдите "значок" - он направит вас на что-то похожее на

<link rel="icon" href='/SOMERELATIVEPATH/favicon.ico' type="image/x-icon" />

возьмите строку в href и добавьте ее к базовому URL-адресу веб-сайта (допустим, что это "http://WEBSITE/"), поэтому он выглядит как

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

который является абсолютным путем к знаку. Если вы не нашли его таким образом, это может быть и в корне, в этом случае URL http://WEBSITE/favicon.ico.

Возьмите указанный вами URL и вставьте его в следующий код:

<html>
  <head>
   <title>Capture Favicon</title>   
  </head>
  <body>
    <a href='http://WEBSITE/SOMERELATIVEPATH/favicon.ico' alt="Favicon"/>Favicon</a> 
  </body>
</html>

Сохраните этот код HTML локально (например, на рабочем столе) как GetFavicon.html, а затем дважды щелкните его, чтобы открыть его. Он отобразит только ссылку с именем Favicon. Щелкните правой кнопкой мыши по этой ссылке и выберите "Сохранить цель как..." , чтобы сохранить Favicon на вашем локальном ПК - и все готово!

Ответ 9

Это поздний ответ, но для полноты: довольно сложно получить даже около 90% выборки всех значков.

Некоторое время назад я написал плагин WordPress: http://wordpress.org/extend/plugins/wp-favicons/, который пытается приблизиться.

а. он начинается с просмотра репозиториев favicon, таких как favicons google, getfavicons и т.д.

б. если ни один из них не возвращает значок (я проверяю это, сопоставляя значок по умолчанию, который они возвращают)  я начинаю с попытки получить значок сам

с. это включает в себя перемещение страниц, но также проверку перенаправления с NO autoredirect, а также перемещение 404, потому что также на 404 может присутствовать значок. В конце это означает, что вам придется анализировать также перенаправления в заголовке html, а также переадресации javascript, чтобы приблизиться к 100%

д. после этого я делаю некоторые проверки в файле физического изображения, потому что иногда иногда на некоторых серверах (я тестировал 300 000+) файлы возвращаются с неправильным типом mime и т.д.

Код по-прежнему не идеален, потому что в деталях он сходит с ума, вы найдете много странных ситуаций: у людей есть ошибочно закодированные пути (img/favicon.ico, где img НЕ в корне), дубликаты заголовков в html-выходе, различные ответы сервера от головы и тела и т.д.

ядро ​​получаемой части находится здесь: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php, чтобы вы могли его развернуть, но помните, что проверка ответа должна действительно быть (проверка образа файла, mime и т.д.)

Ответ 10

Я обнаружил, что "SHGetFileInfo" (отметьте "www.pinvoke.net" для подписи) позволяет получить маленький или большой значок, точно так же, как если бы вы имели дело с файлом/папкой/элементом оболочки.

Jens;)

Ответ 11

Вы можете использовать Getfv.co:

Чтобы получить значок, вы можете его связать... http://g.etfv.co/[URL]

Пример для этой страницы: fooobar.com/questions/88521/...

Загрузите контент и отпустите!

Изменить:

Getfv.co и fvicon.com выглядят мертвыми. Если вы хотите, я нашел некую бесплатную альтернативу: grabicon.com.

Ответ 12

/fooobar.com/... дает вам анализ favicon, указывающий, какие значки присутствуют в каком размере. Вы можете обрабатывать информацию о странице, чтобы узнать, что является лучшим значком качества, и добавьте его имя файла в URL-адрес, чтобы получить его.

Ответ 13

Использование jquery

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