當前位置:
首頁 > 最新 > 分散式爬蟲的部署之Scrapyd分散式部署

分散式爬蟲的部署之Scrapyd分散式部署

分散式爬蟲完成並可以成功運行了,但是有個環節非常煩瑣,那就是代碼部署。

我們設想下面的幾個場景。

如果採用上傳文件的方式部署代碼,我們首先將代碼壓縮,然後採用SFTP或FTP的方式將文件上傳到伺服器,之後再連接伺服器將文件解壓,每個伺服器都需要這樣配置。

如果採用Git同步的方式部署代碼,我們可以先把代碼Push到某個Git倉庫里,然後再遠程連接各台主機執行Pull操作,同步代碼,每個伺服器同樣需要做一次操作。

如果代碼突然有更新,那我們必須更新每個伺服器,而且萬一哪台主機的版本沒控制好,這可能會影響整體的分散式爬取狀況。

所以我們需要一個更方便的工具來部署Scrapy項目,如果可以省去一遍遍逐個登錄伺服器部署的操作,那將會方便很多。

本節我們就來看看提供分散式部署的工具Scrapyd。

一、了解Scrapyd

Scrapyd是一個運行Scrapy爬蟲的服務程序,它提供一系列HTTP介面來幫助我們部署、啟動、停止、刪除爬蟲程序。Scrapyd支持版本管理,同時還可以管理多個爬蟲任務,利用它我們可以非常方便地完成Scrapy爬蟲項目的部署任務調度。

二、準備工作

請確保本機或伺服器已經正確安裝好了Scrapyd。

三、訪問Scrapyd

安裝並運行Scrapyd之後,我們就可以訪問伺服器的6800埠,看到一個WebUI頁面。例如我的伺服器地址為120.27.34.25,那麼我就可以在本地的瀏覽器中打開:http://120.27.34.25:6800,就可以看到Scrapyd的首頁。這裡可以替換成你的伺服器地址,如下圖所示

成功訪問到此頁面,則Scrapyd配置就沒有問題。

四、Scrapyd的功能

Scrapyd提供了一系列HTTP介面來實現各種操作。在這裡以Scrapyd所在的IP地址120.27.34.25為例,我們可以將介面的功能梳理一下。

1. daemonstatus.json

這個介面負責查看Scrapyd當前的服務和任務狀態。我們可以用命令來請求這個介面,命令如下:

curl http://139.217.26.30:6800/daemonstatus.json

我們就會得到如下結果:

{"status":"ok", "finished":90, "running":9, "node_name":"datacrawl-vm", "pending":}

返回結果是JSON字元串,是當前運行狀態,代表當前已經完成的Scrapy任務,代表正在運行的Scrapy任務,代表等待被調度的Scrapyd任務,就是主機的名稱。

2. addversion.json

這個介面主要是用來部署Scrapy項目用的。我們首先將項目打包成Egg文件,然後傳入項目名稱和部署版本。

我們可以用如下的方式實現項目部署:

curl http://120.27.34.25:6800/addversion.json -F project=wenbo -F version=first -F egg=@weibo.egg

在這裡, 代表添加一個參數,同時我們還需要將項目打包成Egg文件放到本地。

發出請求之後,我們可以得到如下結果:

{"status":"ok", "spiders":3}

這個結果表明部署成功,並且Spider的數量為3。

此部署方法可能比較煩瑣,後文會介紹更方便的工具來實現項目的部署。

3. schedule.json

這個介面負責調度已部署好的Scrapy項目運行。

我們可以用如下介面實現任務調度:

curl http://120.27.34.25:6800/schedule.json -d project=weibo -d spider=weibocn

這裡需要傳入兩個參數,即Scrapy項目名稱,即Spider名稱。

返回結果如下:

{"status":"ok", "jobid":"6487ec79947edab326d6db28a2d86511e8247444"}

代表Scrapy項目啟動情況,代表當前正在運行的爬取任務代號。

4. cancel.json

這個介面可以用來取消某個爬取任務。如果這個任務是狀態,那麼它將會被移除;如果這個任務是狀態,那麼它將會被終止。

我們可以用下面的命令來取消任務的運行:

curl http://120.27.34.25:6800/cancel.json -d project=weibo -d job=6487ec79947edab326d6db28a2d86511e8247444

這裡需要傳入兩個參數,即項目名稱,即爬取任務代號。

返回結果如下:

{"status":"ok", "prevstate":"running"}

代表請求執行情況,代表之前的運行狀態。

5. listprojects.json

這個介面用來列出部署到Scrapyd服務上的所有項目描述。

我們可以用如下命令來獲取Scrapyd伺服器上的所有項目描述:

curl http://120.27.34.25:6800/listprojects.json

這裡不需要傳入任何參數。

返回結果如下:

{"status":"ok", "projects":["weibo","zhihu"]}

代表請求執行情況,是項目名稱列表。

6. listversions.json

這個介面用來獲取某個項目的所有版本號,版本號是按序排列的,最後一個條目是最新的版本號。

我們可以用如下命令來獲取項目的版本號:

curl http://120.27.34.25:6800/listversions.json?project=weibo

這裡需要一個參數,即項目的名稱。

返回結果如下:

{"status":"ok", "versions":["v1","v2"]}

代表請求執行情況,是版本號列表。

7. listspiders.json

這個介面用來獲取某個項目最新版本的所有Spider名稱。

我們可以用如下命令來獲取項目的Spider名稱:

curl http://120.27.34.25:6800/listspiders.json?project=weibo

這裡需要一個參數,即項目的名稱。

返回結果如下:

{"status":"ok", "spiders":["weibocn"]}

代表請求執行情況,是Spider名稱列表。

8. listjobs.json

這個介面用來獲取某個項目當前運行的所有任務詳情。

我們可以用如下命令來獲取所有任務詳情:

curl http://120.27.34.25:6800/listjobs.json?project=weibo

這裡需要一個參數,即項目的名稱。

返回結果如下:

{"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"}]}

代表請求執行情況,代表當前正在等待的任務,代表當前正在運行的任務,代表已經完成的任務。

9. delversion.json

這個介面用來刪除項目的某個版本。

我們可以用如下命令來刪除項目版本:

curl http://120.27.34.25:6800/delversion.json -d project=weibo -d version=v1

這裡需要一個參數,即項目的名稱,還需要一個參數,即項目的版本。

返回結果如下:

{"status":"ok"}

代表請求執行情況,這樣就表示刪除成功了。

10. delproject.json

這個介面用來刪除某個項目。

我們可以用如下命令來刪除某個項目:

curl http://120.27.34.25:6800/delproject.json -d project=weibo

這裡需要一個參數,即項目的名稱。

返回結果如下:

{"status":"ok"}

代表請求執行情況,這樣就表示刪除成功了。

以上介面是Scrapyd所有的介面。我們可以直接請求HTTP介面,即可控制項目的部署、啟動、運行等操作。

五、Scrapyd API的使用

以上的這些介面可能使用起來還不是很方便。沒關係,還有一個Scrapyd API庫對這些介面做了一層封裝,其安裝方式可以參考第1章的內容。

下面我們來看看Scrapyd API的使用方法。Scrapyd API的核心原理和HTTP介面請求方式並無二致,只不過Python封裝後的庫使用起來更加便捷。

我們可以用如下方式建立一個Scrapyd API對象:

fromscrapyd_apiimportScrapydAPI

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介面,名稱都是相同的,參數也是相同的。

例如,調用方法即可列出Scrapyd中所有已部署的項目:

scrapyd.list_projects()

["weibo","zhihu"]

六、結語

本節介紹了Scrapyd及Scrapyd API的相關用法,我們可以通過它來部署項目,並通過HTTP介面控制任務的運行。不過部署過程有一點不方便,項目需要先打包Egg文件然後再上傳,這樣比較煩瑣。在下一節,我們介紹一個更加方便的工具來完成部署過程。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 進擊的Coder 的精彩文章:

Scrapy對接Docker
分散式爬蟲原理之Scrapy分散式實現

TAG:進擊的Coder |