Scrapyd + Scrapyd-Client

需求

​ 由于网站时常遭受黑客攻击, 现准备将手头一些攻击者的IP地址收集起来用做企业内部的威胁情报。既然要着手做威胁情报, 那么就避免不了通过一些网站进行数据的丰富化。要想简单省事儿, 当然是使用购买api账号的方式,不过有的api也很坑, 除非购买的是企业版, 否则个人版的api会受到请求速率的限制。所以这边只能依靠爬虫(Scrapy)来收集数据。但是采用了分布式爬虫, 就避免不了需要进行集中管理, 以及统一下等操作。下面就说下利用Scrapy官方提供的爬虫管理工具(Scrapyd)来满足以上的需求。

Scrapyd

Scrapyd是由Scrapy 官方提供的爬虫管理工具,使用它我们可以非常方便地上传、控制爬虫并且查看运行日志。

安装

1
$ pip install scrapyd

启动

1
2
3
4
5
6
7
8
9
$ scrapyd
2019-12-19T10:56:06+0800 [-] Loading /Users/canon/anaconda3/lib/python3.7/site-packages/scrapyd/txapp.py...
2019-12-19T10:56:06+0800 [-] Scrapyd web console available at http://127.0.0.1:6800/
2019-12-19T10:56:06+0800 [-] Loaded.
2019-12-19T10:56:06+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 18.9.0 (/Users/canon/anaconda3/bin/python 3.7.1) starting up.
2019-12-19T10:56:06+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.selectreactor.SelectReactor.
2019-12-19T10:56:06+0800 [-] Site starting on 6800
2019-12-19T10:56:06+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x109efcf98>
2019-12-19T10:56:06+0800 [Launcher] Scrapyd 1.2.1 started: max_proc=48, runner='scrapyd.runner'

Scrapyd是一个服务端,我们需要通过一个客户端(Scrapyd-Client)将爬虫项目发送到Scrapyd服务中去。这里先修改一下Scrapyd服务地址,默认Scrapyd启动是通过命令: Scrapyd就可以直接启动,默认绑定的ip地址是127.0.0.1端口是:6800,这里为了其他主机可以访问,需将ip地址设置为0.0.0.0

​ 根据上图启动的信息, 可以看到默认配置文件是在/Users/canon/anaconda3/lib/python3.7/site-packages/scrapyd/中。

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
30
31
$ vim default_scrapyd.conf

[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 = 0.0.0.0
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

Scrapyd-Client

Scrapyd-Client可以用来部署Scrapy项目,它会帮我们把项目打包成egg文件,我们不用再动手调用add version.json接口去部署到Scrapyd,操作简单。

安装

1
$ pip install scrapyd-client

配置

​ 要部署Scrapy项目,我们首先需要修改项目的配置文件。首先切换至项目根目录, 会看到有一个scrapy.cfg文件,它的内容如下:

1
2
3
4
5
6
7
8
9
10
11
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html

[settings]
default = spider_ti.settings

[deploy]
#url = http://localhost:6800/
project = spider_ti

这里需要配置一下deploy部分。例如, 我们将项目部署到10.10.10.1Scrapyd上,则修改内容如下:

1
2
3
[deploy]
url = http://10.10.10.1:6800/
project = spider_ti

这样我们再在scrapy.cfg文件所在路径执行如下命令:

1
2
3
4
5
6
$ scrapyd-deploy

Packing version 1576725163
Deploying to project "spider_ti" in http://localhost:6800/addversion.json
Server response (200):
{"node_name": "CanondeMacBook-Pro.local", "status": "ok", "project": "spider_ti", "version": "1576725163", "spiders": 3}

项目版本默认为当前时间戳。我们也可以指定项目版本,通过version参数传递即可。例如:

1
$ scrapyd-deploy --version 201912191114

注: 在Python3的Scrapyd 1.2.0版本中,版本号不能指定为带字母的字符串,它们必须为纯数字,否则会出现报错。

如果有多台主机,我们可以配置各台主机的别名,修改配置文件为:

1
2
3
4
5
6
7
[deploy:vm1]
url = http://10.10.10.1:6800/
project = spider_ti

[deploy:vm2]
url = http://10.10.10.2:6800/
project = spider_ti

在此统一配置多台主机,一台主机对应一组配置,在deploy后面加上主机的别名即可。如果想将项目部署到IP为10.10.10.2vm2主机,我们只需要执行如下命令:

1
scrapyd-deploy vm2

如此一来,我们只需要在scrapy.cfg文件中配置好各台主机的Scrapyd地址,然后调用scrapyd-deploy命令加主机名称即可实现部署。

如果Scrapyd设置了访问限制,我们可以在配置文件中加入用户名和密码的配置,同时修改端口成Nginx代理端口。例如: 在第1章我们使用的是6801,那么这里就需要改成6801,修改如下:

1
2
3
4
5
6
7
8
9
10
11
[deploy:vm1]
url = http://10.10.10.1:6801/
project = spider_ti
username = admin
password = admin

[deploy:vm2]
url = http://10.10.10.2:6801/
project = spider_ti
username = canon
password = canon

通过加入username和password字段,我们就可以在部署时自动进行Auth验证,然后成功实现部署。

运行

1
$ curl http://127.0.0.1:6800/schedule.json -d project=spider_ti -d spider=ti

列出任务

1
$ curl http://127.0.0.1:6800/listjobs.json?project=spider_ti | python -m json.tool

列出项目

1
$ curl http://127.0.0.1:6800/listprojects.json

停止

1
$ curl http://127.0.0.1:6800/cancel.json -d project=spider_ti -d job=838dec26222311ea8eb6a5eb893a35a5

删除

  • 版本
1
$ curl http://127.0.0.1:6800/delversion.json -d project=spider_ti -d version=1576735972
  • 项目
1
$ curl http://127.0.0.1:6800/delproject.json -d project=spider_ti

参考