scrapyd和scrapyd-client使用教程

 

原文地址:http://blog.wiseturtles.com/posts/scrapyd.htmlhtml

Tags  scrapyd  scrapy  scrapyd-client By  crazygit On 2015-10-29

scrapyd是一個用於部署和運行scrapy爬蟲的程序,它容許你經過JSON API來部署爬蟲項目和控制爬蟲運行node

概覽

項目和版本

scrapyd能夠管理多個項目,而且每一個項目容許有多個版本,可是隻有最新的版本會被用來運行爬蟲.python

最方便的版本管理就是利用VCS工具來記錄你的爬蟲代碼,版本比較不是簡單的經過字母排序,而是經過智能的算法,和distutils同樣,例如: r10比r9更大.nginx

工做原理

scrapyd是一個守護進程,監聽爬蟲的運行和請求,而後啓動進程來執行它們git

啓動服務

# 注意,啓動scrapyd的目錄會保存整個scrapyd運行期間生成的log, item文件,因此請選擇合適的位置運行該命令 $ scrapyd 

調度爬蟲運行

$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2 {"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"} 

web接口

http://localhost:6800/github

安裝

需求

  • Python 2.6+
  • Twisted 8.0+
  • Scrapy 0.17+

安裝

$ pip install scrapyd

web

$ sudo apt-get install scrapyd

項目部署

直接使用scrapyd-client提供的scrapyd-deploy工具.算法

安裝scrapyd-client

$ pip install scrapyd-client


windows下的scrapyd-deploy沒法運行的解決辦法
.進到D:/python/Scripts 目錄下,建立兩個新文件:
scrapy.bat
scrapyd-deploy.bat


2. 編輯兩個文件:
scrapy.bat文件中輸入如下內容 :
@echo off
D:\Python36\python D:\Python36\Scripts\scrapy %*


scrapyd-deploy.bat 文件中輸入如下內容:
@echo off
D:\Python36\python D:\Python36\Scripts\scrapyd-deploy %*


3. 保存退出,並確保你的 D:/python 和D:/python/Scripts  都在環境變量。這樣就能夠正常運行scrapy-deploy命令了。

scrapyd-client工做原理

打包項目,而後調用scrapydaddversion.json接口部署項目json

配置服務器信息

爲了方便敘述,整個部署流程以部署豆瓣電影爬蟲爲例。 配置服務器和項目信息, 須要編輯scrapy.cfg文件,添加以下內容windows

[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"} 

若是使用了MercurialGit管理代碼, 可使用HGGIT做爲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來作可能更合適.

相關文章
相關標籤/搜索