记一个简单的增量式爬虫方案
最近在玩爬虫,于是基于以下需求场景设计了一个简单并且验证可用的增量式爬虫方案。
场景
- 需要爬取多个同类型的网站数据
- 网站数据持续、不定期更新
- 数据量不太大,每日更新几千
- 获取到的数据可以用来玩(数据分析等等),嘿嘿
对于这种类型的需求,先捋捋需要考虑的问题:
- 数据如何去重
- 怎样的存储方案
我的设计方案
如图:
- 爬虫通过一个定时任务以多线程启动,爬取的数据直接放入消息队列等待下一步处理
- 第二个定时任务将消息队列中的数据定时取出放入源数据层,这个定时任务有一个很关键的任务就是去重,在放入源数据层中先判断源数据层中有没有该条数据。
- 第三个定时任务将源数据层中的数据进行清洗处理,最后入到操作数据层,成为真正可用的数据。
- 还有一个定时任务用来定期将源数据层中的比较旧的数据转移到历史数据中,使得源数据层的数据量处于一个恒定范围内的值,减小数据去重以及数据处理时查询源数据层的压力。(不用担心源数据转移后会影响到数据去重那一步,因为清理的都是比较久的数据,比如一个月前,而当前正在爬取的数据可能是今天刚刚更新的,今天刚更的数据和一个月之前的数据重复的概率极低,可以忽略)
我实现该方案具体使用的技术:
- Python爬虫
- Redis作为消息队列
- MongoDB作为源数据层和历史数据层
- MySQL作为操作数据层
- 定时任务使用了Python的schedule