垂直型爬虫架构设计

(一)

1.爬虫的分类:

        对于我来说,爬虫分为两类:

            需要载入配置文件的爬虫与不需要载入配置文件的爬虫。

            其实也就是人们常说的垂直型爬虫跟宽度(深度)遍历爬虫。

    2.爬虫的架构:

        1.宽度遍历爬虫。

            做过SEO的朋友大概都知道,如果一个网站需要百度能够尽快的抓取,那么仅仅优化关键词,提高权重等都是比较简单的优化,爬虫友好性需要网站在建设的时候就考虑到爬虫的友好如:标签设置,架构设计...

            宽度遍历爬虫就是宽度抓取,网站在设计的时候就直接是按照宽度设计...不太好理解,也不太好解释...大概的意思就是深度少...如; 进入首页之后---就能看到各个分类,点击分类就能看到分类列表---点击分类列表就是内容...减少与用户的交互,也让爬虫能直接找到重点。

            各大搜索引擎应用的都是宽度遍历方式来抓取数据不信你可以建一个网站设置十几级深度..首页。 - 分类 - 再分类---再分类之后十几级之后才能看到内容..你可以试一下,爬虫抓取的效果怎么样。

            宽度遍历爬虫比较常见的很多,Nutch的,Heritrix的等都是宽度遍历爬虫的典型代表,比较常用的就是Nutch的。

    2.垂直型爬虫

            垂直型爬虫我个人感觉是最近几年才被提出的,垂直型爬虫关注内容与准确还有效率。比较常见的就是舆情项目,财经项目等。仅仅抓取到有效的用数据,并且在爬虫抓取之初就能够把抓取到的内容进行简单的处理:如。提取标题,内容,时间等。

            垂直型爬虫注重效率,相对来说,一个网站有十万个链接,宽度遍历爬虫需要把十万个链接都下载到你的数据库中,而垂直型爬虫只需要下载对你有用的数据,也许仅有几千或者一万,如果垂直型爬虫抓取这么点数据比宽度遍历爬虫抓取的还慢,那么这个项目在这点上就是个垃圾。

            垂直型爬虫相对于宽度遍历爬虫又一个特别的地方是:宽度遍历爬虫是可定制的,根据某个网站订制..比如:抓取QQ空间,新浪微博等,都是需要登陆的.. 。或者是有些网站的内容需要的JavaScript来调用才能显示,那么就需要的JavaScript解析引擎来保证抓取的质量。插件定制是我对垂直型爬虫做的又一个定义

           

    3.爬虫的设计

        爬虫想起来复杂做起来其实一点也不复杂,简单来说就是网站链接发现,网站连接处理,链接下载---继续发现链接...

        进入一个网站首先需要提供这个网站的网址。例如:http:         //www.baidu.com          那么得到百度之后就需要下载该页面,下载页面之后能发现几个链接。  http://news.baidu.com  http://music.baidu.com    等,获得这几个链接之后就是打开这几个链接,继续获得新的链接....一直持续下去...

        如果,仅仅是这样,那么爬虫就会'死'在这个网站...比如。在其他页面也会找到http;'// www.baidu.com  那么再进入这里。再一直这样循环......就真的死了..所以需要对链接进行有效的管理,去重等...在这个抓取过程中,某个链接已经抓取过了,那么在链接发现,或者是链接下载的时候就可以直接把这个链接去掉,不进行下载。那么之后发现的链接会越来越少,那么整个网站的抓取也就会有个结束

        好的,表达能力不是很好,简单总结,无论编写什么类型的爬虫,都需要这些:链接发现 - 连接管理 - 链接下载 - 那么也就获取到内容了。

    

    4.垂直型爬虫的垂直?

        垂直型爬虫在刚开始做爬虫的时候我就再想为什么叫垂直型爬虫。现在写了那么久也不是很理解,我大概觉得垂直的意思是垂直获取,就好像是有目的有目标的直接去拿想要的东西,所以垂直...!

        垂直型爬虫跟普通型的爬虫不同的地方在于有目的性。相对于其他爬虫,目的性非常的明确。就好象我要拿一篇文章,其他的东西都不要,那么垂直型爬虫可以满足你!

        垂直型爬虫设计跟宽度遍历爬虫的设计区别也不是很大,一样....链接发现 - 连接管理 - 链接下载。不过大部分的垂直型爬虫多了一个信息提取提取出所需的内容是对垂直型爬虫最大的考研,也是垂直型爬虫最重要的功能。所以在垂直型爬虫上应该体现的是链接发现 - 链接管理 - 链接下载等。!

         个人认为:垂直型爬虫更加适用于企业级,因为企业级所需资讯内容明确而且垂直型爬虫更加的小型,便于管理实现功能定制化。

(二)

上面提到了关于爬虫的一些简单概念与爬虫真正要做的一些功能。简单的分析了一下垂直型爬虫与宽度(深度)遍历的一些特点。现在,我主要针对于垂直型爬虫的架构设计做一些简单的介绍。

    1.垂直型爬虫的基本需求

        目前企业级所需的基本上是垂直型爬虫。舆情分析,财经资讯资讯推荐等。基本山使用的都是垂直型爬虫来作为企业级使用的方案,企业级爬虫的特点我上篇博客里面已经讲过了,所以在做垂直型爬虫架构的时候只需要考虑抓去内容所需的功能。简单来说:拿到某篇资讯所需的方式或功能。例如:常见的javascript方式,ajax等。

        简单来列举一些我在抓去数据时所遇到的一些问题:

        1.javascript调用正文    

        2.ajax方式获取正文

        3.iframe方式

        4.验证码

        5.javascript调用下一页连接

        6.javascript +交方式获取下一页连接

        7.ajax方式获取内容

        8.登录...

        等。

        这些都是需要在设计爬虫之初就要考虑的问题,虽然简单来说爬虫就是获取到需求所需的数据,但是很多时候数据的获取也不是那么简单的。所以框架的整体设计是非常关键的,甚至对于爬虫之后版本的发展都很重要,如果框架设计的不合理,发现新的问题就需要重新构建爬虫或者直接针对遇到的问题设计爬虫。这两种方式都不是可取的。

    2.垂直型爬虫框架

        之前提到,垂直型爬虫抓去数据所需的链接发现 - 链接管理 - 链接下载。那么即可根据这三块把爬虫暂时划分为三个小的模块.1。链接解析2.链接管理3。链接下载。

         链接解析:

        如何链接发现简单来说就是把一个页面下载完成之后根据一定的规则来获取到所需的链接。如xpath方式,dom方式等。比较常用的是xpath,java方向的解析包有Jsoup等。来解析内容。当然,远远没有那么简单,仅仅是jsoup来解析肯定是不够的。但是我们最终要实现的就是从一个页面里面获取到想要继续下载链接。那么这个肯定是需要放在链接下载模块之后。链接下载完成之后解析新的链接(别告诉我没有链接咋下载,刚开始都要写个入口URL的。例如http://www.baidu.com/search/url_submit.htm  _百度的链接提交,就是让爬虫去抓这个页面)

        链接下载:    

            好吧,这块才是整个爬虫的重点非常重要的地方,首先要求下载正确的内容,如:。正文隐藏在IFRAME中,正文是JavaScript的调用的,正文是需要转码的等等当然正常的网站还是很多的,简单的我们只是需要正常的页面打开方式获取就可以了。如HttpClient的,HTMLParser的,甚至直接使用Jsoup都能够获取到内容。

1

Jsoup.connect("();

    当然,这样获取到的内容是源文件,没有JavaScript的解析等。但是至少,我们已经成功获取到了网页内容。虽然简单,但是是获取成功了。好吧,下载模块算是可以实现。那么我们简单来考虑一下,链接下载跟链接发现的步骤可以是:我们输入一个网址,链接下载模块把链接下载下来,之后再去解析模块解析出来我们要继续下载的链接,可以根据的XPath,DOM等方式提取出我们所需要的,垃圾链接,广告链接,无用的链接剔除。然后加入到链接管理模块。

        链接管理:

             链接管理模块在整个垂直型爬虫项目中是非常重要的,效率,准确等是非常关键的因素。当爬虫开始抓取时,爬虫生命周期中所接触下载的所有链接都需要被链接管理模块所管理,简单的有生命周期版与持久化版本。链接管理所需要实现的功能1.去重2.判断

    去重之前已经说过了,如果在生命周期中不进行链接去重,则有可能会让爬虫死在这个网站中......一直循环抓去页面,无法退出。那么去重就是需要首先考虑的问题。能够让爬虫在抓取中判断获取到的新URL是否之前抓过。是否需要下次抓取。

    判断就是业务性的了,判断这个网址是否需要再次抓取。如某个重点网站,在抓取之后发现该链接是否还要抓取,又或者一个非重点网站,更新频率较低。是否抓取到该网站时,放弃本次抓去,把资源让给更新频率较高的网站。等。那么这样链接管理就是需要在获取到该链接的第一时间去去重,判断。好吧,那就是链接发现之后获取到的新链接加入到链接管理模块中。

            这么来看:我们的爬虫基本架构就出来了

            链接发现---链接管理---链接下载---链接发现 - >循环一圈

(三)

前面已经大概的说了一些垂直型爬虫的功能,现在简单的介绍一下我所用的爬虫总体框架的设计,涵盖整个爬虫的各个节点。

    我所用的爬虫主要分为两个部分,也就是两个节点。主节点与爬虫节点。

    主节点负责所有的爬虫任务调度工作,包括爬虫任务的分发,爬虫任务的重试等。同时也用于分配抓取任务,对于抓取任务做简单的规划整理等。

     也许比较难以理解,其实也就相当于抓取任务的大管家,这个是我当时学SEO的时候想到的东西,百度爬虫收录网站的时候是有规律的。很多SEOer们都会在每天固定的时间开始更新网站的内容,新增博文,而且由于我是一个失败的SEOer们也就很奇怪,为什么百度爬虫天天跑新浪去,怎么就不来我的网站踩踩呢。我也更新了呀。有的时候我更新了好几天才被爬虫收录。也就那时知道了什么叫网站权重。谷歌的PR权重等。从而设计了主节点。

    主节点功能有时候很少,简单来说就是根据网站的权重来分配抓取任务但是有时候也会很多:。会基于爬虫抓取状态来判断这个抓取任务的成败对于这些集中进行处理。如:抓取失败,网站权重较高,是由于那个爬虫节点的外网链接问题,那么就把该抓取任务分配到另外的抓取上,从而实现。再次抓取。

    主节点会长时间维护一个抓取队列。基于爬虫的反馈与自身的整理来新增与删减抓取队列的任务。主节点会基于队列来推给爬虫集群抓取的任务..

    爬虫节点是最简单的封装请求,抓取数据,重试,记录日志。与解析等工作。爬虫会根据主节点发来的抓取任务来封装成一个请求,然后直接进入下载,下载完成解析页面,并且存储,页面解析的同时会查找下次要抓取的链接,加入到待抓取队列中,继续下载,直到无法获取到待抓取链接,无法发现新的链接。这时需要把抓取的结果发送给主节点,以便主节点对于抓取结果进行维护。一般节点间的数据交互比较简单,可以简单的返回成功条数,错误条数(404,5XX),抓取时间等。

        爬虫抓取任务完成后,会再次想主节点请求获取新的抓取任务。再次开启抓取。完成以上步骤...        

    下面是简单的流程图。

    

猜你喜欢

转载自blog.csdn.net/xiaochendefendoushi/article/details/81981495
今日推荐