scrapyd是一個用于部署和運行scrapy爬蟲的程序篡九,它允許你通過JSON?API來部署爬蟲項目和控制爬蟲運行
項目和版本
scrapyd可以管理多個項目蚣抗,并且每個項目允許有多個版本,但是只有最新的版本會被用來運行爬蟲.
最方便的版本管理就是利用VCS工具來記錄你的爬蟲代碼瓮下,版本比較不是簡單的通過字母排序翰铡,而是通過智能的算法,和distutils一樣讽坏,例如:?r10比r9更大
工作原理
scrapyd是一個守護進程锭魔,監(jiān)聽爬蟲的運行和請求,然后啟動進程來執(zhí)行它們
啟動服務(wù)
# 注意路呜,啟動scrapyd的目錄會保存整個scrapyd運行期間生成的log, item文件迷捧,所以請選擇合適的位置運行該命令$ scrapyd
調(diào)度爬蟲運行
$ curl http://localhost:6800/schedule.json -dproject=myproject -dspider=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工作原理
打包項目织咧,然后調(diào)用scrapyd的addversion.json接口部署項目
配置服務(wù)器信息
為了方便敘述,整個部署流程以部署豆瓣電影爬蟲為例漠秋。 配置服務(wù)器和項目信息, 需要編輯scrapy.cfg文件笙蒙,添加如下內(nèi)容
[deploy:server-douban]url=http://localhost:6800/
其中server-douban為服務(wù)器名稱,?url為服務(wù)器地址,即運行了scrapyd命令的服務(wù)器庆锦。
檢查配置,?列出當前可用的服務(wù)器
$ scrapyd-deploy -lserver-douban? ? ? ? http://localhost:6800/
列出服務(wù)器上所有的項目, 需要確保服務(wù)器上的scrapyd命令正在執(zhí)行捅位,否則會報連接失敗.首次運行的話,可以看到只有一個default項目
$ scrapyd-deploy -L server-doubandefault
打開http://localhost:6800/, 可以看到Available projects: default
部署項目
在爬蟲項目根目錄下執(zhí)行下面的命令, 其中target為上一步配置的服務(wù)器名稱搂抒,project為項目名稱艇搀,可以根據(jù)實際情況自己指定。
scrapyd-deploy -p
$ scrapyd-deploy server-douban -p douban-moviesPacking version1446102534Deploying to project"douban-movies"in http://localhost:6800/addversion.jsonServer response(200):{"status":"ok","project":"douban-movies","version":"1446102534","spiders":1,"node_name":"sky"}
部署操作會打包你的當前項目求晶,如果當前項目下有setup.py文件焰雕,就會使用它,沒有的會就會自動創(chuàng)建一個芳杏。(如果后期項目需要打包的話矩屁,可以根據(jù)自己的需要修改里面的信息,也可以暫時不管它).?從返回的結(jié)果里面爵赵,我們可以看到部署的狀態(tài)档插,項目名稱,版本號和爬蟲個數(shù)亚再,以及當前的主機名稱.
檢查部署結(jié)果
$ scrapyd-deploy -L server-doubandefaultdouban-movies
或再次打開http://localhost:6800/, 也可以看到Available projects: default, douban-movies
我們也可以把項目信息寫入到配置文件中郭膛,部署時就不用指定項目信息,編輯scrapy.cfg文件氛悬,添加項目信息
[deploy:server-douban]url=http://localhost:6800/project=douban-movies
下次部署可以直接執(zhí)行
$ scrapyd-deploy
如果配置了多個服務(wù)器的話则剃,可以將項目直接部署到多臺服務(wù)器
$ scrapyd-deploy -a -p
指定版本號
默認情況下,?scrapyd-deploy使用當前的時間戳作為版本號,我們可以使用--version來指定版本號
scrapyd-deploy -p --version
版本號的格式必須滿足LooseVersion
如:
# 設(shè)置版本號為0.1$ scrapyd-deploy server-douban -p douban-movies --version0.1Packing version0.1Deploying to project"douban-movies"in http://localhost:6800/addversion.jsonServer response(200):{"status":"ok","project":"douban-movies","version":"0.1","spiders":1,"node_name":"sky"}
如果使用了Mercurial或Git管理代碼如捅, 可以使用HG和GIT作為version的參數(shù)棍现,也可以將它寫入scrapy.cfg文件,那么就會使用當前的reversion作為版本號镜遣。
[deploy:target]...version=GIT
$ cat scrapy.cfg...[deploy:server-douban]url=http://localhost:6800/project=douban-moviesversion=GIT
# 當前版本號為r7-master
$ scrapyd-deploy server-douban -p douban-movies fatal: No names found, cannot describe anything.Packing version r7-masterDeploying to project"douban-movies"in http://localhost:6800/addversion.jsonServer response(200):{"status":"ok","project":"douban-movies","version":"r7-master","spiders":1,"node_name":"sky"}
關(guān)于從GIT獲取版本號的方式己肮,可以參看scrapyd-client源碼部分
elifversion=='GIT':p=Popen(['git','describe'],stdout=PIPE)d=p.communicate()[0].strip('\n')ifp.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)
服務(wù)器添加認證信息
我們也可以在scrapyd前面加一層反向代理來實現(xiàn)用戶認證。以nginx為例,?配置nginx
server{listen6801;location/{proxy_passhttp://127.0.0.1:6800/;auth_basic"Restricted";auth_basic_user_file/etc/nginx/htpasswd/user.htpasswd;}}
/etc/nginx/htpasswd/user.htpasswd里設(shè)置的用戶名和密碼都是test?修改配置文件悲关,添加用戶信息信息
...[deploy:server-douban]url = http://localhost:6801/project = douban-moviesversion = GITusername = testpassword = test
注意上面的url已經(jīng)修改為了nginx監(jiān)聽的端口谎僻。
提醒: 記得修改服務(wù)器上scrapyd的配置bind_address字段為127.0.0.1,以免可以從外面繞過nginx, 直接訪問6800端口寓辱。?關(guān)于配置可以參看本文后面的配置文件設(shè)置.
API
scrapyd的web界面比較簡單艘绍,主要用于監(jiān)控,所有的調(diào)度工作全部依靠接口實現(xiàn). 具體可以參考官方文檔
常用接口:
調(diào)度爬蟲
$ curl http://localhost:6800/schedule.json -dproject=myproject -dspider=somespider
# 帶上參數(shù)
$ curl http://localhost:6800/schedule.json -dproject=myproject -dspider=somespider -dsetting=DOWNLOAD_DELAY=2-darg1=val1
取消
$ curl http://localhost:6800/cancel.json -dproject=myproject -djob=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 -dproject=myproject -dversion=r99
刪除項目
$ curl http://localhost:6800/delproject.json -dproject=myproject
配置文件
scrapyd啟動的時候會自動搜索配置文件秫筏,配置文件的加載順序為
/etc/scrapyd/scrapyd.conf
/etc/scrapyd/conf.d/*
scrapyd.conf
~/.scrapyd.conf
最后加載的會覆蓋前面的設(shè)置
默認配置文件如下,?可以根據(jù)需要修改
[scrapyd]eggs_dir=eggslogs_dir=logsitems_dir=itemsjobs_to_keep=5dbs_dir=dbsmax_proc=0max_proc_per_cpu=4finished_to_keep=100poll_interval=5http_port=6800debug=offrunner=scrapyd.runnerapplication=scrapyd.app.applicationlauncher=scrapyd.launcher.Launcher[services]schedule.json=scrapyd.webservice.Schedulecancel.json=scrapyd.webservice.Canceladdversion.json=scrapyd.webservice.AddVersionlistprojects.json=scrapyd.webservice.ListProjectslistversions.json=scrapyd.webservice.ListVersionslistspiders.json=scrapyd.webservice.ListSpidersdelproject.json=scrapyd.webservice.DeleteProjectdelversion.json=scrapyd.webservice.DeleteVersionlistjobs.json=scrapyd.webservice.ListJobs
關(guān)于配置的各個參數(shù)具體含義诱鞠,可以參考官方文檔