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
筆者還在學習之中,後續會分享更多的實踐經驗。