分佈式爬蟲完成並能夠成功運行了,可是有個環節很是煩瑣,那就是代碼部署。
html
咱們設想下面的幾個場景。node
若是採用上傳文件的方式部署代碼,咱們首先將代碼壓縮,而後採用SFTP或FTP的方式將文件上傳到服務器,以後再鏈接服務器將文件解壓,每一個服務器都須要這樣配置。python
若是採用Git同步的方式部署代碼,咱們能夠先把代碼Push到某個Git倉庫裏,而後再遠程鏈接各臺主機執行Pull操做,同步代碼,每一個服務器一樣須要作一次操做。json
若是代碼忽然有更新,那咱們必須更新每一個服務器,並且萬一哪臺主機的版本沒控制好,這可能會影響總體的分佈式爬取情況。api
因此咱們須要一個更方便的工具來部署Scrapy項目,若是能夠省去一遍遍逐個登陸服務器部署的操做,那將會方便不少。瀏覽器
本節咱們就來看看提供分佈式部署的工具Scrapyd。bash
Scrapyd是一個運行Scrapy爬蟲的服務程序,它提供一系列HTTP接口來幫助咱們部署、啓動、中止、刪除爬蟲程序。Scrapyd支持版本管理,同時還能夠管理多個爬蟲任務,利用它咱們能夠很是方便地完成Scrapy爬蟲項目的部署任務調度。
服務器
請確保本機或服務器已經正確安裝好了Scrapyd。
微信
安裝並運行Scrapyd以後,咱們就能夠訪問服務器的6800端口,看到一個WebUI頁面。例如個人服務器地址爲120.27.34.25,那麼我就能夠在本地的瀏覽器中打開:http://120.27.34.25:6800,就能夠看到Scrapyd的首頁。這裏能夠替換成你的服務器地址,以下圖所示成功訪問到此頁面,則Scrapyd配置就沒有問題。網絡
Scrapyd提供了一系列HTTP接口來實現各類操做。在這裏以Scrapyd所在的IP地址120.27.34.25爲例,咱們能夠將接口的功能梳理一下。
這個接口負責查看Scrapyd當前的服務和任務狀態。咱們能夠用curl
命令來請求這個接口,命令以下:
curl http://139.217.26.30:6800/daemonstatus.json複製代碼
咱們就會獲得以下結果:
{"status": "ok", "finished": 90, "running": 9, "node_name": "datacrawl-vm", "pending": 0}複製代碼
返回結果是JSON字符串,status
是當前運行狀態,finished
表明當前已經完成的Scrapy任務,running
表明正在運行的Scrapy任務,pending
表明等待被調度的Scrapyd任務,node_name
就是主機的名稱。
這個接口主要是用來部署Scrapy項目用的。咱們首先將項目打包成Egg文件,而後傳入項目名稱和部署版本。
咱們能夠用以下的方式實現項目部署:
curl http://120.27.34.25:6800/addversion.json -F project=wenbo -F version=first -F egg=@weibo.egg複製代碼
在這裏, -F
表明添加一個參數,同時咱們還須要將項目打包成Egg文件放到本地。
發出請求以後,咱們能夠獲得以下結果:
{"status": "ok", "spiders": 3}複製代碼
這個結果代表部署成功,而且Spider的數量爲3。
此部署方法可能比較煩瑣,後文會介紹更方便的工具來實現項目的部署。
這個接口負責調度已部署好的Scrapy項目運行。
咱們能夠用以下接口實現任務調度:
curl http://120.27.34.25:6800/schedule.json -d project=weibo -d spider=weibocn複製代碼
這裏須要傳入兩個參數,project
即Scrapy項目名稱,spider
即Spider名稱。
返回結果以下:
{"status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"}複製代碼
status
表明Scrapy項目啓動狀況,jobid
表明當前正在運行的爬取任務代號。
這個接口能夠用來取消某個爬取任務。若是這個任務是pending
狀態,那麼它將會被移除;若是這個任務是running
狀態,那麼它將會被終止。
咱們能夠用下面的命令來取消任務的運行:
curl http://120.27.34.25:6800/cancel.json -d project=weibo -d job=6487ec79947edab326d6db28a2d86511e8247444複製代碼
這裏須要傳入兩個參數,project
即項目名稱,job
即爬取任務代號。
返回結果以下:
{"status": "ok", "prevstate": "running"}複製代碼
status
表明請求執行狀況,prevstate
表明以前的運行狀態。
這個接口用來列出部署到Scrapyd服務上的全部項目描述。
咱們能夠用以下命令來獲取Scrapyd服務器上的全部項目描述:
curl http://120.27.34.25:6800/listprojects.json複製代碼
這裏不須要傳入任何參數。
返回結果以下:
{"status": "ok", "projects": ["weibo", "zhihu"]}複製代碼
status
表明請求執行狀況,projects
是項目名稱列表。
這個接口用來獲取某個項目的全部版本號,版本號是按序排列的,最後一個條目是最新的版本號。
咱們能夠用以下命令來獲取項目的版本號:
curl http://120.27.34.25:6800/listversions.json?project=weibo複製代碼
這裏須要一個參數project
,即項目的名稱。
返回結果以下:
{"status": "ok", "versions": ["v1", "v2"]}複製代碼
status
表明請求執行狀況,versions
是版本號列表。
這個接口用來獲取某個項目最新版本的全部Spider名稱。
咱們能夠用以下命令來獲取項目的Spider名稱:
curl http://120.27.34.25:6800/listspiders.json?project=weibo複製代碼
這裏須要一個參數project
,即項目的名稱。
返回結果以下:
{"status": "ok", "spiders": ["weibocn"]}複製代碼
status
表明請求執行狀況,spiders
是Spider名稱列表。
這個接口用來獲取某個項目當前運行的全部任務詳情。
咱們能夠用以下命令來獲取全部任務詳情:
curl http://120.27.34.25:6800/listjobs.json?project=weibo複製代碼
這裏須要一個參數project
,即項目的名稱。
返回結果以下:
{"status": "ok",
"pending": [{"id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "weibocn"}],
"running": [{"id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664"}],
"finished": [{"id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664", "end_time": "2017-07-12 10:24:03.594664"}]}複製代碼
status
表明請求執行狀況,pendings
表明當前正在等待的任務,running
表明當前正在運行的任務,finished
表明已經完成的任務。
這個接口用來刪除項目的某個版本。
咱們能夠用以下命令來刪除項目版本:
curl http://120.27.34.25:6800/delversion.json -d project=weibo -d version=v1複製代碼
這裏須要一個參數project
,即項目的名稱,還須要一個參數version
,即項目的版本。
返回結果以下:
{"status": "ok"}複製代碼
status
表明請求執行狀況,這樣就表示刪除成功了。
這個接口用來刪除某個項目。
咱們能夠用以下命令來刪除某個項目:
curl http://120.27.34.25:6800/delproject.json -d project=weibo複製代碼
這裏須要一個參數project
,即項目的名稱。
返回結果以下:
{"status": "ok"}複製代碼
status
表明請求執行狀況,這樣就表示刪除成功了。
以上接口是Scrapyd全部的接口。咱們能夠直接請求HTTP接口,便可控制項目的部署、啓動、運行等操做。
以上的這些接口可能使用起來還不是很方便。不要緊,還有一個Scrapyd API庫對這些接口作了一層封裝,其安裝方式能夠參考第1章的內容。
下面咱們來看看Scrapyd API的使用方法。Scrapyd API的核心原理和HTTP接口請求方式並沒有二致,只不過Python封裝後的庫使用起來更加便捷。
咱們能夠用以下方式創建一個Scrapyd API對象:
from scrapyd_api import ScrapydAPI
scrapyd = ScrapydAPI('http://120.27.34.25:6800')複製代碼
調用它的方法來實現對應接口的操做,例如部署的操做可使用以下方式:
egg = open('weibo.egg', 'rb')
scrapyd.add_version('weibo', 'v1', egg)複製代碼
這樣咱們就能夠將項目打包爲Egg文件,而後把本地打包的的Egg項目部署到遠程Scrapyd。
另外,Scrapyd API還實現了全部Scrapyd提供的API接口,名稱都是相同的,參數也是相同的。
例如,調用list_projects()
方法便可列出Scrapyd中全部已部署的項目:
scrapyd.list_projects()
['weibo', 'zhihu']複製代碼
還有其餘的方法在此不一一列舉了,名稱和參數都是相同的。更加詳細的操做能夠參考官方文檔:http://python-scrapyd-api.readthedocs.io/。
本節介紹了Scrapyd及Scrapyd API的相關用法,咱們能夠經過它來部署項目,並經過HTTP接口控制任務的運行。不過部署過程有一點不方便,項目須要先打包Egg文件而後再上傳,這樣比較煩瑣。在下一節,咱們介紹一個更加方便的工具來完成部署過程。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)