Python爬蟲:Scrapy使用scrapyd進行分佈式部署
按照上一篇文章中我們將代碼放到遠程主機是通過拷貝或者git的方式,但是如果考慮到我們又多臺遠程主機的情況,這種方式就比較麻煩,那有沒有好用的方法呢?這裡其實可以通過scrapyd,下面是這個scrapyd的github地址:https://github.com/scrapy/scrapyd
當在遠程主機上安裝了scrapyd並啟動之後,就會再遠程主機上啟動一個web服務,默認是6800端口,這樣我們就可以通過http請求的方式,通過接口的方式管理我們scrapy項目,這樣就不需要在一個一個電腦連接拷貝過著通過git,關於scrapyd官方文檔地址:http://scrapyd.readthedocs.io/en/stable/
安裝scrapyd
安裝scrapyd:pip install scrapyd
這裡我在另外一臺ubuntu linux虛擬機中同樣安裝scrapy以及scrapyd等包,保證所要運行的爬蟲需要的包都完成安裝,這樣我們就有了兩臺linux,包括上篇文章中我們已經有的linux環境
在這裡有個小問題需要注意,默認scrapyd啟動是通過scrapyd就可以直接啟動,這裡bind綁定的ip地址是127.0.0.1端口是:6800,這裡為了其他虛擬機訪問講ip地址設置為0.0.0.0
scrapyd的配置文件:/usr/local/lib/python3.5/dist-packages/scrapyd/default_scrapyd.conf
這樣我們就可以通過瀏覽器訪問:
關於部署
如何通過scrapyd部署項目,這裡官方文檔提供一個地址:https://github.com/scrapy/scrapyd-client,即通過scrapyd-client進行操作
這裡的scrapyd-client主要實現以下內容:
- 把我們本地代碼打包生成egg文件
- 根據我們配置的url上傳到遠程服務器上
我們將我們本地的scrapy項目中scrapy.cfg配置文件進行配置:
我們其實還可以設置用戶名和密碼,不過這裡沒什麼必要,只設置了url
這裡設置url一定要注意:url = http://192.168.1.9:6800/addversion.json
最後的addversion.json不能少
我們在本地安裝pip install scrapy_client,安裝完成後執行:scrapyd-deploy
看到status:200表示已經成功
關於常用操作API
listprojects.json列出上傳的項目列表
listversions.json列出有某個上傳項目的版本
schedule.json遠程任務的啟動
下面我們啟動的三次就表示我們啟動了三個任務,也就是三個調度任務來運行zhihu這個爬蟲
同時當啟動完成後,我們可以通過頁面查看jobs,這裡因為我遠端服務器並沒有安裝scrapy_redis,所以顯示任務是完成了,我點開日誌並能看到詳細的日誌情況:
這裡出錯的原因就是我上面忘記在ubuntu虛擬機安裝scrapy_redis以及pymongo模塊,進行
pip install scrapy_redis pymongo安裝後重新啟動,就可以看到已經在運行的任務,同時點開Log日誌也能看到爬取到的內容:
listjobs.json列出所有的jobs任務
上面是通過頁面顯示所有的任務,這裡是通過命令獲取結果
cancel.json取消所有運行的任務
這裡可以將上面啟動的所有jobs都可以取消:
這樣當我們再次通過頁面查看,就可以看到所有的任務都是finshed狀態:
我相信看了上面這幾個方法你一定會覺得真不方便還需要輸入那麼長,所以有人替你幹了件好事把這些API進行的再次封裝:https://github.com/djm/python-scrapyd-api
關於python-scrapyd-api
該模塊可以讓我們直接在python代碼中進行上述那些api的操作
首先先安裝該模塊:pip install python-scrapyd-api
使用方法如下,這裡只演示了簡單的例子,其他方法其實使用很簡單按照規則寫就行:
from scrapyd_api import ScrapydAPI
scrapyd = ScrapydAPI('http://192.168.1.9:6800')
res = scrapyd.list_projects()
res2 = scrapyd.list_jobs('zhihu_user')
print(res)
print(res2)
做什麼事情都需要不斷地堅持下去,編程也一樣。現在python語言十分火熱,職場對python的需求也很高,薪資待遇都很棒。所以希望大家能夠堅持學習,‘剩’者為王,堅持下來的人才有資格稱王。如果你覺得本文對你的學習有幫助的話,不妨點個關注,我會持續更新。