导语
搞技术的小伙伴,相信都或多或少接触过爬虫,很多人觉得爬虫嘛,不就是发请求拿数据然后存到数据库嘛,谁都会写,你看我这是用了三秒钟写好的:
但是想在生产环境中做一个完善的爬虫系统,并不是一件易事,比如遇到以下问题,如果没提前设计好,就会手忙脚乱:
- 解析的字段有问题, 需要进行重新解析,那么我们是改代码重新采集一遍吗?如果这很多数据源,那这耗时是相当久了
- 服务器网络中断了一段时间,导致部分请求失败,那么该怎么补齐数据呢?
- 有多台服务器可以用于爬虫,该怎么高效率利用硬件资源,并且怎么调度和通信呢
- 网站有一天停机维护了几小时,导致没有拿到数据,该怎么保证当天的爬虫任务正常?
- 当有很多个爬虫任务的时候, 每个爬虫的数据字段都不一样,针对每个爬虫去写 sql 是真的很煎熬的事情,该怎么能实现自动对应数据库字段?
- 有下游任务需要依赖爬虫, 要等爬虫任务运行完才能运行,但是爬虫任务的运行时间不定,那么我们该怎么及时发现爬虫任务已经结束并调起下游任务
这只是生产环境中需要解决的部分问题,所以,能写好一个完善的爬虫系统用于生产, 还是需要好好的设计
解决手段
下面介绍可以用的各种办法
1.抓取完后需要修改解析规则
- 如果想要低成本的解决这个问题,可以在抓取的时候,就把解析前的原数据存下来,这样子当需要修改解析规则的时候, 只需要从库里直接拿出来就可以解析,减少了最耗时的抓取过程
- 或者可以将爬虫设计成分布式结构,之间可以用 mq 通信,比如抓取和解析分开,这样子要改解析, 只需要重新消费数据并解析就可以了
2. 服务器网络异常
- 可以定时任务监控数据库的入库数量, 如果在规定的时间没有数据入库,触发告警机制
3. 如何高效利用服务器
可以根据服务器的硬件资源,进行分布式爬虫, 比如带宽高的可以做成抓取节点,cpu 好的可以进行多线程解析任务,并进行初步的 nlp 清洗
4. 数据源异常导致无数据
- 可以在爬虫系统中添加监控,统计各 http 状态码的数量及占比,如果超过阈值,及时进行相应的措施,比如电话通知负责人,并且实时监控网站状态, 一旦恢复马上调起任务
5. 写一个通用的入库代码
- 定义数据模型的时候, 可以让数据模型的 key 和数据库字段保持一致, 这样子在入库的时候,只取数据库字段和模型字段相同的字段入库, 就能复用入库中间件
6. 如果实现爬虫下游的依赖调度
- 使用信号机制,当下游任务接收到运行完成的信号,则开始运行,生产环境中,此功能一般在爬虫框架实现,创建任务时通过设置即可实现
结语
以上只是在设计爬虫系统中的部分问题,并且在具体实现时也会有各种细节,本文不再展开, 后续文章会从 0 到 1 设计一个可用于生产的完整系统,包含可视化界面,自动生成xpath,异常报警,数据日报,定时调度等功能。