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 · 10014 次点击
    这是一个创建于 3038 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前我用 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 没有啊!
    lizon
        32
    lizon  
       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   ·   实用小工具   ·   2807 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:20 · PVG 21:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.