目前我用 md5 值去监控网页是否更新,但是这个涉及一个问题,就是每次都需要下载完成网页,目前我 DB 有 200 万 URL 按这个方法去更新网页,每次都要重新抓取这 200 万网页实在太慢了(而且还有目前还有增量),有什么好的办法可以更好的监控网页是否改变吗?
整理了一下大家的想法,核心还是构建一个自己的权重算法,主要从这么几个方向: 1.根据last-modify-date content-lenguht这两个字段 2.提取目标内容做一个指纹 3.抓取效率改进,
|
shinyJul 22, 2016
1
有的内容有 etag 和 last-modified 可以使用;
并发抓取; 云服务器弹性分配资源来抓取 爬虫本来就是费服务器的东西,可以考虑按网站权重分配爬虫资源。 |
|
shinyJul 22, 2016
2
用 md5 摘要可能不是很好的办法,因为略微细小的变动就会认为是全新的页面(如果你需要的是正文的话)
|
|
3
@shiny last-modified 这个不是特别可靠,我主要还是抓取电商这类,他们都有 cdn , cdn 每天会全站更新 last-modified 这个字段,没有什么用,权重这块我考虑过了,但是没想好怎么弄
|
|
liangmishiJul 22, 2016
4
赞成按网站权重分配爬虫资源,经常检测到更新的网站就多去几次。
|
|
5
@SlipStupig 此外,部分网站会定时更新,可以用算法检测,能够节约带宽。
|
|
6
2 亿级路过。。。你要做的这个其实已经相当深入了。
额外增加一个更新频率的字段用来生成爬取队列,不常更新的在多次爬取后延后处理就行了,整个系统的资源使用率会下来一部分(虽然一开始还是需要一定的资源)。 |
|
wannianmaJul 22, 2016 via iPhone
7
记录更新时间,更新频率越低,相应的降低爬取频率!
|
|
wannianmaJul 22, 2016 via iPhone
9
@SCaffrey 记录上次更新时间。如何判断是否更新,因网页而异。大体思路就是,如果当前网页上次更新时间距离很久,爬取权重较低,当然不是不爬,爬取后未更新,最后更新时间距离距当前时间更久,爬取权重更低,根据爬取权重决定爬取频率。思路是这样,细节还要思考
|
|
10
@shiny 算法能提个方向么?
|
|
11
恐怕很难,即便 Http 头里有缓存标记 那么也至少要 Get 一次吧?你不想下载网页就想知道网页是否更新不觉得矛盾?除非被爬取站给个 API ?
|
|
ytmsdyJul 22, 2016
12
只能设置重新抓取的频率了,无论什么监控算法,前提就是要把网站的信息爬下来对比才知道。
|
|
13
@cyang 头部还好, GET 请求一下就返回一个头部就完事了,内容就大了少的 2kb ,大的几十 kb ,缓存标记基本上没什么作用
|
|
knightdfJul 22, 2016
14
只能自己记个更新时间然后按频率更新
|
|
tabris17Jul 22, 2016
15
把网页根据更新频率标注等级
|
|
17
|
|
18
@Comdex 去猜测正文内容变化?
|
|
ComdexJul 22, 2016
19
@SlipStupig 提取正文再判断成本很高啊,现在提取正文正确率也还不行啊,所以关注点是网页有多少内容变化了的,这个不知咋解决
|
|
20
@Comdex 正文预测这块我做过,准确率还不错,反而是更新多少这个概念比较虚
|
|
21
提供一个思路,可以用 HEAD 方法请求网页的头部信息,可以判断 content-length 大小的变化。从直觉上看,网页内容变化了, content-length 大概率会变化。
|
|
22
@JoeShu 这个准确性不行吧
|
|
yutian2211Jul 22, 2016
23
@JoeShu HEAD 方法出的结果 可作为一个参考值,如果无变化,延后抓取
|
|
24
@yutian2211 出什么结果作为参考?
|
|
FindHaoJul 24, 2016
25
他们的网页有 site map 吗,比如类似我这个。。
http://www.findspace.name/post.xml |
|
maficJul 24, 2016
26
楼主怎么解决 跪求解决方案。现在同样遇到此问题
|
|
ezrealJul 24, 2016
27
咦,我也在做这东西。
|
|
lancemoonJul 24, 2016
28
转成图片,进行相似计算呢
或者文字的也是同样的道理 |
|
29
@lancemoon 网页转成图片我不知道有什么意义,文字的话还不是得下载完成所有的内容,进行相似度计算比 hash 计算更慢啊!
|
|
30
@mafic 目前考虑设计一个权重算法用然后用 hash 一致性去调度多个 worker
|
|
31
@FindHao 没有啊!
|
|
x8Jul 25, 2016
32
我给你分析一下这个问题:
首先网页是否修改,你有两种方式获知,一种是网页的在修改的时候主动发出一个通知告诉你,另一种是查询网页和历史纪录比较,得知是否修改。如果你是网页的拥有者,那么在网页修改的时候加一个触发机制通知你就行;如果你不是,那么就只有老老实实轮询。 如果你的需求是必须监控每一张网页的修改,那么就需要不断改善你的爬取性能,除了挨个爬取之外别无他法。 如果并不需要,那么你可以选择性轮询,对于修改频繁的网页,你查询频率调高一些,对于修改不频繁的网页,查询频率调低一些。可以写一个函数,用于评估网页修改是否频繁,然后以此分配爬取频率,争取最大化利用你有限的爬取资源。 对于网页是否修改,这个是你自己定义,哪种程度的内容改变算“修改”,需要你自己判断 |
|
yutian2211Jul 26, 2016
33
@SlipStupig content-length 如果变化了,正常抓取,如果没有变化,延后抓取,当然再辅助于权重设计
|
|
34
@yutian2211 我整理一下
|
|
WongzigiiMay 26, 2017
35
@SlipStupig 求分享
|
|
flynajSep 20, 2018
36
curl -I 参数,头没有变化基本内容不会变
|