爬虫设计思路

一、前言

爬虫广泛使用于搜索引擎、新闻聚合以及大数据采集当中,一个良好的爬虫系统需要考虑很多方面:爬虫种子的获取需要有个稳定的任务调度机制,下载页面过程需要考虑到网页内容的生成是否是需要js渲染,请求网页是否需要设置请求头,还有请求过多会不会被对方*。另外就是数据处理过程,什么页面需要进行数据提取,什么页面是分裂成其它页面,还有页面内容提取需要采用什么手段:比如css selector解析,xpath解析,还有许多内容是通过json格式返回 需要解析json,还有的内容是属于xml,这就需要你都还有当获取到结果之后需要对结果进行整理、规范化和持久化。

二、设计思路

爬虫设计思路

           图2-1 设计思路

     因为工作当中主要是对新闻内容进行抓取,所以结合新闻资讯进行处理。如图2-1所示,一个典型的新闻网站会分两个页面进行展示,一个是列表页一个是详情页,我们要从列表页进行处理分裂出详情页,然后下载详情页进行处理提取里面的详情页。最后对提取的结果进行处理,处理的结果后面可以接入其它流程如更进一步的清洗等,最后经过持久话的内容最终可以通过业务流程处理出去。当一个业务流程抓住输入输出,然后结构化和剖析这个流程后,就会知道怎么进行设计了。

三、爬虫系统架构图

爬虫设计思路

图3-1 技术架构

相信接触过scrapy及其它第三方开源抓取工具应该对上面的图不会陌生,系统也是参考java一个比较出名的框架webmagic进程处理的,基于组件化进行开发:

    爬虫系统通过scheduler获取待抓取任务,系统需要考虑到多种可调度的方式,这就需要设计一种可以通过配置选择不同调度模块的功能,比如来自redis的任务调度、来自MQ的任务,也可能来自文件和数据库的调度。另外从页面解析的request同样也需要丢到scheduler进行调度。

   Downloader下载器,下载网页详情有多种java中api提供java.net.URL、java.net.URLConnection 以及HttpClient进行下载,然后还有诸如Https的处理等。

PageProcess页面处理器,通常情况下锁抽取的内容就需要在这边进行处理,同时可以分裂出新的链接,解析HTML可以自己定制使用JSOUP,XPATH以及json 、xml解析。

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等


三、整体的技术选型

爬虫设计思路

    图3-2

如上图所示,数据源种子存储在DB中,然后用redis缓存,抓取系统基于redis做调度。调度程序和爬虫主程序采用RabbitMQ(zeroMq,kafuka也可以)做解耦,然后抓取过程中可以用Redis做链接URL去重处理,然后如果网页内容多种多样可以用MongoDB 这种NoSql数据库做存储。利用其文档存储以及key 、value的优势进行非结构化的持久化,最后抓取的数据可以进一步推送到清洗程序中处理。然后处理后的数据最后存到关系型数据库Mysql中,然后通过业务逻辑处理展示到PC和手机端。

上面就是整个爬虫系统的设计。。