如何获取给定URL的高分辨率网站标志(收藏夹图标)

28
我正在开发一个Android上的网络浏览器,想要像Chrome一样展示最常访问的网站的URL标志(4 X 2)。但问题在于大多数网站图标(例如:http://www.bbc.co.uk/favicon.ico)的尺寸为16X16或32X32,当放大时它们看起来不好看。
有没有一种标准方法可以下载URL的高分辨率图标/位图?打开主页然后提取所有图像链接,然后选择一个名称中带有“logo”的图像如何?这种方法对所有URL都适用吗?我想知道是否有一种标准方法可以获取给定URL的高分辨率图标,或者favicon是获取网站标志的唯一标准方法?

1
Firefox会对经常访问的页面进行截图,并将它们作为缩略图排列在起始页上。我认为这是最好的方法。除此之外,除了网站图标之外,没有标准化的方法。您可以扫描页面的标题区域,并尝试找到其中通常最左边最大的图像,这被认为是网站的标志。您可以分析最流行的CMS和博客软件,寻找一些常见的标志标记或排列模式。这也与此相关:http://googlewebmastercentral.blogspot.com/2013/05/using-schemaorg-markup-for-organization.html - tiguchi
Chrome通过有效地对呈现的网页进行截屏,然后将其缩小到适当的大小来完成此操作。您的浏览器能否做到这一点? - adrianwadey
我可以从webView中获取快照,但问题在于,当我们在移动设备上显示多个快照时,它没有太多意义。此外,我必须保存移动设备上所有访问过的页面的快照。相反,我正在寻找一种动态下载图像的解决方案。 - AndroidDev
@Nobu,我可以从webView中获取快照,但问题是在移动设备上显示多个快照时并没有太多意义。此外,我必须保存移动设备上所有访问过的页面的快照。我会尝试让最左边最大的图像成为大多数情况下的标志。 - AndroidDev
你需要浏览器历史记录列表中的这些标志或图标吗?您仍然可以裁剪和缩小这些屏幕截图,并创建类似于Android任务切换器的某种视觉效果。但是,如果标志检测对您有用,那也没问题。您只需要一些备用行为,以防您的浏览器无法检测到标志。 - tiguchi
7个回答

58

您可以自己编写代码或使用现有解决方案。

自行编写算法

  1. 在代码中查找苹果触摸图标声明,例如 <link rel="apple-touch-icon" href="/apple-touch-icon.png">。这些图片的尺寸从57x57到152x152不等。请参阅苹果规格获取完整参考。
  2. 即使找不到苹果触摸图标声明,请根据苹果命名约定尝试加载它们。例如,你可能会在/apple-touch-icon.png找到一些东西。再次参阅苹果规格以获取参考。
  3. 在代码中查找高清PNG网站图标,例如 <link rel="icon" type="image/png" href="/favicon-196x196.png" sizes="196x196">。在此示例中,您有一个196x196的图片。
  4. 查找Windows 8 / IE10和Windows 8.1 / IE11平铺图片,例如 <meta name="msapplication-TileImage" content="/mstile-144x144.png">。这些图片的尺寸从70x70到310x310甚至更大。请参阅Windows 8Windows 8.1的参考资料。
  • 查找 /browserconfig.xml,这个文件专门为 Windows 8.1 / IE11 设计。在这里你可以找到网站瓷砖图片的另一种位置。请参阅Microsoft规格说明
  • 查找 og:image 声明,例如<meta property="og:image" content="http://somesite.com/somepic.png"/>。这是网站向FB/Pinterest/whatever指示其首选图片的方式。请参考Open Graph Protocol
  • 此时,你没有找到合适的标志... 可恶! 你仍然可以加载页面上的所有图片并猜测选择最佳的一张。
  • 注意:步骤1、2和3基本上是Chrome获取书签和主屏幕链接的合适图标所做的事情。Opera的Coast甚至使用MS瓷砖图片完成任务。阅读此列表以确定哪个浏览器使用哪个图片(完整披露:我是这个页面的作者)。

    API和开源项目

    RealFaviconGenerator:你可以使用这个favicon检索API获取任何网站的favicon或相关图标(如触摸图标)。完整披露:我是这个服务的作者。

    BestIcon:虽然不太全面,但Besticon提供了一个很好的替代方案,特别是如果你想自己托管代码。还有一个可直接使用的托管版本


    你能否写一个Java类来完成这个任务?可以使用Jsoup,这样给定一个URL,就可以提取出标志吗?我在第5步卡住了。 - learner
    1
    喜欢使用RealFaviconGenerator。谢谢! - grigb
    1
    这个目的是否有任何客户端库可用? - Shivam Yadav
    1
    RealFaviconGenerator是一个很棒的网站。 - Dawoodjee
    1
    “获取网站的网站图标”页面上的“浏览文档”链接已损坏。 - user137369
    显示剩余7条评论

    11

    https://github.com/mat/besticon 的 Go 代码尝试解决这个问题。

    例如:

    $ besticon http://github.com 
    http://github.com:  https://github.com/apple-touch-icon-144.png
    

    此外,还有一个配套的托管版本的代码,例如请查看http://icons.better-idea.org/icons?url=github.com

    (免责声明:我之所以写这个代码,是因为我一段时间前也需要解决同样的问题。)


    有没有一种简单的方式可以在Java中使用这段代码?就像“ScriptEngine”那样。 - learner
    我还没有考虑过在其他环境中使用Go代码的可能性/可行性。话虽如此,我相信从Java中使用这个最简单的方法是使用URL API,其中一个Java的HTTP客户端提供了该API。 - mat
    Jiahaog在这里有一个JavaScript实现的版本(https://github.com/jiahaog/page-icon)。 - Qix - MONICA WAS MISTREATED
    很不幸,Besticon托管的实例@icons.better-idea.org是一个无法使用的服务器。Github项目使用了一个更近期的托管演示@herokuapp,但该服务提供商最近终止了他们的免费服务层。在Github讨论中已经提出了替代的免费托管服务建议。 - chronometric

    4

    0

    这个 HTML 文档需要一个基本的 URL 和网页的 HTML/"查看页面源代码",并应输出值。

    <!doctype html>
    <input type=text placeholder=URL><br>
    Place "View Page Source" of HTML homepage<br>
    <textarea id=HTML placeholder="HTML content of webpage">
    </textarea><br>
    <input type=Submit>
    <script>
    function url(u,n){
      try{
        u = u.getAttribute(n);
      }
      catch(e){
        return 'null';
      }
      if(u.slice(0,2) == "//"){
        u = "http:"+u;
      }
      else if(u.slice(0,1) == "/"){
        u = u.slice(0,1);
      }
      return '<img src="'+u+'">';
    }
    
    document.querySelector('input[type=Submit]').onclick = function(){
    var output = '';
    var HTML = document.getElementById('HTML').value;
    var doc = document.implementation.createHTMLDocument("New Document");
    doc.documentElement.innerHTML = HTML;
    
    output = output + "apple-touch-icon<br>"+url([].slice.apply(doc.querySelectorAll('link[rel="apple-touch-icon"]')).reverse()[0],'href')
    // deprecated output = output + "apple-touch-icon-precomposed<br>"+url([].slice.apply(doc.querySelectorAll('link[rel="apple-touch-icon-precomposed"]')).reverse()[0],'href')
    
    output = output + "<br>image/png<br>" + url(doc.querySelectorAll('link[rel="icon"][type="image/png"]')[0],'href');
    // <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    // deprecated output = output + "<br>msapplication-Ti:<br>"+ url(doc.querySelectorAll('link[name="msapplication-TileImage"]')[0],'content');
    // <meta name="msapplication-config" content="/browserconfig.xml/ ">
    //output = output + "<br>msapplication-con: "+ url(doc.querySelectorAll('meta[name="msapplication-config"]')[0],'content');
    // <meta property="og:image" content="http://somesite.com/somepic.png"/>
    output = output + "<br>og:image<br>" + url(doc.querySelectorAll('meta[property="og:image"]')[0],'content');
    // <link rel="image_src" href="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a"> 
    output = output + "<br>image_source<br>" + url(doc.querySelectorAll('link[rel="image_src"]')[0],'href');
    
    
    var URL = window.location.hash;
    
    document.getElementById('output').innerHTML = output;
    };</script>
    <div id=output></div>
    

    如果您想自动检索HTML,可以使用类似以下PHP代码的方式。
    <? echo file_get_contents($_GET["url"]); 
    

    0

    Logo的命名不会一致,很难保持一致的识别。考虑将网站图标放在适当尺寸的彩色瓷砖上。人们会很快将颜色与网站联系起来。您可以使用类似colorthief的工具从网站或网站图标中提取主要颜色,或者使用黄金角公式选择每个图标的独特色调。


    0

    这里有一个新的真正解决方案,它将始终为您提供最佳结果-

    1. Webchromeclient会为所有网站提供onReceivedTouchIconUrl方法的回调,只需从此处获取url即可。
    2. 下一步是将此url转换为位图,可以像这样完成:

      try {
          URL url = new URL(touchiconUrl);
          HttpURLConnection connection =
                  (HttpURLConnection)url.openConnection();
          connection.setDoInput(true);
          connection.connect();
          InputStream input = connection.getInputStream();
          Bitmap myBitmap = BitmapFactory.decodeStream(input);
          return myBitmap;
      } catch (IOException e) {
          e.printStackTrace();
          return null;
      }
      
    3. 下一步是将此位图发送到快捷方式。

    注意:记得在后台线程上创建位图,例如异步任务。


    -3
    通常 favicon 很小(如 16x16 或 32x32)。如果你需要更大的尺寸,则应从主页/标头中提取标志,而不是图标。

    1
    标志是否保证始终出现在页眉中?如果网页包含多个图像元素,我们如何知道哪个元素对应于标志? - AndroidDev
    @Harish 现代浏览器会自动检测位于根目录下的网站图标,您不需要在网站中包含网站图标代码。如果您的网站上已经有了网站图标,只需放置更高分辨率的图像即可。 - Justinas

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接