Scrapy框架(九):使用scrapyd部署爬虫

一、Scrapyd简介

Scrapyd是一个用来部署和运行Scrapy项目的应用,由Scrapy的开发者开发。其可以通过一个简单的Json API来部署(上传)或者控制你的项目。
Scrapyd可以用来管理多个项目,并且每个项目还可以上传多个版本,不过只有最新的版本会被使用。
在安装并开启Scrapyd之后,它将会挂起一个服务来监听运行爬虫的请求,并且根据请求为每一个爬虫启用一个进程来运行。Scrapyd同样支持同时运行多个进程,进程的数量由max_proc和max_proc_per_cpu选项来限制。


二、Scrapyd安装

安装命令: pip install scrapyd

等待下载完成,下载完成后,启动scrapyd,命令即:scrapyd,启动后,有一句会显示你的端口号,如图所示:

然后在网页中输入你的本地ip加上端口号,即:127.0.0.1:6800。访问这个网页出现下面的页面即scrapyd的页面:

上一步中如果连接启动成功后先关闭服务,在一个地方创建一个文件夹,文件夹名字自定义,但是要见名知意。然后进入文件夹,按住shift键不松手,并右击该文件夹随意空白处,然后点击“在此处打开命令窗口”,即进入的是cmd,然后在cmd里重新启动scrapyd,即输入scrapyd。执行后文件里会多出一个空的文件夹dbs,这个文件夹是用来存放爬虫文件数据的。

接下来我们需要把我们的项目打包上传到scrapyd服务里,那么我们要下载一个包:scrapyd-client。


三、Scrapyd-client

将Scrapy项目部署到远程服务器,首先第一步要做的就是把项目打包成egg文件,然后上传到目标服务器,这个操作使用setup-tools也是可以完成的,但比较麻烦。

所以我们可以使用一个第三方库Scrapyd-Client来帮我们一步完成这些操作。

scrapyd-client的功能主要有两个:

  • 将项目打包成egg文件

  • 将egg文件通过Scrapyd的addversion.json接口上传到目标服务器。

3.1 安装

pip install scrapyd-client

下载完毕后,你的Python环境中的Scripts文件里会出现一个scrapyd-deploy,这个文件是启动文件,但是在windows下不能运行,只能在linux运行,所以我们要自己编写一个bat执行文件。

创建名字为scrapy.batscrapyd-deploy.bat的文件,里面写入下面的配置:

1
2
3
4
5
6
7
8
9
1.scrapy.bat
@echo off
C:\Users\QzmVc1\AppData\Local\Programs\Python\Python37\python.exe C:\Users\QzmVc1\AppData\Local\Programs\Python\Python37\Scripts\scrapy %*

-------------------

2.scrapyd-deploy.bat
@echo off
C:\Users\QzmVc1\AppData\Local\Programs\Python\Python37\python.exe C:\Users\QzmVc1\AppData\Local\Programs\Python\Python37\Scripts\scrapyd-deploy %*

第一个是python.exe路径,第二个是Scripts中对应文件的路径。

然后我们来测试一下scrapyd-deploy是否可以使用:

3.2 部署

在安装scrapyd-client完毕之后,主要可以使用scrapyd-deploy命令完成项目的部署,以下是具体使用方式:

要部署你的项目,首先先通过cd命令进入你项目的根目录,然后输入以下命令:

1
scrapyd-deploy <target> -p <project>

这个命令会将你的项目打包成一个egg文件,然后上传到你指定的target,如果你的项目中有一个setup.py文件,那么其将会被使用,如果没有那么将会自动创建一个。如果这行代码运行成功的话,那么将会返回以下结果:

1
2
3
Deploying myproject-1287453519 to http://localhost:6800/addversion.json
Server response (200):
{"status": "ok", "spiders": ["spider1", "spider2"]}

3.3 版本

在使用以上命令部署Scrapy项目时,项目的版本号默认会设置为当前的时间戳,我们也可以使用—version参数来指定版本号。

scrapyd-deploy -p —version

需要注意的是,版本号只能为纯数字。在默认的情况下,scrapyd会使用版本号最大的版本。


四、配置文件

Scrapyd将会在以下地址搜索配置文件,在解析的过程中更高的配置文件拥有更高的优先级:

  • /etc/scrapyd/scrapyd.conf (Unix)

  • c:/scrapyd/scrapyd.conf (Windows)

  • /etc/scrapyd/conf.d/* (in alphabetical order, Unix)

  • scrapyd.conf

  • ~/.scrapyd.conf (users home directory)

配置文件中支持配置以下选项:

  • http_port
    Scrapyd的API监听的端口,默认为6800。

  • bind_address
    网页和Json服务监听的IP地址,默认为127.0.0.1。

  • max_proc
    同时启动的最大Scrapy进程数,如果没有设置或者设置为0,那么将会使用当前cpu可用的核数乘以max_proc_per_cpu的值。默认为0。

  • max_proc_per_cpu
    每个cpu能同时启动的最大Scrapy进程数。默认为4。

  • debug
    是否开启debug模式,默认为off。开启之后,如果在调用Scrapy的Json API的时候出错,则会返回详细的traceback信息。

  • eggs_dir
    项目的eggs文件存储的目录。

  • dbs_dir
    项目存储数据库的目录,也包括爬虫队列。

  • logs_dir
    存储Scrapy日志的目录。

  • items_dir
    存储items的目录,一般来说不需要设置这个选项,因为抓取下来的数据都会存到数据库中。如果设置这个选项,那么将会覆盖Scrapy的FEED_URL设置,将抓取下来的items保存到指定目录。

  • jobs_to_keep
    每个spider保留多少个完成的job,默认为5。这更多指的是item和log。

  • finished_to_keep
    启动器中保留的已完成进程的数量,默认为100。

  • poll_interval
    轮询队列的间隔,以秒为单位,默认值为5,可以为浮点数。

  • runner
    用来启动子进程的启动器,可以自定义启动的模块。

  • node_name
    每个节点的节点名称,默认为${socket.gethostname()}。

以下是一个默认的配置文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[scrapyd]
eggs_dir = eggs
logs_dir = logs
items_dir =
jobs_to_keep = 5
dbs_dir = dbs
max_proc = 0
max_proc_per_cpu = 4
finished_to_keep = 100
poll_interval = 5.0
bind_address = 127.0.0.1
http_port = 6800
debug = off
runner = scrapyd.runner
application = scrapyd.app.application
launcher = scrapyd.launcher.Launcher
webroot = scrapyd.website.Root

[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


五、API

在开启了scrapyd服务之后,就可以通过Scrapyd提供的API接口来操作你的Scrapy项目了。

5.1 daemonstatus.json

用来检查服务器的负载状态。支持的请求方法:GET

request例子:

1
curl http://localhost:6800/daemonstatus.json

response例子:
1
{ "status": "ok", "running": "0", "pending": "0", "finished": "0", "node_name": "node-name" }

5.2 addversion.json

给项目增加一个版本,如果项目不存在的话那么就创建一个项目。这个接口主要被用来上传项目或者更新项目版本。支持的请求方法:POST

参数:

  • project (string, required) - 项目的名称

  • version (string, required) - 项目的版本

  • egg (file, required) - 一个包含项目代码的egg文件

request例子:

1
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg

response例子:
1
{"status": "ok", "spiders": 3}

5.3 schedule.json

调度运行一个爬虫(也成为job),并返回一个jobid。支持的请求方法:POST

参数:

  • project (string, required) - 项目的名称

  • spider (string, required) - 爬虫的名称

  • setting (string, optional) - 爬虫运行时要用到的Scrapy设置

  • jobid (string, optional) - 用来作为标识的jobid,会覆盖掉默认生成的UUID

  • _version (string, optional) - 使用的项目版本
    任何其他的参数将会传递作为爬虫的参数

request例子:

1
curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider

response例子:
1
{"status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"}

以下是传递spider参数和setting参数的例子:
1
curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

5.4 cancel.json

取消一个job的运行,如果这个job处于等待的状态,那么将会被移除,如果这个job正在运行,那么它将会被终止。支持的请求方法:POST

参数:

  • project (string, required) - 项目的名称

  • job (string, required) - job的id

request例子:

1
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444

response例子:

1
{"status": "ok", "prevstate": "running"}

5.5 listprojects.json

获取上传到服务器的项目列表。支持请求方法:GET,无参数。

request例子:

1
curl http://localhost:6800/listprojects.json

response例子:
1
{"status": "ok", "projects": ["myproject", "otherproject"]}

5.6 listversions.json

获取某个或某些项目的版本列表。返回的版本将会按顺序排列,最后的那个版本是当前正在使用的版本。支持请求参数:GET

参数:
project (string, required) - 项目名称

request例子:

1
curl http://localhost:6800/listversions.json?project=myproject

response例子:
1
{"status": "ok", "versions": ["r99", "r156"]}

5.7 listspiders.json

默认获取某个项目最新版本中的spider列表。支持的请求方法:GET

参数:

  • project (string, required) - 项目的名称

  • _version (string, optional) - 检查的项目版本

request例子:

1
curl http://localhost:6800/listspiders.json?project=myproject

response例子:
1
{"status": "ok", "spiders": ["spider1", "spider2", "spider3"]}

5.8 listjobs.json

获取某个项目正在等待、运行或者运行完毕的job列表。支持的请求类型:GET

参数:

  • project (string, required) - 项目名称

request例子:

1
curl http://localhost:6800/listjobs.json?project=myproject

response例子:
1
2
3
4
{"status": "ok",
"pending": [{"id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "spider1"}],
"running": [{"id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "spider2", "start_time": "2012-09-12 10:14:03.594664"}],
"finished": [{"id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "spider3", "start_time": "2012-09-12 10:14:03.594664", "end_time": "2012-09-12 10:24:03.594664"}]}

5.9 delversion.json

删除某个项目的某个版本,如果这个项目不再有能用的版本,那么项目也会被删除。支持的请求方法:POST

参数:

  • project (string, required) - 项目名称

  • version (string, required) - 要删除的项目版本

request例子:

1
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99

response例子:
1
{"status": "ok"}

5.10 delproject.json

删除指定项目。支持请求方法:POST

参数:

  • project (string, required) - 项目名称

request例子:

1
curl http://localhost:6800/delproject.json -d project=myproject

response例子:
1
{"status": "ok"}


参考链接: