基于sitemap的链接收集

0 sitemap基础

sitemap反映了一个网站网页的整体结构示意图。通过该网页,站长会将需要被抓取的页面全部列出来。
sitemap允许级联。按照[1],sitemap允许三种格式:txt、xml、索引格式。
但实际上,大量网站使用普通的html网页作为sitemap链接,因此html网页也需要考虑。

1 sitemap的用途
sitemap将网站需要被抓取的页面全部列出来,因此该页面一般在站长更新网站内容后更新,可以较好的反映网站内容的实时变化,方便了爬虫的实时抓取。

但另一方面,sitemap是站长主动向大的搜索引擎提交的,因此这些sitemap页面的具体地址并不固定,理论上是可以是任何形式的链接。那么我们如何找到这些链接了?

2 寻找网站的sitemap链接
对sitemap地址进行简单的分析后,个人认为主要可以从以下几个方面来收集sitemap链接:
a Robots中的sitemap指令
Robots.txt中通过sitemap指令来指示sitemap链接的地址,因此我们可以通过对网站的Robots.txt进行解析得到。
eg:http://zhanghanyang.lofter.com/robots.txt

b 首页锚文本发现
如果首页存在指向sitemap页面的链接的话,一般其锚文本为如下几种:
站点地图
网站地图
网站导航
所以这一步可以通过对host首页进行解析得到。
eg:http://redicecn.com/中的网站地图。

c 固定地址尝试
sitemap页面通常放在一些固定的地址,比如http://www.williamlong.info/的sitemap页面就是http://www.williamlong.info/sitemap.asp.

观察了下,这些链接是常用的sitemap链接:
/sitemap.xml
/sitemap.txt
/sitemap.html
/sitemap.htm
/sitemap.php
/sitemap.asp
/sitemap.jsp
/sitemap_baidu.xml
/sitemap

另外,对于个人博客来将,通常会有专门的插件来生成sitemap地址,不同的插件生成的默认地址一般不同。比如对DedeCms建站系统,默认路径是/data/sitemap.html。
我们可以进一步调研下常用的sitemap自动生成插件,查看下他们的默认路径。

d 人工注入
这个必须可以嘛。

3 基于sitemap的链接收集
要注意,我们的目的是搜集网站的新链接,而收集sitemap链接只是为了更好的发现这些链接。

因此对于这样1个系统,应该主要由两个子系统组成,一个是sitemap本身的链接发现,另一个就是基于sitemap链接来收集网站的新链接。
sitemap本身的链接发现在上个部分已经进行了汇总,为了简便与可扩展,这应该作为1个独立的子系统。

3.1 sitemap本身的链接发现
a 输入:一批domain
> 生成该domain的robots链接、首页链接并抓取
> 解析Robots页中的sitemap指令执行的链接,首页中锚文本为网站地图、站点题图等链接
> 输出上述链接集合作为S1

S1 + 人工注入的sitemap链接作为集合S2 + 猜测可能的sitemap地址<猜测的方法见上一节>作为集合S3
就是Sitemap链接的种子,将这批数据注入到第二个子系统。

补充说明:在第一轮链接发现后,不需要频繁的进行新sitemap链接发现,只需要人工注入几个未发现的domain的sitemap地址即可。

3.2 基于sitemap链接来收集新链接
a 数据的存储:
我们怎么来存储这些sitemap链接了?要记得的一个要点是存储这些sitemap链接是为了之后调度,再更好的发现新增的网页内容链接。
之前我曾考虑过按host来设计这个子系统,因为一般来说,1个网站我们只需要考虑1个有效的sitemap地址。
但经过实践,这样会很复杂,也不便于扩展。按照sitemap最标准的格式,是允许链式指向的,也就是sitemap链接里也可以包含sitemap链接,这会导致存储这些包含关系很复杂;另一方面,考虑到可以将该系统扩展到其他类似系统,按host或者domain来设计不够灵活。因此最好还是一个单独的sitemap链接作为1个单独的key,其他相关属性作为value。

数据的重复性
一开始按domain来设计还有一个考虑的原因,就是一个网站通常会提供多个sitemap链接,这些sitemap链接包含的内容应该是等价的。按照我们第一个子系统的方案,1个domain最多有10个左右的可能sitemap链接,会导致10倍左右的额外存储开销。

但最后考虑到系统复杂性、容错与可扩展性,还是允许这些的冗余存在。现实的情况是,我们很难保证1个网站今天使用这个sitemap链接,难保1个月之后不使用其他的sitemap链接,因此使用唯一的sitemap链接是不现实的。另一方面,因为现实中大部分网站只有1~2个sitemap链接,再加上合理的调度方案,这不会导致系统其他组件的过多开销。由于sitemap链接是针对domain级别的,整个存储总量也并不大。

b 调度
只要能不断的发现新的链接即可。调度的频率可以根据实际资源<比如爬虫>分配。

c 抓取
由于对同一个domain最多只有10个左右的链接,因此对网站不存在较大压力,只要网络带宽足够,可以很快的抓完。

d 解析
根据前面的描述,sitemap链接有几种可能的表现形式(txt、html、xml),我们需要对这些一一解析。两个子系统可以共用1个解析模块。

e 垃圾页
可能会存在一些spam,反复修改sitemap中的链接。这个需要其他模块反馈。
比如对于这种sitemap链接http://gzfriendly.com/sitemap.xml,里面包含了大量不属于该domain的链接,解析时可直接过滤掉。

f 反馈
抓取成功率、抓取的性能;贡献的好链接数等。

4 系统的可扩展性
类似的,我们可以将该系统扩展到类似于网站主动提供内容索引页的系统,实时且方便。实时爬虫通常需要这些变化快的链接,相同点都是提取出新产生的url链接,计算合理的更新频率并进行调度。比如RSS页、hub页的收集。

5 致谢
感谢@redice的帮助,在sitemap的链接发现过程中,提供了诸多帮助。

附:参考
[1] 百度sitemap文档

http://zhanzhang.baidu.com/wiki/93

[2] google sitemap文档

https://support.google.com/webmasters/topic/8476?hl=en

[3] Google Sitemaps使用指南

http://www.williamlong.info/archives/327.html

[4] robots中的sitemap指令

http://en.wikipedia.org/wiki/Robots.txt#Sitemap

此条目发表在 搜索引擎 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>