分布式爬蟲框架:Cola

jopen 10年前發布 | 84K 次閱讀 Cola 網絡爬蟲

Cola

Cola是一個分布式的爬蟲框架,用戶只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多臺機器上,整個過程對用戶是透明的。

依賴

首先,確保Python版本為2.6或者2.7(未來會支持3+)。由于Cola配置文件使用的yaml,所以Cola只依賴于pyyaml,安裝easy_install或者pip工具后,則可以:

pip install pyyaml

安裝

下載或者用git clone源碼,假設在目錄/to/pth/cola,將該路徑添加到Python path中。

一種簡單的方法是在site-packages中添加pth文件。site-packages因系統而異,如果是windows,假設python 裝在C:\python27,那么就是C:\python27\Lib\site-packages;如果是linux,那么應該是/usr/local /lib/pythonX.X/dist-packages。

在site-packages下新建一個cola.pth文件,里面寫上路徑:/to/path/cola。

運行

Cola集群需要一個master和若干個worker,對于每臺機器,只能啟動一個worker。但是,集群不是必須的,在單機模式下亦可以運行。

Cola目前自帶了若干個爬蟲,在項目根目錄下的contrib中。

下面就wiki為例,分別說明如何在單機和分布式環境下運行。

依賴

無論是維基百科還是新浪微博的實現,數據都存放在MongoDB中,所以要確保MongoDB的安裝。

在wiki下的wiki.yaml和weibo下的weibo.yaml中可以配置MongoDB的主機和端口。

維基百科和新浪微博實現依賴于下面的幾個包:

  • mechanize
  • python-dateutil
  • BeautifulSoup4
  • mongoengine
  • rsa(僅新浪微博需要)

可以使用pip或者easy_install來安裝。

單機模式

單機模式非常簡單,只需運行contrib/wiki/__init__.py即可。

cd /to/path/cola/contrib/wiki
python __init__.py

要運行新浪微博的爬蟲,需要在weibo.yaml中配置登錄的用戶名和密碼。這里要注意,要保證這個用戶名和密碼在登錄時不需要驗證碼。

停止則需運行stop.py,注意不能通過直接殺死進程來停止,否則會導致cola非法關閉。如果非法關閉,確保cola不在運行的情況下,則可以運行stop.py來恢復。但無論如何,都不推薦非法關閉,否則可能遇到不可預知的錯誤。

python stop.py

分布式模式

首先需要啟動cola master和cola workers。分別運行根目錄下bin中的start_master.py和start_worker.py

啟動cola master:

cd /to/path/cola
python bin/start_master.py --data /my/path/data

如果不指定--data,那么數據文件會放置在項目根目錄下的data文件夾中。

啟動cola worker:

python bin/start_worker.py --master <master ip address> --data /my/path/data

--data選項同master。如果不指定master,會詢問是否連接到本機master,輸入yes連接。

最后使用bin下的coca.py來運行指定的Cola job:

python bin/coca.py -m <master ip address> -runLocalJob /to/path/cola/contrib/wiki

-runLocalJob選項是要運行的job所在文件夾的絕對路徑。輸入命令后,該job會被提交到Cola集群來運行。

停止Cola Job或集群

停止整個集群,則可以運行:

python bin/coca.py -m <master ip address> -stopAll

而停止一個Job,則需要查詢得到Job的名稱:

python bin/coca.py -m <master ip address> -showRunningJobsNames

得到名稱后,再運行:

python bin/coca.py -m <master ip address> -stopRunningJobByName <job name>

基于Cola實現的爬蟲

基于Cola實現的爬蟲位于contrib/目錄下。目前實現了四個爬蟲:

  • wiki:維基百科。
  • weibo:新浪微博爬蟲。從初始用戶出發,然后是其關注和粉絲,依次類推,抓取指定個數的新浪微博用戶的微博、個人信息、關注和粉絲。其中,用戶微博只獲取了內容、贊的個數、轉發和評論的個數等等,而沒有具體去獲取此微博被轉發和評論的內容。
  • generic(unstable):通用爬蟲,只需配置,而無需修改代碼。目前Cola實現了一個抽取器(cola/core /extractor),能夠從網頁正文中自動抽取主要內容,即去除類似邊欄和底腳等內容。但是,此抽取器目前準確度還不夠,效率也不夠高,所以需要謹慎使用。
  • weibosearch(unstable):新浪微博搜索的爬蟲。這個爬蟲使用 cola.core.opener.SpynnerOpener,基于spynner實現了一個Opener能夠執行JavaScript和Ajax代碼。目前這個爬蟲存在的問題是:新浪微博可能會將其識別成機器人,因此有可能會讓輸入驗證碼。

wiki和weibo之前有所提及。主要說明generic和weibosearch。

對于generic來說,主要要修改的就是配置文件:

job:
  patterns:
    - regex: http://blog.sina.com.cn/$
      name: home
      store: no
      extract: no
    - regex: http://blog.sina.com.cn/s/blog_.+
      name: article
      store: yes
      extract: yes

其中,regex表示要匹配的url的正則表達式;name是正則匹配的名稱;store為yes時是存儲這個網頁,no為不存儲;extract表示是否自動抽取網頁正文,只有當store為yes的時候,extract才有作用。

對于weibosearch,其使用了spynner來執行JavaScript和Ajax代碼。所以需要確保以下依賴的安裝:

如果你覺得可以基于cola實現一個比較通用的第三方爬蟲,比如說騰訊微博等等,歡迎將此爬蟲提交到contrib/中。

編寫自定義Cola Job

見wiki編寫自定義Cola Job

架構和原理

687474703a2f2f71696e787579652e6d652f7374617469632f636f6c612f6172636869746563747572652e6a7067.jpg

在Cola集群里,當一個任務被提交的時候,Cola Master和Worker會分別啟動JobMaster和JobWorker。對于一個Cola Job,當JobWorker啟動完成后,會通知JobMaster,JobMaster等待所有JobWorker啟動完成后開始運行Job。在一個 Cola Job啟動時,會啟動一個消息隊列(Message Queue,主要操作是put和get,worker抓取到的對象會被put到隊列中,而要抓取新的對象時,只要從隊列中取即可),每個 JobWorker上都存在消息隊列節點,同時會有一個去重模塊(bloom filter實現)。

問題

Cola還不夠穩定,目前會處于持續改進的狀態。且Cola還沒有在較大規模的集群上測試,但是接下來我會把Cola應用到新項目中,并逐步完善。也希望大家也能給我反饋,并幫助改進。

Roadmap

0.1版本正式推出前不會再增加新的功能了,主要目標讓Cola更加穩定,并且提高cola/core/extractor的性能和精確度,完善contrib/generic和contrib/weibosearch。

0.2版本計劃:

  • 實現一個web接口,可以查看運行的cola job以及運行情況
  • 簡化安裝,支持easy_install或者pip安裝。增加解決依賴庫安裝的機制。

0.3版本計劃:

  • 增加一個統一持久化抽象,支持保存到關系型數據庫,MongoDB,文件系統,HDFS等等。

0.4版本計劃:

  • 支持Python 3+

項目主頁:http://www.baiduhome.net/lib/view/home/1405735179250

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!