假设目前我们的一个客户需要这样的一个数据采集系统:1)、采集数据包含不带身份认证的天猫商品列表页面,包含带身份(需要登录)的后端页面数据,数据覆盖京东,天猫,苏宁等。

2)、采集系统需要有快速的可编程能力的界面,帮助他们能够快速调试,纠错,而无需走完一个完整本地开发,测试,发布的流程。

3)、采集系统需要有完整的抓取运行日志,采集数据统计,爬虫异常原因诊断分析,容错重试等。

4)、爬虫任务需要有灵活的参数配置,丰富的时间调度设置,任务粒度切割功能。

5)、爬虫需要有针对业务灵活的并发控制,频率设置,支持多机分布式执行。

6)、爬虫数据支持多种存储方式,比如oss对象存储做离线分析,rds存储做实时分析等。

bala bala,反正客户提出的需求,不管是合理,还是无理,不管是好做,还是不好做,,绝对不会让你好受; 注:以上是笔者接触到一个真实的客户对于数据采集系统的各种要求,笔者在倍受客户厚待的toB创业公司。 如果你接触到客户提出这么多的要求,你会怎么做,下面我给出我的解决方案,为了避免重复造轮子,我们可以从目前已知的开源技术里去找找看,相信读过我前面漫谈篇的同学肯定猜到了我接下来要说什么了,是的,今天就是要和大家说说如何利用scrapy+scrapyd+celery[django apscheduler]来完成以上的功能的架构和实践。

这里不得不提,我心目中开发爬虫,或者更准确来讲,频繁变更的数据抓取脚本型语言一定是最合适,比如python/nodejs,所以在语言和框架选择上非python莫属了

既然要求分布式,易部署,而且需要可视化管理界面,那么从工程组织上讲,主要分为两块,admin与engine,其中admin又因为前后端分离,接口部分和页面部分,接口部分当然是采用django了,页面部分采用react也是很好的选择,engine作为脚本执行容器,本来是准备用golang来写的,但考虑到技术栈的统一,scrapyd正好弥补了这个缺口。

客户还要求爬虫任务调度的功能,且考虑到分布式,而celery作为python语言家族最好的分布式任务框架,自然是最佳选择,但整体评估下来,celery毕竟比较重,又依赖了redis和rabbitMQ,同时在调度表达式上还是不够灵活,遂改为django+apscheduler,小巧,灵活,同时技术栈上也比较统一,容易驾驭。