如果觉得文章对您产生帮助的话, 欢迎关注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

基本的一个部署流程:

  1. 在爬虫目标服务器上运行scrapyd
  2. 修改爬虫项目的scrapy.cfg文件, 指定爬虫目标服务器(scrapyd)服务器地址
  3. 在爬虫的项目服务器(不一定和爬虫目标服务器是同一台)上运行scrapyd-delopy来生成egg文件并且上传到指定的服务器
  4. 调用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

指定usernamepassword即可

scrapyd部署_第八章 第一节 scrapyd和scrapy-client相关推荐

  1. scrapyd部署_如何通过 Scrapyd + ScrapydWeb 简单高效地部署和监控分布式爬虫项目

    来自 Scrapy 官方账号的推荐 需求分析 初级用户: 只有一台开发主机 能够通过 Scrapyd-client 打包和部署 Scrapy 爬虫项目,以及通过 Scrapyd JSON API 来控 ...

  2. 12对胸椎对应体表标志_胸部检查第一节胸部的体表标志与常用标记线

    <胸部检查第一节胸部的体表标志与常用标记线>由会员分享,可在线阅读,更多相关<胸部检查第一节胸部的体表标志与常用标记线(18页珍藏版)>请在人人文库网上搜索. 1.胸 部 检 ...

  3. java画好看坦克_坦克大战第一节——画出自己的坦克(新手篇)

    刚刚开始学习java,对java不是很熟悉,但是自己的兴趣挺喜欢java.现在自己在自学java做一个小游戏,坦克大战. 自己现在完成了画出自己的坦克和坦克的移动方向.希望各位大神指导一下我这个刚刚学 ...

  4. 第八章第一节:Java继承之继承概念、语法、成员访问和super关键字

    文章目录 一:继承的概念及语法 (1)什么是继承 (2)Java继承语法 二:成员访问 (1)子类访问父类的成员变量 (2)子类访问父类的成员方法 三:super关键字 (1)super关键字 A:作 ...

  5. scrapyd部署遇到的问题

    scrapyd部署遇到的问题 最近在scrapyd部署时,用了无数变了,老司机还是翻车了: File "d:\python\virtualenv\env11\lib\site-package ...

  6. Scrapyd部署Scrapy框架项目

    1. scrapyd的介绍 scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API(即:post请求的webapi)来部署爬虫项目和控制爬虫运行,scrapyd是一个守 ...

  7. scrapyd部署爬虫项目到LINUX服务器

    1,首先把scrapy爬虫项目上传到服务器 我的服务器架设在公司内网里.所以在这里使用WinSCP作为上传工具. 2,修改项目的配置文件scrapy.cfg 给爬虫项目指定分组,具体方法是在deplo ...

  8. python项目部署失败的原因_python – 使用scrapyd部署项目时出错

    我的项目文件夹中有多个蜘蛛,想要一次运行所有的蜘蛛,所以我决定使用scrapyd服务运行它们. 我已经开始通过看到 here来做到这一点 首先,我在当前项目文件夹中 >我打开了scrapy.cf ...

  9. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

最新文章

  1. FTP、HTTP断点续传和多线程的协议基础
  2. PyTorch 1.8来了!正式支持AMD GPU,炼丹不必NVIDIA
  3. 静态页面和动态页面的区别
  4. linux centos6 安装 crontab
  5. java oj主机名排序_oj教程--排序算法(Java)
  6. 创建与合并分支-git入门教程
  7. mybatis {arg0} 与 {0}
  8. servlet基础_Servlet基础
  9. 并行编程走下神坛 将成为开发者基本技能?
  10. 浅谈特征选择的原理和Python实现
  11. 运维部门工作总结_运维部工作总结
  12. 字节流转换为对象的方法
  13. hdu 3592 差分约束
  14. DbVisualizer的Driver连接Oracle Thin选项不可选
  15. 关于使用mac聚焦搜索无法搜索软件的情况
  16. mysql 表的存储类型_MySQL的表类型和存储引擎
  17. netlify支持php吗,用 hugo 和 netlify 搭建blog【转】
  18. Verilog初级教程(17)Verilog中的case语句
  19. 最高100,000美元大奖,2021腾讯广告算法大赛开启
  20. acm快速输入法 有效解决超时

热门文章

  1. junit编写测试代码_编写数据访问代码测试-不测试框架
  2. javaone_为JavaOne 2014做好准备!
  3. jedis与redis_Redis与Jedis排序
  4. openjdk 使用_如何在OpenJDK中使用ECC
  5. java反射api研究_深入研究Java 8中的可选类API
  6. 使用JDK 8将收藏转换为地图
  7. JLBH示例2 –协调遗漏的会计处理
  8. NetBeans Java EE技巧7:忽略的Java类和XHTML编辑器快捷方式
  9. java 注解应用技巧_改善Java应用程序性能的快速技巧
  10. 4个万无一失的技巧让您开始使用JBoss BRMS 6.0.3