scrapy 分布式 mysql_scrapy-redis 更改队列和分布式爬虫

本文介绍了如何使用scrapy-redis实现分布式爬虫,通过将URL推送到Redis数据库并在多台机器上运行爬虫来实现分布式。此外,还探讨了在队列中存储关键词而非URL的方法,以节省内存并优化处理大量关键字的情况。通过修改scrapy_redis/spiders.py文件的`make_request_from_data`函数,实现了在请求时动态构造URL,从而直接在Redis中存储关键词。
摘要由CSDN通过智能技术生成

这里分享两个技巧

1.scrapy-redis分布式爬虫

我们知道scrapy-redis的工作原理,就是把原来scrapy自带的queue队列用redis数据库替换,队列都在redis数据库里面了,每次存,取,删,去重,都在redis数据库里进行,那我们如何使用分布式呢,假设机器A有redis数据库,我们在A上把url  push到redis里面,然后在机器B上启动scrapy-redis爬虫,在机器B上connect到A,有远程端口可以登入,在爬虫程序里,保存的时候注意启用追加模式,而不是每次保存都删除以前的东西,这样的话,我们可以在B上面多次运行同一个程序。

如图所示,其实连copy都不要,直接另开一个终端,接着运行同样的程序即可。

当然我们也可以在机器C上同样这样运行,所以这就是分布式爬虫。

20180210214442937430.png

2.队列不存url改为关键字。

我们的redis队列里保存的是url,正常情况下没毛病,当我们的url不是通过extract网页获取的时候,而是通过构造关键字得到的时候,而且关键字还是很大量的情况下,我们就没有必要在redis里面保存url了,而是直接保存关键字,这样省很大 的内存空间,我们把构造url的任务放到即将要request的时候进行。

当然,这里是改了源码的,如果想这么操作的话,建议在虚拟python环境下进行,安全可靠。

site-packages/scrapy_redis/spiders.py

defmake_request_from_data(self, data):"""Returns a Request instance from data coming from Redis.

By default, ``data`` is an encoded URL. You can override this method to

provide your own message decoding.

Parameters

----------

data : bytes

Message from redis."""data=data.split(‘,‘)if data[1]==‘360‘:

a=data[0].strip()

vb={}

vb[‘word‘] =a

vb[‘sid‘] = ‘e13f45a56c8e03b5a2262a6fcab43082‘vb[‘pq‘] = vb[‘word‘]

url2= ‘https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word‘data2=urllib.urlencode(vb)

geturl2= url2 + ‘&‘ +data2

url=bytes_to_str(geturl2, self.redis_encoding)return self.make_requests_from_url(url)

而在我们的push程序里,是这样子了:

for res in open(file_name,‘r‘):

client.lpush(‘%s:start_urls‘ % redis_key, res+‘,360‘)

这里只改写了scrapy_redis/spiders.py文件里的类RedisMixin的 make_request_from_data 函数,人家作者吧接口单独预留了,让我们能够看得很清楚,还是很厉害的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值