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

2016-03-08 22:26:36 +08:00
 yinzishao
从首页里的链接一层一层爬取整个网站的页面。
那如何停止的?(判断把整个网站爬取完的条件是什么?)

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 来去重。有没有必要?
7148 次点击
所在节点    Python
9 条回复
yinzishao
2016-03-08 22:34:03 +08:00
求各位意见,或者分享下应该怎么分布式爬虫,万分感谢!
binux
2016-03-08 22:50:51 +08:00
我们假设 fingerprint 是 MD5 串, 256bit, 一亿条 url 也就 3.2G
一亿链接先想想你其他的组件是否撑得住再考虑费不费内存这个问题吧。
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
2016-03-09 11:05:20 +08:00
把爬虫的 agent 和 Server 分开,用 Server 来去重。
yinzishao
2016-03-09 16:12:25 +08:00
@zts1993 set 里面的元素为 0 ,感觉很不靠谱的样子。或者设定爬取的宽度或者深度为终止条件?
yinzishao
2016-03-09 16:12:55 +08:00
@binux 感谢指出
zts1993
2016-03-09 16:17:07 +08:00
@yinzishao 是非常不靠谱。。。。具体什么为终止应该还是看需求啊,我之前做的是学校网站爬虫,按照 ip 和域名限定,反正 url 总数是一定的~
yinzishao
2016-03-09 16:27:28 +08:00
@zts1993 也就是估计大概的爬取量
yinzishao
2016-03-10 19:53:11 +08:00
@jadetang 什么意思?是指 master 和 slave 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/262038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX