1. 程式人生 > >Python爬蟲從入門到放棄(二十一)之 Scrapy分布式部署

Python爬蟲從入門到放棄(二十一)之 Scrapy分布式部署

安裝 abc package .com 調度 fault 官方 python3 ocs

原文地址https://www.cnblogs.com/zhaof/p/7308865.html

按照上一篇文章中我們將代碼放到遠程主機是通過拷貝或者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主要實現以下內容:

  1. 把我們本地代碼打包生成egg文件
  2. 根據我們配置的url上傳到遠程服務器上

我們將我們本地的scrapy項目中scrapy.cfg配置文件進行配置:

技術分享圖片

我們其實還可以設置用戶名和密碼,不過這裏沒什麽必要,只設置了url
這裏設置url一定要註意:url = http://192.168.1.9:6800/addversion.json
最後的addversion.json不能少

我們在本地安裝pip install scrapy_client,安裝完成後執行:scrapyd-deploy

技術分享圖片
zhaofandeMBP:zhihu_user zhaofan$ scrapyd-deploy
Packing version 1502177138
Deploying to project "zhihu_user" in http://192.168.1.9:6800/addversion.json
Server response (200):
{"node_name": "fan-VirtualBox", "status": "ok", "version": "1502177138", "spiders": 1, "project": "zhihu_user"}

zhaofandeMBP:zhihu_user zhaofan$ 
技術分享圖片

看到status:200表示已經成功

關於常用操作API

listprojects.json列出上傳的項目列表

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listprojects.json
{"node_name": "fan-VirtualBox", "status": "ok", "projects": ["zhihu_user"]}
zhaofandeMBP:zhihu_user zhaofan$ 

listversions.json列出有某個上傳項目的版本

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listversions.json\?project\=zhihu_user
{"node_name": "fan-VirtualBox", "status": "ok", "versions": ["1502177138"]}
zhaofandeMBP:zhihu_user zhaofan$ 

schedule.json遠程任務的啟動

下面我們啟動的三次就表示我們啟動了三個任務,也就是三個調度任務來運行zhihu這個爬蟲

技術分享圖片
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "97f1b5027c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "99595aa87c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "9abb1ba27c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$
技術分享圖片

同時當啟動完成後,我們可以通過頁面查看jobs,這裏因為我遠端服務器並沒有安裝scrapy_redis,所以顯示任務是完成了,我點開日誌並能看到詳細的日誌情況:

技術分享圖片

技術分享圖片

這裏出錯的原因就是我上面忘記在ubuntu虛擬機安裝scrapy_redis以及pymongo模塊,進行
pip install scrapy_redis pymongo安裝後重新啟動,就可以看到已經在運行的任務,同時點開Log日誌也能看到爬取到的內容:

技術分享圖片

技術分享圖片

listjobs.json列出所有的jobs任務
上面是通過頁面顯示所有的任務,這裏是通過命令獲取結果

技術分享圖片
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listjobs.json\?project\=zhihu_user
{"node_name": "fan-VirtualBox", "status": "ok", "running": [], "pending": [], "finished": [{"start_time": "2017-08-08 15:53:00.510050", "spider": "zhihu", "id": "97f1b5027c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:01.416139"}, {"start_time": "2017-08-08 15:53:05.509337", "spider": "zhihu", "id": "99595aa87c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:06.627125"}, {"start_time": "2017-08-08 15:53:10.509978", "spider": "zhihu", "id": "9abb1ba27c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:11.542001"}]}
zhaofandeMBP:zhihu_user zhaofan$ 
技術分享圖片

cancel.json取消所有運行的任務
這裏可以將上面啟動的所有jobs都可以取消:

技術分享圖片
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=0f5cdabc7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=63f8e12e7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=63f8e12f7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}
技術分享圖片

這樣當我們再次通過頁面查看,就可以看到所有的任務都是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)
技術分享圖片

Cancel a scheduled job
scrapyd.cancel(‘project_name‘, ‘14a6599ef67111e38a0e080027880ca6‘)

Delete a project and all sibling versions
scrapyd.delete_project(‘project_name‘)

Delete a version of a project
scrapyd.delete_version(‘project_name‘, ‘version_name‘)

Request status of a job
scrapyd.job_status(‘project_name‘, ‘14a6599ef67111e38a0e080027880ca6‘)

List all jobs registered
scrapyd.list_jobs(‘project_name‘)

List all projects registered
scrapyd.list_projects()

List all spiders available to a given project
scrapyd.list_spiders(‘project_name‘)

List all versions registered to a given project
scrapyd.list_versions(‘project_name‘)

Schedule a job to run with a specific spider
scrapyd.schedule(‘project_name‘, ‘spider_name‘)

Schedule a job to run while passing override settings
settings = {‘DOWNLOAD_DELAY‘: 2}

Schedule a job to run while passing extra attributes to spider initialisation
scrapyd.schedule(‘project_name‘, ‘spider_name‘, extra_attribute=‘value‘)

Python爬蟲從入門到放棄(二十一)之 Scrapy分布式部署