爬虫:如何判断一个网页已经更新?

4,340 阅读2分钟

一个网页是否更新,是很多爬虫开发人员都会碰到的问题,如果只是一次性抓取来使用,那这个问题无关紧要,抓一遍完事,但是工程中的爬虫通常需要长期运行,如果内容更新,需要及时抓取。

思路1:定期抓取

这是一个常见的获取更新内容的思路,这种方式无状态,傻瓜式的,我并不需要知道网页到底更新哪些内容,我只要每次拿网页的内容去数据库里去重插入即可。 这种思路问题就是浪费资源。无论对方更新没有,都得去抓取一遍。

思路2:RSS订阅

RSS(简易信息聚合),一种基于XML格式的内容包装和投递协议,可以用于同步网页内容,目前适用于博客,新闻等。 这种思路问题是并不是所有网站都提供RSS源的,虽说有万能的rsshub,但是rsshub也是需要开发人员自己去维护的。

思路3:If-Modified-Since 状态码

If-Modified-Since: 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified )维基百科, 示例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

If-Modified-Since可用于web缓存,它是HTTP header的一个部分,若HTTP响应有一个Last-Modified头,缓存可以使用If-Modified-Since头来发出一个条件请求,来查看它是否已经改变。

这种思路操作如下: 1 第一次先请求某个网页,抓取到本地,假设文件名为 a.html。这时文件系统有个文件的修改时间。

2 第二次访问网页,如果发现本地已经有了 a.html,则向服务器发送一个 If-Modified-Since 的请求。 把 a.html 的修改时间写到请求里。

3 如果网页更新了,服务器会返回一个 200 的应答,这时就重新抓取网页,更新本地文件。

4 如果网页没有更新,服务器会返回一个304的应答。这时就不需要更新文件了。

这种思路的问题是这种方法适用于静态网页的更新,对于动态从服务器取数据的动态网页不适用。

思路4:网页内容相似度比较

这里的网页内容指的是网页的正文内容,不包括访问量等非关键区域文本。 网上提供的做法有网页指纹+海明距离的算法,两次抓取网页海明距离越大,变化越大,海明距离的大小需要根据实际条件调整。

总结

网页判断更细没有固定套路,需要根据项目和网站情况,选择合适的方法进行判断。