一个网页是否更新,是不少爬虫开发人员都会碰到的问题,若是只是一次性抓取来使用,那这个问题可有可无,抓一遍完事,可是工程中的爬虫一般须要长期运行,若是内容更新,须要及时抓取。html
这是一个常见的获取更新内容的思路,这种方式无状态,傻瓜式的,我并不须要知道网页到底更新哪些内容,我只要每次拿网页的内容去数据库里去重插入便可。 这种思路问题就是浪费资源。不管对方更新没有,都得去抓取一遍。web
RSS(简易信息聚合),一种基于XML格式的内容包装和投递协议,能够用于同步网页内容,目前适用于博客,新闻等。 这种思路问题是并非全部网站都提供RSS源的,虽然说有万能的rsshub,可是rsshub也是须要开发人员本身去维护的。算法
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 的修改时间写到请求里。app
3 若是网页更新了,服务器会返回一个 200 的应答,这时就从新抓取网页,更新本地文件。ssh
4 若是网页没有更新,服务器会返回一个304的应答。这时就不须要更新文件了。网站
这种思路的问题是这种方法适用于静态网页的更新,对于动态从服务器取数据的动态网页不适用。htm
这里的网页内容指的是网页的正文内容,不包括访问量等非关键区域文本。 网上提供的作法有网页指纹+海明距离的算法,两次抓取网页海明距离越大,变化越大,海明距离的大小须要根据实际条件调整。
网页判断更细没有固定套路,须要根据项目和网站状况,选择合适的方法进行判断。