scrapy進行分布式爬蟲
今天,參照崔慶才老師的爬蟲實戰課程,實踐了一下分布式爬蟲,並沒有之前想象的那麽神秘,其實非常的簡單,相信你看過這篇文章後,不出一小時,便可以動手完成一個分布式爬蟲!
1、分布式爬蟲原理
首先我們來看一下scrapy的單機架構:
可以看到,scrapy單機模式,通過一個scrapy引擎通過一個調度器,將Requests隊列中的request請求發給下載器,進行頁面的爬取。
那麽多臺主機協作的關鍵是共享一個爬取隊列。
所以,單主機的爬蟲架構如下圖所示:
前文提到,分布式爬蟲的關鍵是共享一個requests隊列,維護該隊列的主機稱為master,而從機則負責數據的抓取,數據處理和數據存儲,所以分布式爬蟲架構如下圖所示:
那麽隊列用什麽維護呢,這裏我們選用Redis隊列進行存儲,
Redis是一種高效的非關系型數據庫,以key-value的形式存儲,結構靈活,它是內存中的數據結構存儲系統,處理速度快,性能好,同時,提供了隊列,集合等多種存儲結構,方便隊列維護。
另外一個問題,如何去重?這個的意思就是如何避免多臺主機訪問的request都不同,即讓Reques隊列中的請求都是不同的,那麽就需要用到Redis提供的隊列結構。Redis提供集合數據結構,在Redis集合中存儲每個Request的指紋,在向Request隊列中加入Request時首先驗證指紋是否存在。如果存在,則不加入,如果不存在,則加入。
2、環境配置
目前已經有專門的python庫實現了分布式架構。Scrapy-Redis庫改寫了Scrapy的調度器,隊列等組件,可以方便的實現Scrapy分布式架構。
Scrapy-Redis鏈接:https://github.com/rolando/scrapy-redis
不過,想要運用這個庫,我們需要安裝Redis數據庫
(1)windows安裝redis
下載地址:https://github.com/MSOpenTech/redis/releases
下載完成後,安裝即可,非常簡單(其實這裏沒有用到windows的redis,不過裝一裝也不麻煩),安裝完成後,windows的本地redis服務是默認啟動的。
接下來可以繼續安裝一個redis可視化工具,Redis Desktop Manager
下載地址:https://github.com/uglide/RedisDesktopManager/releases
我們選擇一個比較穩定的版本進行下載:
安裝完成,我們可以測試一下本地的redis環境,輸入我們的連接信息:
(2)linux下安裝redis
linux下使用命令 sudo apt-get install redis即可完成安裝,redis-server也是默認啟動的,接下來,我們需要修改配置文件,使得我們主機可以訪問虛擬機的redis數據庫:
使用命令:sudo vim /etc/redis/redis.conf 進行修改:
1、將保護模式設置為no:
如果不設置此處的話,windows下訪問redis直接崩潰。
2、bind ip註釋掉:
如果不註釋掉,只有本地可以訪問redis,windows是不能訪問的。
接下來重啟我們的redis服務,使用命令sudo service redis restart
(3)windows下訪問虛擬機redis
我們選擇使用虛擬機上的redis數據庫來維護爬取隊列,所以接下來,我們使用windows下的可視化客戶端訪問虛擬機下的redis:
可以看到,成功訪問:
3、代碼實現
使用Scrapy-Redis實現分布式爬蟲,需要在scrapy的setting.py中添加如下的配置,當然還有很多其他可用配置,這裏只需添加如下的幾個就可以實現分布是爬取:
SCHEDULER的意思就是使用Scrapy-Redis提供的調度器,DUPEFILTER_CLASS設置了去重機制,而後兩個參數設置了下載隊列的存儲位置,即Redis數據庫的位置。
實現的爬蟲是百度貼吧的爬蟲,這裏就不詳細說明了
具體代碼參見:https://github.com/princewen/python3_crawl (使用python3.5編寫)
使用winscp將代碼上傳到三臺虛擬機上,並確保三臺虛擬機有python的運行環境.
假設虛擬機上安裝了python3,那麽使用命令安裝如下的依賴庫:
sudo apt install python-pip
sudo pip install scrapy
sudo pip install scrapy_redis
sudo pip install pymongo
sudo pip install redis
4、代碼運行及效果展示
我們在三臺虛擬機上分別運行我們的爬蟲代碼抓取百度貼吧聊天吧的前100頁信息,使用命令
scrapy crawl tieba
可以看到,三臺虛擬機同時開始爬取:
而redis中,則維護了一個爬取隊列:
短短幾分鐘,我們就抓取了百度貼吧聊天吧的100頁帖子3900+條,存入了本地的mongodb數據庫:
至此,分布式爬蟲練手完畢!
參考崔大神的博客http://cuiqingcai.com/
scrapy進行分布式爬蟲