scrapyd部署_第八章 第一节 scrapyd和scrapy-client

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

e95642d0ede5bdc3ad15fe4dca1dcc78.png

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管理界面, 也可以看到所有的任务

4c6b9c1d53f15696fc04aa2ade0159ae.png

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即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 首超 Java,与 Python、C语言共角逐年度最佳编程语言奖!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删最新的 TIOBE 12 月编程语言已发布&#xff0c;先来预测一波今年的年度编程语言大奖究竟会花落谁家吧&#xff1f;C 首超 Java和上个月相比&…

乔安监控云存储能存多长时间_干货 | 监控磁盘阵列知识介绍,不了解还不来看看?...

一、磁盘阵列的概念要定义磁盘阵列的概念&#xff0c;是一个简单的工作&#xff0c;因为这个概念已经形成了共识——磁盘阵列(DiskArray)是由一个硬盘控制器来控制多个硬盘的相互连接&#xff0c;使多个硬盘的读写同步&#xff0c;减少错误&#xff0c;增加效率和可靠度的技术。…

我要是在学习 C 语言之前知道这些就好了!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删对于我来说&#xff0c;学习 C 语言好难啊。这门语言本身的基础知识并不是很难&#xff0c;但是“用 C 语言编程”需要用到各种知识&#xff0c;…

opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果

1 说明&#xff1a;1.1 吸烟有害健康&#xff01;&#xff01;纯属娱乐和学习python的相关知识。1.2 虽然是娱乐&#xff0c;但是opencv、dlib和python在人工智能、人脸识别、自动化等有很大作用&#xff0c;目前已经或者未来会有更多的应用&#xff0c;作为一名普通人&#xf…

为什么永远不会有语言取代 C/C++?

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指…

qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧

在使用Excel过程中&#xff0c;我们会遇到需要插入相同格式的多行或多列&#xff0c;如果一行行或一列列的插入&#xff0c;对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列&#xff0c;使用此方法就比较费时费力啦。分享几个小技巧实现快速插入多行或多列.…

amber 口译_口译员设计模式示例

amber 口译本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff…

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络断言断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义&#xff0c;就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 &#xff1c;做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式&#xff0c;商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络C20&#xff08;C 编程语言标准 2020 版&#xff09;将是 C 语言一次非常重大的更新&#xff0c;将为这门语言引入大量新特性。…

小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?

我们如今所处的时代&#xff0c;科技创新的速度日新月异,生活方式多彩多姿。人人都说&#xff1a;科技改变了生活。今晚《开门大吉》也迎来了三大改变生活的神奇黑科技&#xff01;智能且生态的“移动城堡”在网上预定好酒店以后&#xff0c;到了现场没有前台和服务员&#xff…

产品原型示例_原型设计模式示例

产品原型示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;今年 2 月&#xff0c;开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资&#xff0c;同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚&#xff0c;但这个阳光是怎么来的呢&#xff0c;很多人就不一定清楚了。在这里我们首先来了解几个概念&#xff1a;光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子&#xff0c;是一种规范波色子&#xff0c;是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 …