什么是scrapyd
Scrapyd是部署和運行Scrapy.spider的應用程序。它使您能夠使用JSON API部署(上傳)您的項目並控制其spider。
特點:
- 可以避免爬蟲源碼被看到。
- 有版本控制。
- 可以遠程啟動、停止、刪除
scrapyd官方文檔:http://scrapyd.readthedocs.io/en/stable/overview.html
安裝scrapyd
- 安裝scrapyd
- 主要有兩種安裝方式:
- pip install scrapyd (安裝的版本可能不是最新版本)
- 從 https://github.com/scrapy/scrapyd 中下載源碼, 運行python setup.py install 命令進行安裝。
2.安裝 scrapyd-deploy
- 主要有兩種安裝方式:
- pip install scrapyd-client(安裝的版本可能不是最新版本)
- 從 http://github.com/scrapy/scrapyd-client 中下源碼, 運行python setup.py install 命令進行安裝。
scrapyd的簡單使用
1.運行scrapyd
運行命令:scrapyd
然后打開瀏覽器,輸入ip加端口:127.0.0.1:6800(或localhost:6800)
2.發布項目到scrapyd
來到待發布項目的文件夾下,發布前需要修改一下配置文件,打開scrapy.cfg文件;
- 首先去掉url前面的注釋符號,url是scrapyd服務器的網址
- 然后project=tenCent為項目名稱,可以隨意起名
- 修改[deploy]為[deploy:100],表示把爬蟲發布到名為100的爬蟲服務器上,一般在需要同時發布爬蟲到多個目標服務器時使用
最后,打開一個新的終端,運行命令:
scrapyd-deploy <target> -p <project> --version <version>
參數解釋:
Target:deploy后面的名稱。可以為空
Project:自行定義名稱,跟爬蟲的工程名字無關。
Version:自定義版本號,不寫的話默認為當前時間戳。
刷新瀏覽器頁面:
3.創建運行爬蟲任務
使用命令:
curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider_name
然后點擊瀏覽器界面的Jobs
就可以得到該爬蟲的相關運行信息。這里的schedule.json只是scrapyd里的一個API接口,scrapyd還提供其他API接口,具體如下。
scrapyd的控制API
所有的API都是通過http協議發送的請求,目前總共10個api
規則是:http://ip:port/api_command.json,有GET和POST兩種請求
1) daemonstatus.json
檢查服務狀態
curl http://localhost:6800/daemonstatus.json
結果示例:
2) addversion.json
增加項目到服務器,如果項目已經存在,則增加一個新的版本
POST請求:
- project (string, required) –項目名
- version (string, required) –項目版本,不填寫則是當前時間戳
- egg (file, required) –當前項目的egg文件
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg
結果示例:
3) schedule.json
啟動一個爬蟲項目
POST請求:
- project (string, required) –項目名
- spider (string, required) –爬蟲名,spider類中指定的name
- setting (string, optional) –自定義爬蟲settings
- jobid (string, optional) –jobid,之前啟動過的spider,會有一個id
- _version (string, optional) –版本號,之前部署的時候的version,只能使用int數據類型,沒指定,默認啟動最新版本
- 其他額外的參數都會放入到spider的參數中
curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider
結果示例:
4) cancel.json
取消一個 spdier的運行
如果 spider是運行狀態,則停止其運行
如果 spider是掛起狀態,則刪除spider
POST請求:
- project (string, required) –項目名
- job (string, required) -jobid
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
結果示例:
5) listprojects.json
獲取當前已上傳的項目的列表
GET請求:
curl http://localhost:6800/listprojects.json
結果示例:
6) listversions.json
獲取指定項目的可用版本
GET請求:
- project (string, required) –項目名
curl http://localhost:6800/listversions.json?project=myproject
結果示例:
7) listspiders.json
獲取指定版本的項目中的爬蟲列表,如果沒有指定版本,則是最新版本
GET請求:
- project (string, required) –項目名
- _version (string, optional) –版本號
$ curl http://localhost:6800/listspiders.json?project=myproject
結果示例:
8) listjobs.json
獲取指定項目中所有掛起、運行和運行結束的job
GET請求
- project (string, option) - restrict results to project name
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool
結果示例:
{ "status":"ok", "pending":[ { "project":"myproject","spider":"spider1", "id":"78391cc0fcaf11e1b0090800272a6d06" } ], "running":[ { "id":"422e608f9f28cef127b3d5ef93fe9399", "project":"myproject","spider":"spider2", "start_time":"2012-09-12 10:14:03.594664" } ], "finished":[ { "id":"2f16646cfcaf11e1b0090800272a6d06", "project":"myproject","spider":"spider3", "start_time":"2012-09-12 10:14:03.594664", "end_time":"2012-09-12 10:24:03.594664" } ] }
9) delversion.json
刪除指定項目的指定版本
POST請求
- project (string, required) - the project name
- version (string, required) - the project version
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
結果示例:
10) delproject.json
刪除指定項目,並且包括所有的版本
POST請求
- project (string, required) - the project name
curl http://localhost:6800/delproject.json -d project=myproject
結果示例:
BUG處理
1、 builtins.KeyError: 'project'
錯誤信息如下:
解決:
進行post提交時,需要將參數提交放入到 params或 data中,而不是json
如:requests.post(url, params=params)或requests.post(url, data=params)
2、 TypeError: __init__() missing 1 required positional argument: 'self'
修改 spider,增加:
def __init__(self, **kwargs):
super(DingdianSpider, self).__init__(self, **kwargs)
3、 redis.exceptions.ConnectionError: Error 10061 connecting to localhost:6379
有類似這樣的錯誤,是由於項目中有連接其他服務,譬如這里是redis數據庫,需要先啟動對應的服務