这里分享两个技巧html
1.scrapy-redis分布式爬虫python
咱们知道scrapy-redis的工做原理,就是把原来scrapy自带的queue队列用redis数据库替换,队列都在redis数据库里面了,每次存,取,删,去重,都在redis数据库里进行,那咱们如何使用分布式呢,假设机器A有redis数据库,咱们在A上把url push到redis里面,而后在机器B上启动scrapy-redis爬虫,在机器B上connect到A,有远程端口能够登入,在爬虫程序里,保存的时候注意启用追加模式,而不是每次保存都删除之前的东西,这样的话,咱们能够在B上面屡次运行同一个程序。redis
如图所示,其实连copy都不要,直接另开一个终端,接着运行一样的程序便可。数据库
固然咱们也能够在机器C上一样这样运行,因此这就是分布式爬虫。json
2.队列不存url改成关键字。安全
咱们的redis队列里保存的是url,正常状况下没毛病,当咱们的url不是经过extract网页获取的时候,而是经过构造关键字获得的时候,并且关键字仍是很大量的状况下,咱们就没有必要在redis里面保存url了,而是直接保存关键字,这样省很大 的内存空间,咱们把构造url的任务放到即将要request的时候进行。框架
固然,这里是改了源码的,若是想这么操做的话,建议在虚拟python环境下进行,安全可靠。yii
site-packages/scrapy_redis/spiders.pyscrapy
def make_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 函数,人家做者吧接口单独预留了,让咱们可以看得很清楚,仍是很厉害的。
另外,scrapy-redis框架储存内容的时候,是以list形式 储存的,client.lpush ,redis关于list的操做详见 Redis 列表