由于爬虫爬取的数据是为搜索引擎服务的。而搜索引擎是为互联网的数据做整合分类以便用户进行检索查看的。因此需要能感知互联网的数据的变化。
即对于爬虫已经爬取的数据还需要定期去重新抓取,以检测页面是否变化。
页面的变化我们将其划分为两类:
一: 页面仍存在,但是页面的内容改变了。我们称之为内容更新。由于搜索引擎是基于爬虫爬取的网页的内容建立索引提供用户检索的。
如果在爬虫爬去之后网页的内容改变了。则可能会产生用户检索一个query,搜索引擎基于旧的内容判断网页适合用户query高度相关并返回该页面
的url给用户。而更新后的页面可能和用户的query是完全不相关的。这就会影响用户的体验。 另外更新后的内容可能会帮助我们发现一些新的重要的
url链接。 这样的问题我们统称为更新检测。
二: 页面已经不存在了,即我们已经无法通过网页的url获取网页的内容(http code 200).这种称之为死链。 在用户搜索是我们将这样的url返回给用户,
用户点击后却无法正常打开。也是会影响用户体验的。 这样的问题我们称为死链检测
更新检测
由于更新检测是判断页面内容的变化。因此怎么判断页面变化就是我们关注的焦点。而如何定义页面的变化就是这部分需要考虑的问题。
最简单的方式可以对抓取的网页整体内容计算一个hash值用来标记其内容。然后比对不同的两次抓取的网页内容的hash值是否相同来判断页面内容是否变化。
有变化则仍未网页有更新。该种方式对于页面内容不变化的判断是准确的。即如果网页内容的hah值没有改变,那么网页的内容没有任何变化。我们说网页没有更新
是准确的。但是对于网页的更新则是粗略的。即网页的内容即使值改变了一个html标签或者改变了一个字符,计算的hash值就不同了。这时对我们来说网页就是改变的。
此时带来的问题是改变的阈值较低,可能我们判断的较多的改变是无效的。因为对一个网页来说,我们一般关注的为其正文的主题内容。其他部分的改变对我们来说是不
关注的。同时网页整体hash值的比对也无法获知页面的改变的程度。网页改变一个字符和整体网页内容的改变对网页整体hash值的比对是等价的。 一种改进的方案是
simhash的(参考http://www.cnblogs.com/linecong/archive/2010/08/28/simhash.html)方式。此时需要我们对页面划分区域。判断页面不同区域的改变情况来
感知页面的改变程度。而该问题在不同的搜索引擎公司会采取不同的实现方式。
死链检测
死链检测简单来说是根据抓取时返回的Http code。即之前可以获取到code200.而现在抓取则不能code200. 但是实际的情况要复杂的多。由于不同的httpcode 所代表的意义不同(参见:http://www.cnblogs.com/lovemdx/p/3189847.html 部分)。因此,同样不是200,还需要对不同的code做区分。比如3xx的code 代表的是跳转,此时代表网页内容还存在,但是需要通过另外一个url来访问。 而4xx的code则代表的是无法响应,网页的内容则可能不存在了。
注意我们上面用的是可能。这也是因为实际的情况比较复杂。我们爬虫获取的http code是4xx。但是实际的情况则有很多种可能。
可能之一: 对方对爬虫或者说仅仅是针对我们的爬虫做了处理,会持续或者偶尔返回4xx的code(有些站点当站点访问压力大时会返回不成功的code)。
可能之二: 对方的服务器不是很稳定,可能在该访问的时刻无法成功访问,返回该code。
可能之三: 该网页确实无法访问了。。
当然还有其他的可能。但是在各种可能之中,除了网页确实不能访问之外,我们都不应该判断为死链。因为当用户访问时,该网页还是有可能能被访问的。
但是如何判断是哪种可能是一个麻烦的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:爬虫那些事儿–页面变化检测策略 - Python技术站