使用 scrapy 爬虫框架,一般是边爬边去重还是爬完一定深度以后再去重? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
phantomer

使用 scrapy 爬虫框架,一般是边爬边去重还是爬完一定深度以后再去重?

  •  
  •   phantomer Jun 7, 2016 15525 views
    This topic created in 3611 days ago, the information mentioned may be changed or developed.

    使用 scrapy 爬虫框架,一般是边爬边去重还是爬完一定深度以后再去重?

    目前刚学爬虫,已经实现爬虫入库,但是遇到一个瓶颈,因为是递归爬虫,所以会一直循环你爬取已经爬过的页面,毕竟很多首页都会有一个首页自己 self 的链接,所以,爬虫一直去请求他。

    所以现在我想了解下,目前大家写的爬虫都是边去重边爬取的?还是入库以后再操作数据库去重?

    如果是数据库去重的话,我感觉会导致数据库里一大堆无用的信息,太损耗效率了。

    如果是边爬取边去重的话,我是从数据库里 select url 来匹配判断是否重复后再入库,还是另外建个列表,每次从内存里取(内存有限的情况下),哪个效率高?

    或者说有更好的实现方法和理论?或者说 scrapy 本身有示例去重的接口或者函数?

    感谢~感谢~

    12 replies    2016-09-30 09:13:38 +08:00
    JhZ7z587cYROBgVQ
        1
    JhZ7z587cYROBgVQ  
       Jun 7, 2016
    我的话之前使用 bloom filter 边爬边去重的,就是会有一定错误率。
    zanpen2000
        2
    zanpen2000  
       Jun 7, 2016
    中间件去重,也就是边爬边去
    billion
        3
    billion  
       Jun 7, 2016
    使用 Redis 储存网址,自带去重功能。
    zts1993
        4
    zts1993  
       Jun 7, 2016
    Redis set 去重
    silverfox
        5
    silverfox  
       Jun 7, 2016
    Allianzcortex
        6
    Allianzcortex  
       Jun 8, 2016
    所以这就是自己为什么在写完 [scrapy-demos]( https://github.com/Allianzcortex/scrapy-demos) 后就决定再也不用 scrapy 的原因⊙⊙b ……爬虫框架用起来自定义程度总是不高~

    用 requests+Selenium+PhantomJs 多线程爬虫的时候用的是 mp.manager.dict() 来存储已经访问过的网站,如果发现再次访问就直接跳过

    我能想到的就是 Bloom Filter ,按照上面所说用 redis 来去重应该也可以
    phantomer
        7
    phantomer  
    OP
       Jun 8, 2016
    brucedone
        8
    brucedone  
       Jun 8, 2016   1
    @Allianzcortex scrapy 的自由度还不高?基于插件形式你可以自由定制 proxy ,以及动态 js 解析(scrapy-splash),pipeline 可以自己定义输出形式,你觉得去重是一个难题,那自己定义 queue 的存储然后在重载 start_reqeust 方法就可以轻松的去重了,这些内容都可以自己做,其实已经耦合性不算太高了~
    Allianzcortex
        9
    Allianzcortex  
       Jun 8, 2016   1
    @brucedone 可能是我做的还没有到 GB 级这种数据,更喜欢自己写一些内部的东西吧。不过 scrapy 自定义 proxy 这种方式真是特别喜欢,因为我是 Django 党 O(∩_∩)O 哈哈哈~
    BruceWang
        10
    BruceWang  
       Sep 29, 2016
    @billion
    @zts1993

    难道你们都不考虑网页内容更新的情况吗?比如爬 V2EX ,爬完就算完成了,再也不考虑新回复?
    billion
        11
    billion  
       Sep 29, 2016 via iPad
    @BruceWang 有一些网页会采用增量爬取。
    BruceWang
        12
    BruceWang  
       Sep 30, 2016
    @billion 我想,应该是“去重”这两个字定义不清的问题。
    我觉得有这么几个地方需要去重:
    1 、在单一页面解析的时候,可能会提取到重复的链接,需要 url 去重;
    2 、在不同任务、不同页面解析的时候,可能会提取到重复的链接,需要 url 去重;
    3 、在数据提取的时候,可能会遇到重复数据,比如一份重要性比较高的数据被多个不同的站点以各种形式引用(类似论文的引用,不过被引用的论文重复发表在多个期刊),需要 data 去重。
    4 、其它还没想到的

    我在做一个基于 Scrapy 的动态生成的爬虫,也就是提取规则等参数是从数据库取得的(我知道应该已经有了,不过我想自己造个轮子)。所以我对前文( 2 )的情况不是光用集合判断存在还是不存在,我还记录了上次访问时间和任务要求。如果按任务要求比如每周爬一次,判断时间满足那么就再爬一次,否则丢弃。
    About     Help     Advertise     Blog     API     FAQ     Solana     3013 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 65ms UTC 15:21 PVG 23:21 LAX 08:21 JFK 11:21
    Do have faith in what you're doing.
    ubao msn 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