scrapyd是一個用於部署和運行scrapy爬蟲的程序,它允許你通過JSON API來部署爬蟲項目和控制爬蟲運行
概覽
項目和版本
scrapyd可以管理多個項目,並且每個項目允許有多個版本,但是只有最新的版本會被用來運行爬蟲.
最方便的版本管理就是利用VCS工具來記錄你的爬蟲代碼,版本比較不是簡單的通過字母排序,而是通過智能的算法,和distutils一樣,例如: r10比r9更大.
工作原理
scrapyd是一個守護進程,監聽爬蟲的運行和請求,然后啟動進程來執行它們
啟動服務
# 注意,啟動scrapyd的目錄會保存整個scrapyd運行期間生成的log, item文件,所以請選擇合適的位置運行該命令
$ scrapyd
調度爬蟲運行
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2 {"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}
web接口
安裝
需求
- Python 2.6+
- Twisted 8.0+
- Scrapy 0.17+
安裝
$ pip install scrapyd
或
$ sudo apt-get install scrapyd
項目部署
直接使用scrapyd-client提供的scrapyd-deploy
工具.
安裝scrapyd-client
$ pip install scrapyd-client
scrapyd-client工作原理
打包項目,然后調用scrapyd
的addversion.json
接口部署項目
配置服務器信息
為了方便敘述,整個部署流程以部署豆瓣電影爬蟲為例。 配置服務器和項目信息, 需要編輯scrapy.cfg
文件,添加如下內容
[deploy:server-douban]
url = http://localhost:6800/
其中server-douban
為服務器名稱, url
為服務器地址,即運行了scrapyd
命令的服務器。
檢查配置, 列出當前可用的服務器
$ scrapyd-deploy -l
server-douban http://localhost:6800/
列出服務器上所有的項目, 需要確保服務器上的scrapyd
命令正在執行,否則會報連接失敗.首次運行的話,可以看到只有一個default
項目
$ scrapyd-deploy -L server-douban
default
打開http://localhost:6800/, 可以看到Available projects: default
部署項目
在爬蟲項目根目錄下執行下面的命令, 其中target
為上一步配置的服務器名稱,project
為項目名稱,可以根據實際情況自己指定。
scrapyd-deploy <target> -p <project>
$ scrapyd-deploy server-douban -p douban-movies
Packing version 1446102534
Deploying to project "douban-movies" in http://localhost:6800/addversion.json Server response (200): {"status": "ok", "project": "douban-movies", "version": "1446102534", "spiders": 1, "node_name": "sky"}
部署操作會打包你的當前項目,如果當前項目下有setup.py
文件,就會使用它,沒有的會就會自動創建一個。(如果后期項目需要打包的話,可以根據自己的需要修改里面的信息,也可以暫時不管它). 從返回的結果里面,我們可以看到部署的狀態,項目名稱,版本號和爬蟲個數,以及當前的主機名稱.
檢查部署結果
$ scrapyd-deploy -L server-douban
default
douban-movies
或再次打開http://localhost:6800/, 也可以看到Available projects: default, douban-movies
我們也可以把項目信息寫入到配置文件中,部署時就不用指定項目信息,編輯scrapy.cfg
文件,添加項目信息
[deploy:server-douban]
url = http://localhost:6800/ project = douban-movies
下次部署可以直接執行
$ scrapyd-deploy
如果配置了多個服務器的話,可以將項目直接部署到多台服務器
$ scrapyd-deploy -a -p <project>
指定版本號
默認情況下, scrapyd-deploy
使用當前的時間戳作為版本號,我們可以使用--version
來指定版本號
scrapyd-deploy <target> -p <project> --version <version>
版本號的格式必須滿足LooseVersion
如:
# 設置版本號為0.1
$ scrapyd-deploy server-douban -p douban-movies --version 0.1 Packing version 0.1 Deploying to project "douban-movies" in http://localhost:6800/addversion.json Server response (200): {"status": "ok", "project": "douban-movies", "version": "0.1", "spiders": 1, "node_name": "sky"}
如果使用了Mercurial
或Git
管理代碼, 可以使用HG
和GIT
作為version的參數,也可以將它寫入scrapy.cfg
文件,那么就會使用當前的reversion作為版本號。
[deploy:target]
... version = GIT
$ cat scrapy.cfg
...
[deploy:server-douban] url = http://localhost:6800/ project = douban-movies version = GIT # 當前版本號為r7-master $ scrapyd-deploy server-douban -p douban-movies fatal: No names found, cannot describe anything. Packing version r7-master Deploying to project "douban-movies" in http://localhost:6800/addversion.json Server response (200): {"status": "ok", "project": "douban-movies", "version": "r7-master", "spiders": 1, "node_name": "sky"}
關於從GIT獲取版本號的方式,可以參看scrapyd-client
源碼部分
elif version == 'GIT': p = Popen(['git', 'describe'], stdout=PIPE) d = p.communicate()[0].strip('\n') if p.wait() != 0: p = Popen(['git', 'rev-list', '--count', 'HEAD'], stdout=PIPE) d = 'r%s' % p.communicate()[0].strip('\n') p = Popen(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], stdout=PIPE) b = p.communicate()[0].strip('\n') return '%s-%s' % (d, b)
服務器添加認證信息
我們也可以在scrapyd前面加一層反向代理來實現用戶認證。以nginx為例, 配置nginx
server { listen 6801; location / { proxy_pass http://127.0.0.1:6800/; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/htpasswd/user.htpasswd; } }
/etc/nginx/htpasswd/user.htpasswd
里設置的用戶名和密碼都是test
修改配置文件,添加用戶信息信息
...
[deploy:server-douban]
url = http://localhost:6801/
project = douban-movies
version = GIT
username = test
password = test
注意上面的url
已經修改為了nginx監聽的端口。
提醒: 記得修改服務器上scrapyd的配置bind_address
字段為127.0.0.1
,以免可以從外面繞過nginx, 直接訪問6800端口。 關於配置可以參看本文后面的配置文件設置.
API
scrapyd的web界面比較簡單,主要用於監控,所有的調度工作全部依靠接口實現. 具體可以參考官方文檔
常用接口:
-
調度爬蟲
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider # 帶上參數 $ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
-
取消
$ curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
-
列出項目
$ curl http://localhost:6800/listprojects.json
-
列出版本
$ curl http://localhost:6800/listversions.json?project=myproject
-
列出爬蟲
$ curl http://localhost:6800/listspiders.json?project=myproject
-
列出job
$ curl http://localhost:6800/listjobs.json?project=myproject
-
刪除版本
$ curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
-
刪除項目
$ curl http://localhost:6800/delproject.json -d project=myproject
配置文件
scrapyd
啟動的時候會自動搜索配置文件,配置文件的加載順序為
/etc/scrapyd/scrapyd.conf
/etc/scrapyd/conf.d/*
scrapyd.conf
~/.scrapyd.conf
最后加載的會覆蓋前面的設置
默認配置文件如下, 可以根據需要修改
[scrapyd]
eggs_dir = eggs logs_dir = logs items_dir = items jobs_to_keep = 5 dbs_dir = dbs max_proc = 0 max_proc_per_cpu = 4 finished_to_keep = 100 poll_interval = 5 http_port = 6800 debug = off runner = scrapyd.runner application = scrapyd.app.application launcher = scrapyd.launcher.Launcher [services] schedule.json = scrapyd.webservice.Schedule cancel.json = scrapyd.webservice.Cancel addversion.json = scrapyd.webservice.AddVersion listprojects.json = scrapyd.webservice.ListProjects listversions.json = scrapyd.webservice.ListVersions listspiders.json = scrapyd.webservice.ListSpiders delproject.json = scrapyd.webservice.DeleteProject delversion.json = scrapyd.webservice.DeleteVersion listjobs.json = scrapyd.webservice.ListJobs
關於配置的各個參數具體含義,可以參考官方文檔
更新
上面的對於scrapyd
默認項目(即是啟動scrapyd
命令后看到的default
項目.)的理解有些錯誤,只有在scrapy項目里啟動scrapyd
命令 時才有默認項目,默認項目就是當前的scrapy
項目,如果在非scrapy項目下執行scrapyd
, 是看不到default
的, 在爬蟲里項目里直接使用scrapyd
命令的好處是: 直接通調度爬蟲運行, 比較適用於當前爬蟲項目代碼結構不規范,沒法Eggifying
的情況,因為在使用scrapyd-client
部署爬蟲的前提就是爬蟲項目必須滿足下面的條件:
Deploying your project to a Scrapyd server typically involves two steps:
- Eggifying your project. You’ll need to install setuptools for this. See Egg Caveats below.
- Uploading the egg to the Scrapyd server through the addversion.json endpoint.
小結
關於scrapyd,個人感覺比較適合單機部署爬蟲和調度使用,分布式的爬蟲調度可能不太合適,需要每台機器上都啟動這樣一個服務,日志也沒有辦法集中,用jenkins來做可能更合適.