如果觉得文章对您产生帮助的话, 欢迎关注Python开发之路(微信公众号: python-developer), 及时获取更多教程
假设有我们做了一个项目是抓取很多网站(每个网站对应一个爬虫), 需要分别部署到不同的服务器上(单台扛不住), scrapy官方也提供了一种部署工具scrapyd
。
这个工具是用来将爬虫的项目的egg文件上传到服务器上, 然后通过接口调用来启动爬虫. 上传egg可以手动上传, 但是比较麻烦。
所以有另外一个工具scrapy-client
提供的scrapyd-deploy
工具来进行egg文件的生成以及上传到scrapyd服务器
另外我们在创建scrapy项目的时候, 有一个scrapy.cfg
, 这个文件其实是为scrapy-client
使用的
# scrapy crawl命令等使用的配置文件路径
[settings]
default = ccidcom.settings[deploy] # 在使用scrapyd-deploy进行生成egg和上传的时候会使用
url = http://127.0.0.1:6800/
project = ccidcom
基本的一个部署流程:
- 在爬虫目标服务器上运行
scrapyd
- 修改爬虫项目的
scrapy.cfg
文件, 指定爬虫目标服务器(scrapyd)服务器地址 - 在爬虫的项目服务器(不一定和爬虫目标服务器是同一台)上运行
scrapyd-delopy
来生成egg文件并且上传到指定的服务器 - 调用
scrapyd
服务器的url运行爬虫
一、安装scrapyd和scrapyd-client
pip install scrapyd
pip install scrapyd-client==1.2.0a1
scrapyd-client
指定版本的原因是下载的默认版本是1.1.0, 缺少scrapyd-client命令, 会提示scrapyd-client command not found
二、启动scrapyd
1. 配置文件
scrapyd会自动搜索配置文件的路径, 以下就是指定的路径, scrapyd会按照顺序搜索文件
scrapyd无法通过命令行指定配置文件!!
/etc/scrapyd/scrapyd.conf
(Unix)c:scrapydscrapyd.conf
(Windows)/etc/scrapyd/conf.d/*
(in alphabetical order, Unix)scrapyd.conf
~/.scrapyd.conf
(users home directory)
所以我们在项目目录中创建一个scrapyd.conf
.
这个配置文件里是不需要加引号的!
[scrapyd]
# 服务监听端口
http_port=6800
# 服务监听ip, 默认是127.0.0.1
bind_address=0.0.0.0
# 启动时的scrapy进程并发数, 如果没有设置或者是0, 则是系统可用的cpu数量乘以`max_proc_per_cpu`的值, 默认是0
max_proc=0
# 每个cpu的scrapy进程并发数,默认是:4
max_proc_per_cpu=4
# 是否开启调试模式, 默认是off, 如果开启, 当调用`JSON API`发生错误时, 会返回详细的错误信息
debug=off
# scrapyd-deploy上传的egg文件的保存路径, 默认是scrapyd运行的当前目录
eggs_dir=./eggs
# scrapyd运行是的数据库路径, 包括爬虫队列信息
dbs_dir=./dbs
# Scrapy运行时的日志保存路径, 如果禁用则设置为空
logs_dir=./logs
# Scrapy运行时产生的item的数据保存路径, 因为一般都是导出或者保存到数据库, 所以这个建议禁用, 默认是禁用状态
items_dir=
# 每个爬虫运行完成后的logs和items数据保存数量, 也就是假设同一个爬虫运行到第六次, 则会删除前5次爬虫产生的数据, 这个配置项之前是`logs_to_keep`
jobs_to_keep=5
# 保存在启动器中的已完成的进程数量
finished_to_keep=100
# 轮训队列的秒数, 也就是多长时间检查一下爬虫队列
poll_interval=5
# 启动子进程的模块
# runner= scrapyd.runner
# scrapyd启动的app应用文件
# application=scrapyd.app.application
# scrapyd资源跟目录
# webroot = scrapyd.website.Root
# 节点的展示名称, 默认是${socket.gethostname()}
# node_name=# 以下是调用接口的url路径和对应的scrapyd类, 熟悉源码可以自己进行开发
[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
daemonstatus.json = scrapyd.webservice.DaemonStatus
2. 启动scrapyd
scrapyd
运行成功以后提示
2019-12-24T16:49:54+0800 [-] Loading /private/var/www/test/.venv/lib/python3.6/site-packages/scrapyd/txapp.py...
2019-12-24T16:49:54+0800 [-] Scrapyd web console available at http://0.0.0.0:6800/ # 可用的请求地址
2019-12-24T16:49:54+0800 [-] Loaded.
2019-12-24T16:49:54+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 19.10.0 (/private/var/www/test/.venv/bin/python3.6 3.6.5) starting up.
2019-12-24T16:49:54+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.selectreactor.SelectReactor.
2019-12-24T16:49:54+0800 [-] Site starting on 6800 # 监听端口
2019-12-24T16:49:54+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x103a50cc0>
2019-12-24T16:49:54+0800 [Launcher] Scrapyd 1.2.1 started: max_proc=48, runner='scrapyd.runner' # 启动runner
2. 查看web界面
在浏览器中输入http://127.0.0.1:6800
, 可以看到scrapyd服务器的web界面
Jobs
: 是所有调用过的爬虫的任务列表
Logs
: 所有任务产生的日志
三、scrapyd-deploy部署爬虫
scrapyd-deploy是在爬虫项目里运行的, 也就是和scrapy.cfg
文件同级的目录
1. 修改scrapy.cfg
文件
如果有多个爬虫目标服务器, 可以增加[deploy:]
区域
[settings]
default = ccidcom.settings[deploy:ccid] # 默认是[deploy], ccid这里指定的是目标服务器的名称
url = http://127.0.0.1:6800/ # 目标服务器的url和端口
project = ccidcom # 项目名称
2. 生成egg文件并且上传到scrapyd服务器
scrapyd-deploy [目标服务器名称] -p [项目名称]
scrapyd-deploy ccid -p ccidcom
如果成功, 会返回以下信息
Packing version 1577178235
Deploying to project "ccidcom" in http://127.0.0.1:6800/addversion.json
Server response (200):
{"node_name": "bogon", "status": "ok", "project": "ccidcom", "version": "1577178235", "spiders": 1}
意思就是发布到指定的爬虫目标服务器, 发布上去的spiders数量是1, status是状态,project是项目名
同样的, 在scrapyd
服务器上也会输出以下信息
2019-12-24T17:03:56+0800 [twisted.python.log#info] "127.0.0.1" - - [24/Dec/2019:09:03:55 +0000] "POST /addversion.json HTTP/1.1" 200 100 "-" "Python-urllib/3.6"
3. scrapyd-client的一些操作
1. 列出当前的项目
scrapyd-client projects
scrapyd-client -t http://127.0.0.1:6800 projects
-t: 指定scrapyd的地址
2. 列出指定项目的爬虫列表
scrapyd-client spiders -p [项目名称]
scrapyd-client spiders -p ccidcom
scrapyd-client -t http://127.0.0.1:6800 spiders -p ccidcom
得到输出
ccidcom: # 项目名称ccid # 爬虫名
3. 运行爬虫
scrapyd-client schedule -p [项目名] [爬虫名]
scrapyd-client schedule -p ccidcom ccid
scrapyd-client -t http://127.0.0.1:6800 schedule -p ccidcom ccid
可以看到任务的名称
ccidcom / ccid => 6cab8f8c262d11ea8935acde48001122
这时我们查看scrapyd的web管理界面, 也可以看到所有的任务
Pending
: 是等待执行的任务
Running
: 正在运行的任务
Finished
: 已经运行完成的任务
4. scrapyd-deploy的其他用法
1. 部署指定项目到所有的爬虫目标服务器
scrapyd-deploy -a -p <project>
2. 指定项目的版本
默认scrapyd-client使用当前时间戳作为版本号, 我们可以自己指定版本
scrapyd-deploy <target> -p <project> --version <version>
如果是使用Mercurial或者Git, 也可以直接使用git或者Mercurial的修订版本号作为版本号
# scrapy.cfg
[deploy:target]
...
version = HG
3. 列出所有的可用的scrapyd服务器列表
scrapyd-deploy -l
四、scrapyd服务器的json API
爬虫的启动, 暂停以及查看, 都是通过scrapyd提供的json api来实现的. 其实scrapyd-client的命令, 其实也是调用的scrapyd的json api
1. 获取服务器负载信息
curl http://localhost:6800/daemonstatus.json
{"status": "ok", "running": "0", # 正在运行中的爬虫数量"pending": "0", # 等待运行的爬虫数量"finished": "0", # 已完成的爬虫数量"node_name": "node-name" # 服务器节点名称
}
2. 部署或更新服务器上的爬虫
scrapyd-deploy 部署使用的其实就是这个命令
这个是post请求
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg
project
: 项目名称
version
: 版本号
egg
: 项目的egg文件
{"status": "ok", "spiders": 3}
3. 调用爬虫
post请求
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
project
: 项目名
spider
: 调用的爬虫名
setting
:指定配置项, 多个可以使用A=1&B=2的方式
arg1=vale1
: 指定调用爬虫时传递的参数
返回值:
jobid是任务的id
{"status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"}
4. 取消任务
post请求, 如果任务是等待状态, 则直接删除, 如果是运行中, 则直接停止爬虫
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
project
: 项目名
job
: 任务id
5. 列出所有项目
curl http://localhost:6800/listprojects.json
{"status": "ok", "projects": ["myproject", "otherproject"]}
6. 查看指定项目的版本
按照版本号顺序返回, 最后一个是最新的版本
curl http://localhost:6800/listspiders.json?project=myproject
project
: 项目名
{"status": "ok", "versions": ["r99", "r156"]}
7. 列出指定项目的所有爬虫
curl http://localhost:6800/listspiders.json?project=myproject
project
: 项目名
_version
: 版本号
{"status": "ok", "spiders": ["spider1", "spider2", "spider3"]}
8. 列出所有任务
curl http://localhost:6800/listjobs.json?project=myproject
project
: 项目名
{"status": "ok","pending": [{"id": "78391cc0fcaf11e1b0090800272a6d06","spider": "spider1"}],"running": [{"id": "422e608f9f28cef127b3d5ef93fe9399","spider": "spider2","start_time": "2012-09-12 10:14:03.594664"}],"finished": [{"id": "2f16646cfcaf11e1b0090800272a6d06", # 任务id"spider": "spider3", # 爬虫名"start_time": "2012-09-12 10:14:03.594664", # 开始时间"end_time": "2012-09-12 10:24:03.594664" # 结束时间}]
}
9. 删除指定版本号
post请求
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
project
: 项目名
version
: 要删除的版本号
10. 删除项目
post请求
curl http://localhost:6800/delproject.json -d project=myproject
project
: 项目名
{"status": "ok"}
五、其他问题
1. 请求认证
如果我们的服务是部署在公网上的话, 意外被人知道, 上传爬虫等, 可能有一定的安全风险。
我们可以使用nginx做代理转发, 开启nginx的basic auth
然后修改scrapy.cfg
文件
[deploy:example]
url = http://scrapyd.example.com/api/scrapyd
username = scrapy
password = secret
指定username
和password
即可