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