梳理15年做的爬虫架构

从最初的3台台式机做的爬虫服务器抓取,随着抓取需求的增大发现已无法满足现有的需求,这时候我们就需要重新考虑部署我们的爬虫架构。为了节省成本,这些服务器都是用台式机搭建的,整个系统都是在本地完成,并没有部署到线上服务器去抓取。

原本的爬虫架构:3台台式机搭建Lamp环境作为爬虫服务器,3台爬虫服务器分别从一台MySQL数据库服务器获取各自的抓取url列表,每个url标记相关的数据抓取状态,抓取完之后并在各自的服务器进行主体信息提取处理,汇总到MySQL服务器的数据库,更改url列表数据状态标记已处理。

升级后爬虫架构:依旧是3台台式机搭建Lamp环境作为爬虫服务器,其中一台爬虫作为主爬虫服务器,多进程多线程抓取(避免爬虫进程之间同时查询MySQL数据库而造成阻塞,多个爬虫之间做了进程锁,存放到memcached。),外加一台测试爬虫服务器。出于磁盘IO过高的考虑,对抓取页面的写入和读取做了分离,爬虫服务器只负责将抓取的页面保存写入本地磁盘,由一台服务器用来单独做爬虫所抓取的页面处理与数据整理。数据库方面,两台二手笔记本搭建的MySQL数据库服务器分别分配存放着不同的项目抓取需求的数据库,同时这两台数据库服务器也是我们的主数据库服务器,也有一台从服务器负责数据备份。

过程中也会碰到不少问题,比如开始的时候爬虫页面全部用html文件存储,磁盘未全部占满,却抓取不到任何页面?我们调试了发现抓虫抓取的页面写不进磁盘,本地新建文件也新建不了,原来是磁盘的索引用完了。我们查了知乎上其他网友碰到类似的问题,建议改用ssdb来存储原始爬虫页面。ssdb是一个高性能的支持丰富数据结构的 NoSQL 数据库,数据库操作类似redis,性能上不输redis。确实有给我们爬虫抓取速度带来了不少的提升。值得一提的是,我们还做了爬虫的GUI界面来控制爬虫的开启、关闭,爬虫进程死掉之后会自动重启,而不是通过命令行直接去运行。

大概就这么多,具体中间还有些小细节就不一一提及。