Scrapy-Redis分佈式實現

1. 準備工作

成功實現Scrapy爬蟲,Scrapy_Redis庫正確安裝

2. 搭建Redis服務器

推薦使用Linux服務器(阿里雲,騰訊雲,Azure等雲主機,配有公網IP)

部分商家的服務器需要配置安全組放通Redis運行端口才可以遠程訪問。

記錄Redis的IP,端口,地址,供後面配置分佈式爬蟲使用。

3. 部署代理池和Cookies池

如沒有,可不用設置。

如有,需要代理池和Cookies池放到公網訪問的服務器上,上傳服務器,修改Redis的連接信息配置,用同樣的方式運行代理池和Cookies池

遠程訪問代理池和Cookies池提供的接口,來獲取隨機代理和Cookies。

問題排查:如不能遠程訪問,先確保其在0.0.0.0這個Host上運行,再檢查安全組的配置。

訪問鏈接:PROXY_URL = 'http://120.27.34.25:5555/random' #服務器的IP

COOKIES_URL = 'http://120.27.34.25:5556/weibo/random' #新浪微博舉例,服務器的IP

4. 配置Scrapy-Redis

配置Scrapy-Redis非常簡單,只需要修改一下settings.py配置文件即可。

· 核心配置

將調度器的類和去重的類替換為Scrapy-Redis提供的類

在settings.py的配置

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

· Redis 連接配置

兩種連接方式

第一種:通過連接字符串配置,用Redis的地址、端口、密碼構造一個Redis連接字符串

redis://[:password]@host:port/db

rediss://[:password]@host:port/db

unix://[:password]@/path/to/socket.sock?db=db

說明:password是密碼,比如以冒號開頭,中括號代表此選項可有可無,host 是Redis地址,port是運行端口,db是數據庫代號,其值默認是0

在settings.py設置REDIS_URL變量

REDIS_URL = 'redis://:[email protected]:6379'

第二種:分項單獨配置

在settings.py中設置:

REDIS_HOST = '120.27.34.25'

REDIS_PORT = 6379

REDIS_PASSWORD = 'foobared'

· 配置調度隊列

可選配置,默認使用PriorityQueue。如果想要更改配置,可以配置SCHEDULER_QUEUE_CLASS變量,任選其一配置。

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

· 配置持久化

可選的配置,默認是False。Scrapy-Redis默認會在爬取全部完成後清空爬取隊列和去重指紋集合。

如果不想自動清空爬取隊列和去重指紋集合,可以增加如下配置:

SCHEDULER_PERSIST = True

設置為True後爬取隊列和去重指紋集合不會在爬取完成後自動清空,如果不配置,默認False,即自動清空。

· 配置重爬

可選配置,默認是False。如果配置了持久化或強制中斷了爬蟲,那麼爬取隊列和指紋集合不會被清空,爬蟲重新啟動後會接著上次爬取。

如果想重新爬取,可以配置重爬的選項:SCHEDULER_FLUSH_ON_START = True

設置為True之後,爬蟲每次啟動時,爬取隊列和指紋集合都會清空。

注意:分佈式爬取:必須保證只能清空一次,否則每個爬蟲任務在啟動時都清空一次,將會把之前的爬取隊列清空,勢必影響分佈式爬取。

此配置在單機爬取時比較方便,分佈式爬取不常用此配置。

· Pipeline配置

可選配置,默認不啟動Pipeline。Scrapy-Redis實現了一個存儲到Redis的Item Pipeline,啟用了Pipeline之後,爬蟲會把生成的Item存儲到Redis數據庫。

數據量較大時,一般不這樣做。因為Redis基於內存的,利用它處理速度快的特性,做存儲太浪費。配置如下:

ITEM_PIPELINES = {

'scrapy_redis.pipelines.RedisPipeline': 300

}

· Scrapy-Redis配置完成

5. 配置存儲目標

爬蟲程序分發到各臺主機的時候,爬蟲會鏈接各自的數據庫,需要在每臺主機上都安裝MongoDB。兩個缺點1.搭建數據庫環境比較繁瑣2.各臺主機的爬蟲會把數據分散存到各自主機上,不方便統一管理。

最好將存儲目標存到同一個地方。

6. 運行

每臺主機上執行如下命令,即可啟動爬取:

scrapy crawl xxx

7. 結果

Redis數據庫信息

兩個Key:xxx:dupefilter,用來存儲指紋

xxx:requests,爬取隊列

至此:分佈式爬蟲部署成功。


分享到:


相關文章: