有关分布式爬虫和 scrapy-redis 的问题,去重策略和怎么爬取整个网站? - 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
yinzishao
V2EX    Python

有关分布式爬虫和 scrapy-redis 的问题,去重策略和怎么爬取整个网站?

  •  
  •   yinzishao 2016-03-08 22:26:36 +08:00 7499 次点击
    这是一个创建于 3503 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从首页里的链接一层一层爬取整个网站的页面。
    那如何停止的?(判断把整个网站爬取完的条件是什么?)

    scrapy-redis 的疑问:
    去重问题:
    dupefilter.py 里面的源码:
    def request_seen(self, request):
    fp = request_fingerprint(request)
    added = self.server.sadd(self.key, fp)
    return not added

    去重是把 request 的 fingerprint 存在 redis 上,来实现的吧?那大规模抓取不就很耗费内存?每条没读过的链接都存。
    有没有人试过用 bloomfilter 结合 scrapy redis 来去重。有没有必要?
    9 条回复    2016-03-10 19:53:11 +08:00
    yinzishao
        1
    yinzishao  
    OP
       2016-03-08 22:34:03 +08:00
    求各位意见,或者分享下应该怎么分布式爬虫,万分感谢!
    binux
        2
    binux  
       2016-03-08 22:50:51 +08:00
    我们假设 fingerprint 是 MD5 串, 256bit, 一亿条 url 也就 3.2G
    一亿链接先想想你其他的组件是否撑得住再考虑费不费内存这个问题吧。
    zts1993
        3
    zts1993  
       2016-03-08 23:46:12 +08:00
    url 取 md5 内存占用不了多少,如果再用 64 进制表示,还可以节省 23%的样子

    建议对 fingerprint 做一次硬分片散列到多个 redis set 中,这样以后 redis 扩展成集群就比较方便了 :)

    bloomfilter 感觉最大得问题是不知道怎么预估未来得规模啊。

    不过话说 redis 未来会支持 bloomfilter 。。现在 bloomfilter 怎么和 redis 结合?

    毕设得时候做得爬虫看的一个人写的,,那个停止条件是 set 里面元素为 0 。。非常不科学,有时候网络一抖动 set 里面为 0 ,还有任务在处理,爬虫就直接 exit 了,简直捉急,不过我看 scrapy-redis 里面好像不是这样。。。。。

    我觉得要是我做的话。。还是 set 是否为 0 吧,不过得加点等待时间判断一下就好了。。
    jadetang
        4
    jadetang  
       2016-03-09 11:05:20 +08:00 via Android
    把爬虫的 agent 和 Server 分开,用 Server 来去重。
    yinzishao
        5
    yinzishao  
    OP
       2016-03-09 16:12:25 +08:00
    @zts1993 set 里面的元素为 0 ,感觉很不靠谱的样子。或者设定爬取的宽度或者深度为终止条件?
    yinzishao
        6
    yinzishao  
    OP
       2016-03-09 16:12:55 +08:00
    @binux 感谢指出
    zts1993
        7
    zts1993  
       2016-03-09 16:17:07 +08:00
    @yinzishao 是非常不靠谱。。。。具体什么为终止应该还是看需求啊,我之前做的是学校网站爬虫,按照 ip 和域名限定,反正 url 总数是一定的~
    yinzishao
        8
    yinzishao  
    OP
       2016-03-09 16:27:28 +08:00
    @zts1993 也就是估计大概的爬取量
    yinzishao
        9
    yinzishao  
    OP
       2016-03-10 19:53:11 +08:00
    @jadetang 什么意思?是指 master 和 slave 吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3570 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:33 PVG 12:33 LAX 21:33 JFK 00:33
    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