两年来,我们项目的爬虫代码大部分都是放在公司的windows机器上运行的,原因是服务器太贵,没有那么多资源,而windows主机却有很多用不上。为了合理利用公司资源,降低数据采集成本,我在所以任务机器上使用anaconda安装了python环境,并将代码部署到每台机器上,当有爬虫任务时,我就去每台机器启动相应的爬虫脚本。这样的运行方式一直存在了大约两年,期间也遇到一些问题,如之前使用fastapi写了一个控制服务【master+slave】的方式,但是在启动爬虫的过程中,存在爬虫起不来,或者进程已经存在,但由于没有添加详细的管理控制,导致日志文件冲突等问题。这些问题,我一直有想法去解决,但碍于我本人比较懒,同时对于正常运行的代码不想修改的等原因,导致我一年都没有从根本上解决这个问题。
最近没有什么开发任务,我从2月份过年回来,也一行代码没写。本着不能让自己荒废的原则,我准备重新设计一个系统,用于管理多个工作节点的python脚本,同时掌握每台机器的资源使用情况,实现通过一个主节点对子节点程序进行控制。
下面图片就是现在正在运行的爬虫项目,里面的.bat文件对应每一种爬虫,在windows下只要双击这个文件就可以启动爬虫,关闭对应生成的cmd框就能关闭爬虫,简单粗暴。
技术选型
【这里的技术选型会随着开发进程不停得更新】
排除gerapy+scrapy
由于我的爬虫代码都不是使用scrapy写的,这里我首先排除gerapy+scrapy的方案,主要原因是每个代码改动过大,而且我们的脚本时效性要求高,修改为scrapy稳定性存疑,加之我也不是使用scrapy的高手,这里直接排除。
k8s+docker
我在开发脚本之初就想使用docker+k8s来部署这个分布式的爬虫系统,但是由于windows环境下docker运行存在一些稳定性问题,同时我没有使用过k8s,可能最后开发完了对于日志管理等方面会出现未知的风险,我暂时排除这个方案。
python服务控制进程方案【选定】
我在一年前就使用fastapi实现过相应的功能,但没有深入到每一个进程,只涉及到主启动脚本。在使用过程中,也存在了一些问题,同时也没有使用日志采集系统监控。由于我有这些经验,我这次选型还是准备做纯python服务控制进程的方案,这次主要是从0开发,维持每一个进程的稳定性,【后期采用日志采集监控系统管理日志】。
python服务控制进程方案
这里我还是准备采用fastapi这个框架来作为主服务,同时使用mongodb作为数据库,redis用于维护进程心跳机制,整个后端我自己来构造,前端打算集成到我们的爬虫管理系统内。
这里我还是采用一主多从的方案,主节点负责控制启停任务,心跳检测,资源调控【监控每台任务机与服务器的内存与io等参数】
主节点开发
为了实现多节点的控制,我将主节点的功能一一列举,并对每个功能模块详细的做出设计,并记录实现方案。
主节点功能列举
- 发送启动,暂停请求到子节点,用于控制爬虫的启停
- 从redis获取心跳参数,展示每台机器运行的进程详情
- 监控服务器的资源
子节点开发
子节点功能列举
- 针对原有爬虫进行修改,要求每个爬虫项目只可启动一个进程,并且支持强制关闭
- 监控当前节点正在运行的python进程,每隔一段时间上报到redis
- 接受主节点的请求,对爬虫进程控制【启动/关闭】