最近研究scrapy爬虫框架,在整站爬取上及其方便。但是因为boss的需求比较怪异,需要自动化的最大量不同站点做爬取,而scrapy实现上述功能又不够智能和方便。后来在scrapy文档里发现了scrapyd,找到了思路。
scrapyd相当于scrapy server,可以同时运行多个爬虫。
1、安装scrapyd:
pip install scrapyd
2、运行scrapyd:
scrapyd
运行结果如下:
XXXX:~$ scrapyd
2017-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 6800
2017-07-11T10:11:48+0800 [twisted.web.server.Site#info] Starting factory
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请求。
参数:
请求示例:
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F [email protected]
响应示例:
{"status": "ok", "spiders": 3}
schedule.json
作用:运行一个爬虫任务,并返回任务ID。。
用法:支持http的POST请求。
参数:
请求示例:
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请求。
参数:
请求示例:
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请求。
参数:
请求示例:
curl http://localhost:6800/listversions.json?project=myproject
响应示例:
{"status": "ok", "versions": ["r99", "r156"]}
listspiders.json:
作用:获取某些项目最新版本(除非被覆盖)中的可用爬虫列表。
用法:支持http的GET请求。
参数:
请求示例:
curl http://localhost:6800/listspiders.json?project=myproject
响应示例:
curl http://localhost:6800/listspiders.json?project=myproject
listjobs.json:
作用:获取项目的待处理,运行和完成任务的列表。
用法:支持http的GET请求。
参数:
请求示例:
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请求。
参数:
请求示例:
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
响应示例:
{"status": "ok"}
delproject.json
作用:删除项目及其上传的所有版本。
用法:支持http的POST请求。
参数:
请求示例:
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
检查scrapy配置是否正确。
$ python scrapyd-deploy -l
127 http://127.0.0.1:6800/
141 http://138.0.0.141:6800/
scrapyd-deploy
target就是前面配置文件里deploy后面的的target名字。
project 可以随意定义,跟爬虫的工程名字无关。
version自定义版本号,不写的话默认为当前时间戳。
运行结果”
$python scrapyd-deploy 110 -p SiteSpider --version ver20170711
Packing version ver20170711
Deploying to project "SiteSpider" in http://127.0.0.1:6800/addversion.json
Server 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。