scrapyd:基于scrapy的爬虫发布管理工具

来源:互联网 发布:电商erp系统源码 编辑:程序博客网 时间:2024/06/07 01:40

最近研究scrapy爬虫框架,在整站爬取上及其方便。但是因为boss的需求比较怪异,需要自动化的最大量不同站点做爬取,而scrapy实现上述功能又不够智能和方便。后来在scrapy文档里发现了scrapyd,找到了思路。

scrapyd相当于scrapy server,可以同时运行多个爬虫。

1、安装scrapyd:

pip install scrapyd

2、运行scrapyd:

scrapyd

运行结果如下:

XXXX:~$ scrapyd2017-07-11T10:11:48+0800 [-] Loading /home/dbj/anaconda3/lib/python3.5/site-packages/scrapyd/txapp.py...2017-07-11T10:11:48+0800 [-] Scrapyd web console available at http://127.0.0.1:6800/2017-07-11T10:11:48+0800 [-] Loaded.2017-07-11T10:11:48+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 16.6.0 (/home/dbj/anaconda3/bin/python 3.5.2) starting up.2017-07-11T10:11:48+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.2017-07-11T10:11:48+0800 [-] Site starting on 68002017-07-11T10:11:48+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x7fd27e5895c0>2017-07-11T10:11:48+0800 [Launcher] Scrapyd 1.2.0 started: max_proc=8, runner='scrapyd.runner'


访问地址:http://localhost:6800/



3、scrapyd的API:

daemonstatus.json:

作用:检查服务的负载状态。

用法:支持http的GET请求,无需参数。

请求示例:

curl http://localhost:6800/daemonstatus.json

响应示例:

{  “status” : “ok” , “running” : “0” , “pending” : “0” , “finished” : “0” , “node_name” : “node-name”  }


addversion.json:

作用:向项目添加版本,如果项目不存在则创建该项目,默认情况下会使用项目的最新版本。

用法:支持http的POST请求。

参数:

    • peoject(string,required(必选)):项目名称
    • version(string,required):项目版本
    • egg(file,required)): 包含项目代码的Python egg文件

请求示例:

curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg

响应示例:

{"status": "ok", "spiders": 3}

schedule.json

作用:运行一个爬虫任务,并返回任务ID。。

用法:支持http的POST请求。

参数:

    • peoject(string,required):项目名称
    • spider(string,required):爬虫名称
    • setting(string,optional(可选)):运行爬虫时可进行的scrapy设置
    • jobid(string,optional):用户标识任务的任务ID,覆盖默认生成的UUID。
    • _version(string,optional):要使用的项目版本
    • 任何其他参数都可作为爬虫参数传递

请求示例:

curl http:// localhost:6800 / schedule.json -d project = myproject -d spider = somespider

响应示例:

{ “status” : “ok” , “jobid” : “6487ec79947edab326d6db28a2d86511e8247444” }

传递蜘蛛参数(arg1)和设置(DOWNLOAD_DELAY)的示例请求:

curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1


cancel.json

作用:取消爬虫的运行。如果爬虫任务正在等待,则移除任务。如果任务在运行,则中断任务。

用法:支持http的POST请求。

参数:

    • project(string,required):项目名称
    • job(string,required):任务id

请求示例:

curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444

响应示例:

{"status": "ok", "prevstate": "running"}


listprojects.json:

作用:获取上传到当前scrapy server的项目列表

用法:支持http的GET请求。

请求示例:

curl http://localhost:6800/listprojects.json

响应示例:

{"status": "ok", "projects": ["myproject", "otherproject"]}


listversions.json:

作用:获取可用于某些项目的版本列表。版本按顺序返回,最后一个是当前使用的版本。

用法:支持http的POST请求。

参数:

    • project(string,required):项目名称

请求示例:

curl http://localhost:6800/listversions.json?project=myproject

响应示例:

{"status": "ok", "versions": ["r99", "r156"]}

listspiders.json:

作用:获取某些项目最新版本(除非被覆盖)中的可用爬虫列表。

用法:支持http的GET请求。

参数:

    • project(string,required):项目名称
    • _version(string,optional):要检查的项目版本

请求示例:

curl http://localhost:6800/listspiders.json?project=myproject

响应示例:

curl http://localhost:6800/listspiders.json?project=myproject


listjobs.json:

作用:获取项目的待处理,运行和完成任务的列表。

用法:支持http的GET请求。

参数:

    • project(string,required):项目名称

请求示例:

curl http:// localhost:6800 / listjobs.json?project = myproject

响应示例:

{ “status” : “ok” , “pending” : [{ “id” : “78391cc0fcaf11e1b0090800272a6d06” , “spider” : “spider1” }], “running” : [{ “id” : “422e608f9f28cef127b3d5ef93fe9399” , “spider” : “spider2” , “start_time” : “2012-09-12 10:14:03.594664” }], “完成” : [{ “id” : “2f16646cfcaf11e1b0090800272a6d06”, “spider” : “spider3” , “start_time” : “2012-09-12 10:14:03.594664” , “end_time” : “2012-09-12 10:24:03.594664” }]}


delversion.json

作用:删除项目版本。如果给定项目没有可用的版本,该项目也将被删除。

用法:支持http的POST请求。

参数:

    • project(string,required):项目名称
    • version(string,optional):项目版本

请求示例:

curl http://localhost:6800/delversion.json -d project=myproject -d version=r99

响应示例:

{"status": "ok"}


delproject.json

作用:删除项目及其上传的所有版本。

用法:支持http的POST请求。

参数:

    • project(string,required):项目名称

请求示例:

 curl http://localhost:6800/delproject.json -d project=myproject

响应示例:

{"status": "ok"}

4、部署项目:

部署项目可以到通过addversion.json节点将egg文件上传到Scrapyd 。可以手动执行此操作,但最简单的方法是使用scrapyd-client提供的scrapyd-deploy工具,可以帮你完成所有操作。

4.1、安装scrapyd-client

pip install Scrapyd-client

4.2、使用方法:

1)拷贝scrapyd-deploy工具到爬虫项目根目录下 。scrapyd-deploy工具位于你的python目录下的site-packages/scrapyd-client路径中。

2)修改爬虫项目的scapy.cfg文件。

首先,去掉url前的注释符号#,这里的url就是你的scrapyd服务器的网址。

其次,deploy:110表示把爬虫发布到名为110的爬虫服务器上。

这个deploy名叫target,可以随意起,一般情况用在需要同时发布爬虫到多个目标服务器时,可以通过指定名字的方式发布到指定服务器。

其次,default=ccpmess.settings 中 ccpmess也是可以改的,貌似没啥用,默认还是用工程名字。

关键是scrapyd-deploy 所在目录,具体其实可以读下scrapyd-deploy 的代码。

# Automatically created by: scrapy startproject## For more information about the [deploy] section see:# https://scrapyd.readthedocs.org/en/latest/deploy.html[settings]default = SiteSpider.settings[deploy:110]url = http://127.0.0.1:6800/project = ccpmess[deploy:119]url = http://128.0.0.1:6800/project = ccpmess

3)查看配置

检查scrapy配置是否正确。

$ python scrapyd-deploy -l127                  http://127.0.0.1:6800/141                  http://138.0.0.141:6800/

4)发布爬虫:

scrapyd-deploy <target> -p <project> --version <version>

target就是前面配置文件里deploy后面的的target名字。

project 可以随意定义,跟爬虫的工程名字无关。

version自定义版本号,不写的话默认为当前时间戳。

运行结果”

$python scrapyd-deploy 110 -p SiteSpider --version ver20170711Packing version ver20170711Deploying to project "SiteSpider" in http://127.0.0.1:6800/addversion.jsonServer response (200):{"project": "SiteSpider", "spiders": 1, "node_name": "dbj-virtual-machine", "status": "ok", "version": "ver20170711"}

5、运行爬虫:

至此,整个scrapyd环境已经配置完成,爬虫也上传完毕,接下来就是调用爬虫。

首先,查询当前的项目状态:

curl http://localhost:6800/listprojects.json
得到结果:
{"projects": ["SiteSpider"], "node_name": "dbj-virtual-machine", "status": "ok"}

查询项目中可用爬虫:

{"spiders": ["site"], "node_name": "dbj-virtual-machine", "status": "ok"}

然后,运行爬虫:

curl http://localhost:6800/schedule.json -d project=SiteSpider -d spider=site
运行结果:
{"node_name": "dbj-virtual-machine", "status": "ok", "jobid": "ea7ae23c66ae11e791a6000c2921e83f"}

可以看到,爬虫已经开始运行。


PS:

1、爬虫开始运行后,可以通过api查询运行状态,也可以直接在可以在http://localhost:6800页面的jobs下查看任务运行状态。

2、若爬取结果以文件形式落地,那默认的当前目录为scrapyd指令运行时所在的目录。

3、运行爬虫时,也可传入爬虫所需的参数,跟在对应链接最后,每个参数前都要加上参数-a。