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

优采云 发布时间: 2020-08-22 19:56

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

  记录下在上家公司负责过的一个采集系统从零到整的过程,包括需求,分析,设计,实现,遇到的问题及系统的成效,系统最主要功能就是可以通过对每位网站进行不同的采集规则配置对每位网站爬取数据,目前系统运行稳定,已爬取的数据量大约在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::9001/getData?url=*[@id=post_list]/div/div[2]/h3/a

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线