這裏分享兩個技巧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 列表