从网页中提取“最佳”图像的技巧

9
我正在尝试为我的网站构建类似于Facebook“分享”功能的东西。
我已经能够接受URL,抓取元关键字,并适当地获取标题/描述,但我有点困惑如何确定用户可能想要分享的'可能'照片。
我目前使用SimpleXMLElement将页面转换为可遍历的DOM,并查找所有标签,将它们转换为绝对URL。之后,我不确定如何找到合适的缩略图。
我是否需要下载它们全部并按文件大小进行排序?我是否需要使用某种启发式方法,例如“在页面中间遇到”?
还有其他人有什么建议、建议或技巧吗?
2个回答

7

我之前写过一个类似的东西,从爬取的博客文章中获取图像。我的选择标准是获取页面上所有图片的列表,然后分配“优先级点数”:

  • 忽略AdBlocker列表中列出的黑名单中托管的图片
  • 忽略间接图像,例如在样式表中链接或在IFRAME中链接的图像
  • 忽略宽度或高度小于50像素的图像
  • 忽略重复出现多次的图像
  • 对来自白名单主机(例如photobucket、imageshack.us)托管的图像分配优先级点数
  • 将优先级点数分配给页面上最大的3个图像
  • 将优先级点数分配给同一主机上的图像
  • 将优先级点数分配给已定义ALT标签的图像
  • 将优先级点数分配给出现在P标签中的图像

然后选取具有最高优先级点数的那个。这当然不是万无一失或过于科学化,但它比不做任何事情要更常获得有用结果。


这就是我认为我要去的方向,但我非常感谢这个详尽的列表。我会尝试一下,看看能否添加自己的补充内容。 - Eddie Parker
我找到了上述项目的代码。大多数过滤已经完成,但我没有忽略出现在<li>和<h{1-6}>中的任何图像。曾经我还按照它们出现的顺序对图像进行权重分配,但被注释为“太扭曲”,所以我认为有充分的理由尽管我不记得当时为什么这样做... - nathanchere
启发式算法似乎效果不错,但目前唯一的问题是使用SimpleXMLElement将每个网页视为有效的xml文档时经常失败。你是用正则表达式实现的吗?还是有更好的解析器可以使用? - Eddie Parker
1
为了回答自己的问题,我发现DOMDocument :: loadHTMLFile [1]非常好用。[1] http://ca3.php.net/manual/en/domdocument.loadhtmlfile.php - Eddie Parker

3

我没有直接做过这个,所以不确定是否有任何具体的最佳做法,但总体而言,我认为启发式方法看几个因素会是有意义的,因为网站实现中存在的可变性。

我会查看两组项目:图像属性和放置图像的位置/方式的上下文。

图像属性:

  • 宽度和高度达到最小阈值
  • 纵横比合理(平铺背景图片可能具有极端的纵横比,这提供了图像可能不适合的很好指示)
  • 图像中存在多种颜色(难以检测,但可能避免使用各种背景图像)

图像上下文:

  • 页面上不重复使用图像(这避免了使用可以重复的图标和其他设计元素)
  • 出现在页面的h1、h2等标签之后;这与您关于图像来自页面中间的观点有关,再次避免设计元素。
  • 具有alt标记(虽然这并不一致使用,因此可能提供的有用信息不多)

我会对前面的项目进行加权,然后根据每个图像满足规则的程度对找到的图像进行排名。

另外,请注意,有些页面可能使用CSS(或Flash等)来显示图像。这些超出您定义的算法范围之外的图像;也许不是很重要,但需要考虑。


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