scrapyd和scrapyd-client使用教程
原文地址:http://blog.wiseturtles.com/posts/scrapyd.html
scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行
概览
项目和版本
scrapyd可以管理多个项目,并且每个项目允许有多个版本,但是只有最新的版本会被用来运行爬虫.
最方便的版本管理就是利用VCS工具来记录你的爬虫代码,版本比较不是简单的通过字母排序,而是通过智能的算法,和distutils一样,例如: r10比r9更大.
工作原理
scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们
启动服务
# 注意,启动scrapyd的目录会保存整个scrapyd运行期间生成的log, item文件,所以请选择合适的位置运行该命令
$ scrapyd
调度爬虫运行
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2
{"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}
web接口
安装
需求
- Python 2.6+
- Twisted 8.0+
- Scrapy 0.17+
安装
$ pip install scrapyd
或
$ sudo apt-get install scrapyd
项目部署
直接使用scrapyd-client提供的scrapyd-deploy
工具.
安装scrapyd-client
$ pip install scrapyd-client windows下的scrapyd-deploy无法运行的解决办法
.进到D:/python/Scripts 目录下,创建两个新文件:
scrapy.bat
scrapyd-deploy.bat 2. 编辑两个文件:
scrapy.bat文件中输入以下内容 :
@echo off
D:\Python36\python D:\Python36\Scripts\scrapy %* scrapyd-deploy.bat 文件中输入以下内容:
@echo off
D:\Python36\python D:\Python36\Scripts\scrapyd-deploy %* 3. 保存退出,并确保你的 D:/python 和D:/python/Scripts 都在环境变量。这样就可以正常运行scrapy-deploy命令了。
scrapyd-client工作原理
打包项目,然后调用scrapyd
的addversion.json
接口部署项目
配置服务器信息
为了方便叙述,整个部署流程以部署豆瓣电影爬虫为例。 配置服务器和项目信息, 需要编辑scrapy.cfg
文件,添加如下内容
[deploy:server-douban]
url = http://localhost:6800/
其中server-douban
为服务器名称, url
为服务器地址,即运行了scrapyd
命令的服务器。
检查配置, 列出当前可用的服务器
$ scrapyd-deploy -l
server-douban http://localhost:6800/
列出服务器上所有的项目, 需要确保服务器上的scrapyd
命令正在执行,否则会报连接失败.首次运行的话,可以看到只有一个default
项目
$ scrapyd-deploy -L server-douban
default
打开http://localhost:6800/, 可以看到Available projects: default
部署项目
在爬虫项目根目录下执行下面的命令, 其中target
为上一步配置的服务器名称,project
为项目名称,可以根据实际情况自己指定。
scrapyd-deploy <target> -p <project>
$ scrapyd-deploy server-douban -p douban-movies
Packing version 1446102534
Deploying to project "douban-movies" in http://localhost:6800/addversion.json
Server response (200):
{"status": "ok", "project": "douban-movies", "version": "1446102534", "spiders": 1, "node_name": "sky"}
部署操作会打包你的当前项目,如果当前项目下有setup.py
文件,就会使用它,没有的会就会自动创建一个。(如果后期项目需要打包的话,可以根据自己的需要修改里面的信息,也可以暂时不管它). 从返回的结果里面,我们可以看到部署的状态,项目名称,版本号和爬虫个数,以及当前的主机名称.
检查部署结果
$ scrapyd-deploy -L server-douban
default
douban-movies
或再次打开http://localhost:6800/, 也可以看到Available projects: default, douban-movies
我们也可以把项目信息写入到配置文件中,部署时就不用指定项目信息,编辑scrapy.cfg
文件,添加项目信息
[deploy:server-douban]
url = http://localhost:6800/
project = douban-movies
下次部署可以直接执行
$ scrapyd-deploy
如果配置了多个服务器的话,可以将项目直接部署到多台服务器
$ scrapyd-deploy -a -p <project>
指定版本号
默认情况下, scrapyd-deploy
使用当前的时间戳作为版本号,我们可以使用--version
来指定版本号
scrapyd-deploy <target> -p <project> --version <version>
版本号的格式必须满足LooseVersion
如:
# 设置版本号为0.1
$ scrapyd-deploy server-douban -p douban-movies --version 0.1
Packing version 0.1
Deploying to project "douban-movies" in http://localhost:6800/addversion.json
Server response (200):
{"status": "ok", "project": "douban-movies", "version": "0.1", "spiders": 1, "node_name": "sky"}
如果使用了Mercurial
或Git
管理代码, 可以使用HG
和GIT
作为version的参数,也可以将它写入scrapy.cfg
文件,那么就会使用当前的reversion作为版本号。
[deploy:target]
...
version = GIT
$ cat scrapy.cfg
...
[deploy:server-douban]
url = http://localhost:6800/
project = douban-movies
version = GIT # 当前版本号为r7-master
$ scrapyd-deploy server-douban -p douban-movies
fatal: No names found, cannot describe anything.
Packing version r7-master
Deploying to project "douban-movies" in http://localhost:6800/addversion.json
Server response (200):
{"status": "ok", "project": "douban-movies", "version": "r7-master", "spiders": 1, "node_name": "sky"}
关于从GIT获取版本号的方式,可以参看scrapyd-client
源码部分
elif version == 'GIT':
p = Popen(['git', 'describe'], stdout=PIPE)
d = p.communicate()[0].strip('\n')
if p.wait() != 0:
p = Popen(['git', 'rev-list', '--count', 'HEAD'], stdout=PIPE)
d = 'r%s' % p.communicate()[0].strip('\n') p = Popen(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], stdout=PIPE)
b = p.communicate()[0].strip('\n')
return '%s-%s' % (d, b)
服务器添加认证信息
我们也可以在scrapyd前面加一层反向代理来实现用户认证。以nginx为例, 配置nginx
server {
listen 6801;
location / {
proxy_pass http://127.0.0.1:6800/;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd/user.htpasswd;
}
}
/etc/nginx/htpasswd/user.htpasswd
里设置的用户名和密码都是test
修改配置文件,添加用户信息信息
...
[deploy:server-douban]
url = http://localhost:6801/
project = douban-movies
version = GIT
username = test
password = test
注意上面的url
已经修改为了nginx监听的端口。
提醒: 记得修改服务器上scrapyd的配置bind_address
字段为127.0.0.1
,以免可以从外面绕过nginx, 直接访问6800端口。 关于配置可以参看本文后面的配置文件设置.
API
scrapyd的web界面比较简单,主要用于监控,所有的调度工作全部依靠接口实现. 具体可以参考官方文档
常用接口:
调度爬虫
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider
# 带上参数
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1取消
$ curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
列出项目
$ curl http://localhost:6800/listprojects.json
列出版本
$ curl http://localhost:6800/listversions.json?project=myproject
列出爬虫
$ curl http://localhost:6800/listspiders.json?project=myproject
列出job
$ curl http://localhost:6800/listjobs.json?project=myproject
删除版本
$ curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
删除项目
$ curl http://localhost:6800/delproject.json -d project=myproject
配置文件
scrapyd
启动的时候会自动搜索配置文件,配置文件的加载顺序为
/etc/scrapyd/scrapyd.conf
/etc/scrapyd/conf.d/*
scrapyd.conf
~/.scrapyd.conf
最后加载的会覆盖前面的设置
默认配置文件如下, 可以根据需要修改
[scrapyd]
eggs_dir = eggs
logs_dir = logs
items_dir = items
jobs_to_keep = 5
dbs_dir = dbs
max_proc = 0
max_proc_per_cpu = 4
finished_to_keep = 100
poll_interval = 5
http_port = 6800
debug = off
runner = scrapyd.runner
application = scrapyd.app.application
launcher = scrapyd.launcher.Launcher [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
关于配置的各个参数具体含义,可以参考官方文档
更新
上面的对于scrapyd
默认项目(即是启动scrapyd
命令后看到的default
项目.)的理解有些错误,只有在scrapy项目里启动scrapyd
命令 时才有默认项目,默认项目就是当前的scrapy
项目,如果在非scrapy项目下执行scrapyd
, 是看不到default
的, 在爬虫里项目里直接使用scrapyd
命令的好处是: 直接通调度爬虫运行, 比较适用于当前爬虫项目代码结构不规范,没法Eggifying
的情况,因为在使用scrapyd-client
部署爬虫的前提就是爬虫项目必须满足下面的条件:
Deploying your project to a Scrapyd server typically involves two steps:
- Eggifying your project. You’ll need to install setuptools for this. See Egg Caveats below.
- Uploading the egg to the Scrapyd server through the addversion.json endpoint.
小结
关于scrapyd,个人感觉比较适合单机部署爬虫和调度使用,分布式的爬虫调度可能不太合适,需要每台机器上都启动这样一个服务,日志也没有办法集中,用jenkins来做可能更合适.
scrapyd和scrapyd-client使用教程的更多相关文章
- spring cloud 2.x版本 Eureka Client服务提供者教程
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...
- Oracle client安装教程
一.下载 下载地址:http://download.csdn.net/detail/qq_35624642/9773986 这是Oracle Instant Client的CSDN下载地址. 要注意第 ...
- Android Asynchronous Http Client 中文教程
本文为译文,原文链接https://loopj.com/android-async-http/ 安卓异步httpclient 概述 这是一个异步的基于回调的Android http客户端,构建于Apa ...
- Scrapyd发布爬虫的工具
Scrapyd Scrapyd是部署和运行Scrapy.spider的应用程序.它使您能够使用JSON API部署(上传)您的项目并控制其spider. Scrapyd-client Scrapyd- ...
- 基于scrapyd爬虫发布总结
一.版本情况 python以丰富的三方类库取得了众多程序员的认可,但也因此带来了众多的类库版本问题,本文总结的内容是基于最新的类库版本. 1.scrapy版本:1.1.0 D:\python\Spid ...
- Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...
- Scrapyd 的远程部署和监控
1. 安装Scrapyd sudo pip3.6 install scrapyd # 安装scrapyd服务 sudo pip3.6 install scrapyd-client # 安装scrapy ...
- 使用 Scrapyd 管理部署 Scrapy 的一些问题
环境:Ubuntu Xenial (16.04) Scrapy 是一个不错的爬虫框架,但是不支持定时执行,常规的做法是使用 crontab 的方式进行定时执行 shell ,当爬虫数量多的时候,管理起 ...
- scrapyd远程连接配置
安装scrapyd: pip install scrapyd 默认scrapyd启动是通过scrapyd就可以直接启动,bind绑定的ip地址是127.0.0.1端口是:6800,这里为了其他主机可以 ...
随机推荐
- C#获取当前日期时间
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
- L3-015 球队“食物链” (30 分)
L3-015 球队“食物链” (30 分) 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...
- 微信小程序前端开发踩坑(一)
之前由于不了解微信小程序的整个的运行开发机制,走了很多的弯路,脑子灵光的可能不会遇到,这个主题系列的帖子希望可以帮助到像我一样理解能力慢的孩子. 不论是开发微信小程序还是说学习任何一门编程语言,最重要 ...
- Classnotfoundexception 与 noClassDelfaultError的区别
ClassNotFoundException 这个异常特别常见,就是class找不到异常,一般的问题就是: 1 调用class的forName方法时,找不到指定的类 2 ClassLoader 中的 ...
- iOS开发之UIGestureRecognizer
一:首先查看一下关于UIGestureRecognizer的定义 //当前手势状态 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { //尚 ...
- python 异步发送邮件 aiosmtplib
aiosmtplib is an asynchronous SMTP client for use with asyncio.文档地址 与 smtplib的用法大体相同 有几个地方需要注意下: 加密S ...
- VirtualBox 使用物理硬盘
/******************************************************************************* * VirtualBox 使用物理硬盘 ...
- 在c#中 RemoveAt、 Remove、delete用法区别
有三种方法可以删除 DataTable 中的 DataRow: Delete 方法和 Remove 方法和 RemoveAt 方法 其区别是: Delete 方法实际上不是从 DataTable 中删 ...
- jmeter 上传附件脚本报Non HTTP response code: java.io.FileNotFoundException
如果上传附件报如下错误,就需要把附件放到和脚本同一路径下就解决了
- js中数组常用方法总结
操作数组 印象中数组有很多方法,系统的整理一下,放在自己家里方便回头查~ Array.map() 此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组 1 2 ...