scrapyd+SpiderKeeper+supervisord爬虫部署与管理

本文介绍在CentOS7下部署爬虫,稳定运行爬虫,对爬虫提供Web管理。部署工具是Scrapy官方的scrapyd,Web管理程序是开源项目SpiderKeeper,最后用supervisord提供稳定运行。

scrapyd和scrapyd-client

scrapyd安装配置

Scrapyd是一个用来部署和运行Scrapy项目的应用,由Scrapy的开发者开发。其可以通过一个简单的Json API来部署(上传)或者控制你的项目。Scrapyd可以用来管理多个项目,并且每个项目还可以上传多个版本,不过只有最新的版本会被使用。

scrapyd对python2.7不兼容,从源码下载 https://github.com/scrapy/scrapyd.git 安装scrapyd,改下 scrapyd的utils文件get_spider_list方法,加上str():

env['PYTHONIOENCODING'] = 'UTF-8'
env['SCRAPY_PROJECT'] = str(project)
if pythonpath:
    env['PYTHONPATH'] = str(pythonpath)
if version:
    env['SCRAPY_EGG_VERSION'] = str(version)

python setup.py install。对可能的报错处理https://www.jianshu.com/p/e6945ac9c4c8,
另外CentOS 7.2自带的Python2版本比较老,需要更新pip,更新setuptools、cryptography、pyasn1。

通过源码安装的要在包目录下配置scrapyd:

vi  /usr/lib/python2.7/site-packages/scrapyd-1.2.0-py2.7.egg/scrapyd/default_scrapyd.conf
# 把jobs_to_keep改道100,否则日志默认留5条
jobs_to_keep = 100
# 修改端口为7300
bind_address = 127.0.0.1
http_port   = 7300

此时,在终端scapyd应该会得到一大段正常日志,不过我们并不这么启动,后续用supervisor运维。

参考:https://www.jianshu.com/p/2a189127901a


scrapyd-client安装配置

将Scrapy项目部署到远程服务器,首先第一步要做的就是把项目打包成egg文件,然后上传到目标服务器,这个操作使用setup-tools也是可以完成的,但比较麻烦。我们可以使用一个第三方库Scrapyd-Client来帮我们一步完成这些操作。
我们用spiderkeeper管理scrapy爬虫,spiderkeeper提供web界面上传egg文件,因此只需要在开发端安装,源码地址:https://github.com/scrapy/scrapyd-client.git
打包egg文件语法:

scrapyd-deploy --build-egg output.egg

spiderkeeper

spiderkeeper是一款开源的spider管理工具,可以方便的进行爬虫的启动,暂停,定时,同时可以查看分布式情况下所有爬虫日志,查看爬虫执行情况等功能。

这个项目是用Flask写的,我发现有一些bug,后面还想自己加功能。因此果断从git上下源码:https://github.com/DormyMo/SpiderKeeper.git
我也选择安装在Python2.7下

pip install -r requirements.txt

修改setup.py文件,去掉encoding=‘utf-8’

with open(path.join(here, 'requirements.txt'), encoding='utf-8') as f:
    all_reqs = f.read().split('\n')

我选择用Postgres做数据库,因此把SpiderKeeper源码中的相关代码都改了,为了配合supervisor启动,创建一个supervisor.sh启动。

netstat -nltp | grep :7400 | awk '{print $7}' | awk -F"/" '{ print $1 }' | xargs kill -9

# 指定scrapyd的地址是http://127.0.0.1:7300,指定spiderkeeper的地址是7400,数据库改为postgres(默认是sqlite)

python run.py --host=0.0.0.0 --port=7400 --server=http://127.0.0.1:7300 --username=sp的用户名 --password=sk的密码 --database-url=postgresql://postgres:pg的密码@localhost:pg的端口/spiderkeeper

参考:https://blog.****.net/m0_38106113/article/details/81812135


supervisord安装配置

Supervisord是一个守护进程的工具,当进程意外终止或服务器掉电起来后,希望进程能够自动运行,supervisord可以很好的为我们做这件事情。同时supervisord也自带监控界面,可以通过浏览器灵活的查看、操作。

# CentOS下安装Supervisord
yum install python-setuptools 
easy_install supervisor

# 创建配置文件
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisord.conf
# 文件夹conf.d下准备用来放具体配置
mkdir /etc/supervisor/conf.d

修改配置文件/etc/supervisord.conf,找到相应行并修改

# 开启web管理界面
[inet_http_server]         ; inet (TCP) server disabled by default
port=*:你的端口        ; ip_address:port specifier, *:port for all iface
username=你的用户名              ; default is no username (open server)
password=你的密码               ; default is no password (open server)

# 杀干净子进程
stopasgroup=true
killasgroup=true

# 具体配置文件路径
[include]
files=conf.d/*.conf

启动和重载

#  通过配置文件启动supervisor
supervisord -c /etc/supervisor/supervisord.conf                     
#  重新载入配置文件         
supervisorctl -c /etc/supervisor/supervisord.conf reload             

参考:http://www.qttc.net/201308366.html

效果!

实际使用中,发现scapyd很稳定,开源项目SpiderKeeper等Web项目就比较捉急了,紧急情况很需要supervisord远程重启。
scrapyd+SpiderKeeper+supervisord爬虫部署与管理
当Scrapy项目写好后,编辑需要部署的项目的scrapy.cfg文件:

[deploy:部署名(部署名可以自行定义)]
url = http://127.0.0.1:7300/
project = 项目名(创建爬虫项目时使用的名称)

打包成egg文件:

scrapyd-deploy --build-egg output.egg

打开SpiderKeeper的deploy界面并上传,就能正常使用了。
scrapyd+SpiderKeeper+supervisord爬虫部署与管理
这一套搭配很适合有较多定时爬虫运行的需求,跟用Celery管理爬虫相比,学习成本也比较低,修补了SpiderKeeper的一些Bug后,亲测每天能稳定运行。
scrapyd+SpiderKeeper+supervisord爬虫部署与管理