scrapy項目部署


什么是scrapyd

Scrapyd是部署和運行Scrapy.spider的應用程序。它使您能夠使用JSON API部署(上傳)您的項目並控制其spider。

特點:

  1. 可以避免爬蟲源碼被看到。
  2. 有版本控制。
  3. 可以遠程啟動、停止、刪除

scrapyd官方文檔:http://scrapyd.readthedocs.io/en/stable/overview.html

安裝scrapyd

  1. 安裝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文件;

  1. 首先去掉url前面的注釋符號,url是scrapyd服務器的網址
  2. 然后project=tenCent為項目名稱,可以隨意起名
  3. 修改[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數據庫,需要先啟動對應的服務

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM