scrapy爬蟲之gerapy和scrapyd

scrapy爬蟲

筆者近期有一個特定網站全站爬取的需求。因爲全站數據量大,又希望時間開銷小。作爲一個入門級的爬蟲工作者,根據以往經驗,筆者(主要使用python編程)設想了以下幾種方案:

selenium

1、用 selenium 模擬瀏覽器爬蟲,自己改造框架,使得可以多層全站爬取。
這裏,模擬瀏覽器的好處在於可以加載運行JS腳本,能夠解決一些JS腳本動態生成鏈接的問題。但是對於全站爬取而非特定頁面,這樣的時間開銷很大,工作也很複雜,不太適合入門級的選手。(關於時間開銷,如果有加速的辦法和分佈式解決方案請給筆者留言)

wget

2、用 wget-m(mirror) 參數,全站鏡像,或者用-r -l n 參數,限制多層爬取。
儘管可以限制爬取的文件類型和爬取深度,但是命令行的參數可配置性非常有限。最重要的是,簡單暴力的wget 給人的感覺應該是快,而實際上wget 的爬取速度很慢,尤其是對於一個大站點,據筆者的經驗,scrapy 5分鐘的工作量,wget 1個小時才能完成。
另外,要想加速爬取,需要多線程和分佈式,筆者調研了wget的多線程版本,mwget 完全只有大文件下載加速功能(沒有wget 的各種功能)。所以wget方案可定製性差,速度慢,沒有現成的多線程解決方案。

scrapy

3、scrapy 這個非常成熟的爬蟲框架,用python 實現,有無數先輩實踐,而且有基於redis 的分佈式版本,其優點不再贅述。

gerapy管理

筆者在實現了簡易的定製scrapy 爬蟲後,把分佈式爬取提上了日程。在搜索資料的時候,發現了一款名爲 gerapy 軟件,網上介紹說可以實現分佈式爬取。下面記錄實踐經歷。

gerapy

根據說明,gerapy 應當是一款國人開發的爬蟲管理軟件。(有中文界面)
git 鏈接: https://github.com/Gerapy/Gerapy.git
pip3 install gerapy ,這裏要注意自己的python 環境。
gerapy migrate 要運行在自己希望的目錄下,之後在相同目錄下運行gerapy runserver 命令,否則會找不到相關的數據庫。

scrapyd

gerapy 只是管理的前端,實際上真正在scrapy 的爬蟲主機上運行的是scrapyd 。我們可以視之爲一個scrapy 的外部調用接口,向外部的主機提供restful api 的調用服務。
安裝簡單 pip install scrapyd ,這裏要注意的是,安裝並不會生成conf 文件,筆者發現很多介紹的文章中都指出默認的管理接口是127.0.0.1:6800 ,爲了使master 節點可以遠程控制它,需要改配置文件。官方的說明文檔中說明了scrapyd 運行時搜索配置文件的位置和優先級,卻沒有說明需要自己建立配置文件。(重要!!!)
ubuntu用戶可以新建 /etc/scrapyd/scrapyd.conf 。加入[scrapyd] 欄目,寫入配置,這個配置文件的風格很規範,不再贅述。

projects

完成以上兩步後,可以輕鬆在web 端的gerapy 界面上加入有 scrapyd 服務的主機。這時可以加入已有項目,只要加入到project 文件夾即可。但是如果運行gerapy 的目錄有變動,需要重新migrate ,否則會出現問題。
運行項目操作很簡單,不再贅述。這裏筆者要說的是gerapy 目前能夠實現的分佈式不是scrapy-redis的分佈式,即並不能將一個任務用多個主機加速進行。現在gerapy 能夠做到的是將相同或不同的任務分配給不同主機,集中管理,但完全不能加速某一個特定項目(劃重點!!!)
它的TODO 列表中有真正的分佈式實現,但是目前還有很大的距離。雖然你不能要求開源項目本身太多,筆者也很感激gerapy的作者爲爬蟲工作者開發管理界面,但是還是希望轉載宣傳的人能夠準確的描述項目,以免帶來歧義。

scrapy-redis

真正的分佈式爬蟲scrapy-redis 筆者還在學習之中,後續會分享更多的實踐經驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章