关于scrapy-redis的几点疑问

我想爬一个网站,大概10亿数据, url 是 http://xxx.com/id=xx 访问并提取其中的数据,存入数据库

其中url中的id参数 是可预测的, 是从 0-1000000000

所以我直接可以生成这10亿个网址

for i in range(0,1000000000):
 yield Request(f"http://xxx.com/id={i}", self.parse)

但是只能在一台机器上运行,效率太低了

我打算接入 scrapy-redis,但我有几点疑问如下:

当我接入scrapy-redis,并打算用20台机器的情况下:

1.Master和Slaver是不是各司其职,Master负责生成网址放在redis,Slaver负责从redis取回网址并消费?如果不是,那么请问它是怎么一回事?

2.因为抓取结果我要存入数据库,那么是不是每台Slaver都要连接数据库?能不能让Slaver自己把数据存入数据库,因为我感觉如果把数据传回Master,让Master入库会浪费很多时间和流量

3.根据我目前在网上看到的文章,似乎并没有严格区分Master和Slaver,大家都是各做各的,只是每次做之前去redis问问,有没有别人做了这个id,但是这样会浪费很多时间去重, scrapy-redis难道不支持 我的问题1 各司其职 的功能吗

暂时就这3个问题, 谢谢

阅读 2.5k
1 个回答

我来说下自己的看法,仅供参考:

  1. 生成网址可以随便写个脚本就行,redis set()类型 存放,scrapy-redis每台机器读取同一个redis中pop一个值(url)出来爬取即可,在我看来没有Master和Slaver的区分。
  2. 如果数据库在局域网内,其实速度也慢不到哪里去,如果在公网,那可以存每台服务器本地文件,爬完后再合并。
  3. 去重的问题,按照第一点来做的话,redis中存放的是set类型,不会重复url。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题