关于爬虫监控网页的一个困惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
SlipStupig
V2EX    Python

关于爬虫监控网页的一个困惑

  •  
  •   SlipStupig 2016-07-22 00:02:20 +08:00 10424 次点击
    这是一个创建于 3367 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前我用 md5 值去监控网页是否更新,但是这个涉及一个问题,就是每次都需要下载完成网页,目前我 DB 有 200 万 URL 按这个方法去更新网页,每次都要重新抓取这 200 万网页实在太慢了(而且还有目前还有增量),有什么好的办法可以更好的监控网页是否改变吗?
    第 1 条附言    2016-07-22 10:21:53 +08:00
    大家想法基本上是基于权重算法去刷,除了权重以外还有什么可以补充的吗?
    第 2 条附言    2016-07-26 19:45:39 +08:00

    整理了一下大家的想法,核心还是构建一个自己的权重算法,主要从这么几个方向: 1.根据last-modify-date content-lenguht这两个字段 2.提取目标内容做一个指纹 3.抓取效率改进,

    感谢大家的热心帮助,我大概花一周时间实践后发一个demo出来

    36 条回复    2018-09-20 21:48:08 +08:00
    shiny
        1
    shiny  
       2016-07-22 00:12:33 +08:00
    有的内容有 etag 和 last-modified 可以使用;
    并发抓取;
    云服务器弹性分配资源来抓取

    爬虫本来就是费服务器的东西,可以考虑按网站权重分配爬虫资源。
    shiny
        2
    shiny  
       2016-07-22 00:13:27 +08:00
    用 md5 摘要可能不是很好的办法,因为略微细小的变动就会认为是全新的页面(如果你需要的是正文的话)
    SlipStupig
        3
    SlipStupig  
    OP
       2016-07-22 00:23:53 +08:00
    @shiny last-modified 这个不是特别可靠,我主要还是抓取电商这类,他们都有 cdn , cdn 每天会全站更新last-modified 这个字段,没有什么用,权重这块我考虑过了,但是没想好怎么弄
    liangmishi
        4
    liangmishi  
       2016-07-22 00:31:43 +08:00
    赞成按网站权重分配爬虫资源,经常检测到更新的网站就多去几次。
    shiny
        5
    shiny  
       2016-07-22 02:26:12 +08:00   1
    @SlipStupig 此外,部分网站会定时更新,可以用算法检测,能够节约带宽。
    Actrace
        6
    Actrace  
       2016-07-22 05:37:54 +08:00   1
    2 亿级路过。。。你要做的这个其实已经相当深入了。
    额外增加一个更新频率的字段用来生成爬取队列,不常更新的在多次爬取后延后处理就行了,整个系统的资源使用率会下来一部分(虽然一开始还是需要一定的资源)。
    wannianma
        7
    wannianma  
       2016-07-22 07:42:40 +08:00 via iPhone
    记录更新时间,更新频率越低,相应的降低爬取频率!
    SCaffrey
        8
    SCaffrey  
       2016-07-22 07:47:12 +08:00
    @wannianma 如何判断是否更新了呢……?
    wannianma
        9
    wannianma  
       2016-07-22 07:54:42 +08:00 via iPhone
    @SCaffrey 记录上次更新时间。如何判断是否更新,因网页而异。大体思路就是,如果当前网页上次更新时间距离很久,爬取权重较低,当然不是不爬,爬取后未更新,最后更新时间距离距当前时间更久,爬取权重更低,根据爬取权重决定爬取频率。思路是这样,细节还要思考
    SlipStupig
        10
    SlipStupig  
    OP
       2016-07-22 08:16:21 +08:00
    @shiny 算法能提个方向么?
    cyang
        11
    cyang  
       2016-07-22 08:45:16 +08:00
    恐怕很难,即便 Http 头里有缓存标记 那么也至少要 Get 一次吧?你不想下载网页就想知道网页是否更新不觉得矛盾?除非被爬取站给个 API ?
    ytmsdy
        12
    ytmsdy  
       2016-07-22 09:37:57 +08:00
    只能设置重新抓取的频率了,无论什么监控算法,前提就是要把网站的信息爬下来对比才知道。
    SlipStupig
        13
    SlipStupig  
    OP
       2016-07-22 09:56:12 +08:00
    @cyang 头部还好, GET 请求一下就返回一个头部就完事了,内容就大了少的 2kb ,大的几十 kb ,缓存标记基本上没什么作用
    knightdf
        14
    knightdf  
       2016-07-22 10:03:25 +08:00
    只能自己记个更新时间然后按频率更新
    tabris17
        15
    tabris17  
       2016-07-22 10:09:19 +08:00
    把网页根据更新频率标注等级
    mafic
        16
    mafic  
       2016-07-22 11:04:05 +08:00
    @Actrace 更新频率的话是人为更新 不知道咋处理,看到有定时处理的 百万级数据不知道靠谱不
    Comdex
        17
    Comdex  
       2016-07-22 12:31:25 +08:00   1
    @wannianma
    @SlipStupig 如何低成本地判断网页有了不小的更新?一般只关注网页的正文核心内容,假设网页中带有广告文字实时更新的话这样的更新无意义。。。
    SlipStupig
        18
    SlipStupig  
    OP
       2016-07-22 15:35:46 +08:00
    @Comdex 去猜测正文内容变化?
    Comdex
        19
    Comdex  
       2016-07-22 15:47:41 +08:00
    @SlipStupig 提取正文再判断成本很高啊,现在提取正文正确率也还不行啊,所以关注点是网页有多少内容变化了的,这个不知咋解决
    SlipStupig
        20
    SlipStupig  
    OP
       2016-07-22 15:54:27 +08:00
    @Comdex 正文预测这块我做过,准确率还不错,反而是更新多少这个概念比较虚
    JoeShu
        21
    JoeShu  
       2016-07-22 16:24:15 +08:00   2
    提供一个思路,可以用 HEAD 方法请求网页的头部信息,可以判断 content-length 大小的变化。从直觉上看,网页内容变化了, content-length 大概率会变化。
    SlipStupig
        22
    SlipStupig  
    OP
       2016-07-22 16:31:48 +08:00
    @JoeShu 这个准确性不行吧
    yutian2211
        23
    yutian2211  
       2016-07-22 16:44:54 +08:00
    @JoeShu HEAD 方法出的结果 可作为一个参考值,如果无变化,延后抓取
    SlipStupig
        24
    SlipStupig  
    OP
       2016-07-23 20:54:29 +08:00
    @yutian2211 出什么结果作为参考?
    FindHao
        25
    FindHao  
       2016-07-24 08:11:47 +08:00
    他们的网页有 site map 吗,比如类似我这个。。
    http://www.findspace.name/post.xml
    mafic
        26
    mafic  
       2016-07-24 14:04:20 +08:00
    楼主怎么解决 跪求解决方案。现在同样遇到此问题
    ezreal
        27
    ezreal  
       2016-07-24 20:23:41 +08:00
    咦,我也在做这东西。
    lancemoon
        28
    lancemoon  
       2016-07-24 23:21:15 +08:00
    转成图片,进行相似计算呢
    或者文字的也是同样的道理
    SlipStupig
        29
    SlipStupig  
    OP
       2016-07-25 00:25:38 +08:00
    @lancemoon 网页转成图片我不知道有什么意义,文字的话还不是得下载完成所有的内容,进行相似度计算比 hash 计算更慢啊!
    SlipStupig
        30
    SlipStupig  
    OP
       2016-07-25 00:26:38 +08:00
    @mafic 目前考虑设计一个权重算法用然后用 hash 一致性去调度多个 worker
    SlipStupig
        31
    SlipStupig  
    OP
       2016-07-25 00:29:50 +08:00
    @FindHao 没有啊!
    x8
        32
    x8  
       2016-07-25 10:54:53 +08:00
    我给你分析一下这个问题:
    首先网页是否修改,你有两种方式获知,一种是网页的在修改的时候主动发出一个通知告诉你,另一种是查询网页和历史纪录比较,得知是否修改。如果你是网页的拥有者,那么在网页修改的时候加一个触发机制通知你就行;如果你不是,那么就只有老老实实轮询。
    如果你的需求是必须监控每一张网页的修改,那么就需要不断改善你的爬取性能,除了挨个爬取之外别无他法。
    如果并不需要,那么你可以选择性轮询,对于修改频繁的网页,你查询频率调高一些,对于修改不频繁的网页,查询频率调低一些。可以写一个函数,用于评估网页修改是否频繁,然后以此分配爬取频率,争取最大化利用你有限的爬取资源。
    对于网页是否修改,这个是你自己定义,哪种程度的内容改变算“修改”,需要你自己判断
    yutian2211
        33
    yutian2211  
       2016-07-26 15:49:50 +08:00
    @SlipStupig content-length 如果变化了,正常抓取,如果没有变化,延后抓取,当然再辅助于权重设计
    SlipStupig
        34
    SlipStupig  
    OP
       2016-07-26 19:34:09 +08:00
    @yutian2211 我整理一下
    Wongzigii
        35
    Wongzigii  
       2017-05-26 10:53:35 +08:00
    @SlipStupig 求分享
    flynaj
        36
    flynaj  
       2018-09-20 21:48:08 +08:00
    curl -I 参数,头没有变化基本内容不会变
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 13:29 PVG 21:29 LAX 06:29 JFK 09:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86