爬取百万数据的采集系统从零到整的过程

  记录下在上家公司负责过的一个采集系统从零到整的过程,包括需求,分析,设计,实现,遇到的问题及系统的成效,系统最主要功能就是可以通过对每个网站进行不同的采集规则配置对每个网站爬取数据,目前系统运行稳定,已爬取的数据量大概在600-700万之间(算上一些历史数据,应该也有到千万级了),每天采集的数据增量在一万左右,配置采集的网站1200多个,这个系统其实并不大,但是作为主要的coding人员(基本整个系统的百分之八十的编码都是我写的),大概记录一下系统的实现,捡主要的内容分享下,最后在提供一些简单的爬虫demo供大家学习下

  数据采集系统:一个可以通过配置规则采集不同网站的系统

  主要实现目标:

  ·针对不同的网站通过配置不同的采集规则实现网页数据的爬取

  ·针对每篇内容可以实现对特征数据的提取

  ·定时去爬取所有网站的数据

  ·采集配置规则可维护

  ·采集入库数据可维护

  第一步当然要先分析需求,所以在抽取一下系统的主要需求:

  ·针对不同的网站可以通过不同的采集规则实现数据的爬取

  ·针对每篇内容可以实现对特征数据的提取,特征数据就是指标题,作者,发布时间这种信息

  ·定时任务关联任务或者任务组去爬取网站的数据

  再分析一下网站的结构,无非就是两种;

  基本所有爬取的网站都可以抽象成这样。

  针对分析的结果设计实现:

  ·任务表

  o 每个网站可以当做一个任务,去执行采集

  ·两张规则表

  o 每个网站对应自己的采集规则,根据上面分析的网站结构,采集规则又可以细分为两个表,一个是包含网站链接,获取详情页列表的列表采集规则表,一个针对是网站详情页的特征数据采集的规则表 详情采集规则表

  ·url表

  o 负责记录采集目标网站详情页的url

  ·定时任务表

  o 根据定时任务去定时执行某些任务 (可以采用定时任务和多个任务进行关联,也可以考虑新增一个任务组表,定时任务跟任务组关联,任务组跟任务关联)

  ·数据存储表

  o 这个由于我们采集的数据主要是招标和中标两种数据,分别建了两张表进行数据存储,中标信息表,招标信息表

  基础架构就是:ssm+redis+htmlunit+jsoup+es+mq+quartz

  java中可以实现爬虫的框架有很多,htmlunit,WebMagic,jsoup等等还有很多优秀的开源框架,当然httpclient也可以实现。

  为什么用htmlunit?

  htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现

  简单说下我对htmlunit的理解:

  ·一个是htmlunit提供了通过xpath去定位页面元素的功能,利用xpath就可以实现对页面特征数据进行提取;

  ·第二个就在于对js的支持,支持js意味着你真的可以把它当做一个浏览器,你可以用它模拟点击,输入,登录等操作,而且对于采集而言,支持js就可以解决页面使用ajax获取数据的问题

  ·当然除此之外,htmlunit还支持代理ip,https,通过配置可以实现模拟谷歌,火狐等浏览器,Referer,user-agent,是否加载js,css,是否支持ajax等。

  XPath语法即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

  为什么用jsoup?

  jsoup相较于htmlunit,就在于它提供了一种类似于jquery选择器的定位页面元素的功能,两者可以互补使用。

  采集数据逻辑分为两个部分:url采集器,详情页采集器

  url采集器:

  ·只负责采集目标网站的详情页url

  详情页采集器:

  ·根据url去采集目标url的详情页数据

  ·使用htmlunit的xpath,jsoup的select语法,和正则表达式进行特征数据的采集。

  这样设计目的主要是将url采集和详情页的采集流程分开,后续如果需要拆分服务的话就可以将url采集和详情页的采集分成两个服务。

  url采集器与详情页采集器之间使用mq进行交互,url采集器采集到url做完处理之后把消息冷到mq队列,详情页采集器去获取数据进行详情页数据的采集。

  ·在采集url的时候进行去重

  ·同过url进行去重,通过在redis存储key为url,缓存时间为3天,这种方式是为了防止对同一个url进行重复采集。

  ·通过标题进行去重,通过在redis中存储key为采集到的标题 ,缓存时间为3天,这种方式就是为了防止一篇文章被不同网站发布,重复采集情况的发生。

  一个简略爬虫的代码实现:

  上面的代码就实现了采集一个列表页

  ·url就是目标网址

  ·xpath就要采集的数据的xpath了

  请求这个url:http://localhost:9001/getData?url=https://www.cnblogs.com/xpath=//*[@id=post_list]/div/div[2]/h3/a

  ·url:传的是博客园首页的地址;

  ·xpath:传的是获取博客园首页的博客列表的标题

  网页页面:

  

 

  采集回的数据:

  

 

  再次请求:http://localhost:9001/getData?url=https://blog.csdn.net/xpath=//*[@id=feedlist_id]/li/div/div[1]/h2/a

  ·url:这次传是csnd的首页;

  ·xpath:传的是获取csdn首页的博客列表的标题

  网页页面:

  

 

  采集回的数据:

  

 

  优化:利用模板方法设计模式,将功能部分抽取出来

  上述代码可以抽取为:一个采集执行者,一个自定义采集数据的实现

  在Crawler 中注入一个接口,这个接口只有一个方法crawl(),不同的实现类去实现这个接口,然后自定义取特征数据的实现

  优化后的代码:

  不同的实现,只需要去修改接口实现的这部分就可以了

  最后看一下利用采集系统采集的数据。

  效果还是不错的,最主要是系统运行稳定:

  ·采集的历史数据在600-700万量级之间

  ·每天新采集的数据增量在一万左右

  ·系统目前配置了大约1200多个任务(一次定时的实现会去采集这些网站)

  系统配置采集的网站主要针对全国各省市县招投标网站(目前大约配置了1200多个采集站点)的标讯信息。

  采集的数据主要做公司标讯的数据中心,为一个pc端网站和2微信个公众号提供数据

  ·网址:http://www.bid-data.com

  ·公众号:爱招标,中标喽(欢迎关注,掌握一手标讯信息)

  以pc端展示的一篇采集的中标的数据为例,看下采集效果:

  ·http://www.bid-data.com/bid_MQKHG001TD6.html

  采集的详情:

  

 

  特征数据的提取:

  

 

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值