基于Hadoop 的分布式网络爬虫技术学习笔记_hadoop和爬虫的关系-程序员宅基地

技术标签: 爬虫  hadhoop  大数据/云计算  分布式  

http://blog.csdn.net/zolalad/article/details/16344661

基于Hadoop 的分布式网络爬虫技术学习笔记  

一、网络爬虫原理

Web网络爬虫系统的功能是下载网页数据,为搜索引擎系统提供数据来源。很多大型的网络搜索引擎系统都被称为基于 Web数据采集的搜索引擎系统,比如 Google、Baidu。由此可见 Web 网络爬虫系统在搜索引擎中的重要性。网页中除了包含供用户阅读的文字信息外,还包含一些超链接信息。Web网络爬虫系统正是通过网页中的超连接信息不断获得网络上的其它网页。正是因为这种采集过程像一个爬虫或者蜘蛛在网络上漫游,所以它才被称为网络爬虫系统或者网络蜘蛛系统,在英文中称为 Spider或者Crawler

二、网络爬虫系统的工作原理

Web网络爬虫系统一般会选择一些比较重要的、出度(网页中链出超链接数)较大的网站的URL作为种子URL集合。网络爬虫系统以这些种子集合作为初始URL,开始数据的抓取。因为网页中含有链接信息,通过已有网页的 URL会得到一些新的 URL,可以把网页之间的指向结构视为一个森林,每个种子URL对应的网页是森林中的一棵树的根节点。这样,Web网络爬虫系统就可以根据广度优先算法或者深度优先算法遍历所有的网页。由于深度优先搜索算法可能会使爬虫系统陷入一个网站内部,不利于搜索比较靠近网站首页的网页信息,因此一般采用广度优先搜索算法采集网页。Web网络爬虫系统首先将种子URL放入下载队列,然后简单地从队首取出一个URL下载其对应的网页。得到网页的内容将其存储后,再经过解析网页中的链接信息可以得到一些新的URL,将这些URL加入下载队列。然后再取出一个URL,对其对应的网页进行下载,然后再解析,如此反复进行,知道遍历了整个网络或者满足某种条件后才会停止下来。

抓取策略:

在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:
1.深度优先遍历策略
    深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。我们以下面的图为例:

遍历的路径:A-F-G E-H-I B C D
2.宽度优先遍历策略
宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以上面的图为例:
遍历路径:A-B-C-D-E-F G H I
3.反向链接数策略
    反向链接数是指一个网页被其他网页链接指向的数量。反向链接数表示的是一个网页的内容受到其他人的推荐的程度。因此,很多时候搜索引擎的抓取系统会使用这个指标来评价网页的重要程度,从而决定不同网页的抓取先后顺序。
    在真实的网络环境中,由于广告链接、作弊链接的存在,反向链接数不能完全等他我那个也的重要程度。因此,搜索引擎往往考虑一些可靠的反向链接数。
4.Partial PageRank策略
    Partial PageRank算法借鉴了PageRank算法的思想:对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。
    如果每次抓取一个页面,就重新计算PageRank值,一种折中方案是:每抓取K个页面后,重新计算一次PageRank值。但是这种情况还会有一个问题:对于已经下载下来的页面中分析出的链接,也就是我们之前提到的未知网页那一部分,暂时是没有PageRank值的。为了解决这个问题,会给这些页面一个临时的PageRank值:将这个网页所有入链传递进来的PageRank值进行汇总,这样就形成了该未知页面的PageRank值,从而参与排序。下面举例说明:
5.OPIC策略策略
    该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。
6.大站优先策略
    对于待抓取URL队列中的所有网页,根据所属的网站进行分类。对于待下载页面数多的网站,优先下载。这个策略也因此叫做大站优先策略。

三、网络爬虫系统的基本结构

通过上面 Web网络爬虫系统基本原理的介绍,我们可以将一般的爬虫系统基本结构分为 6个模块,这6个模块组成的爬虫系统基本结构图:

(1)配置模块:该模块允许用户通过配置文件来配置爬虫系统。比如,爬虫系统下载网页的深度(层数)、多线程抓取时的线程数、抓取同一网站两个网页的间隔时间和限制待抓取 URL 的正则表达式等等。

(2)已访问URL识别模块:由于一个网页的URL可能会被多次解析出来,所以为了防止同一网页被多次重复下载爬虫必须要有这个模块来过滤掉已抓取的网页。

(3)robots协议模块:当网络爬虫系统第一次对某个网站进行网页采集的时候,要首先抓取robots.txt,然后获知指定不该访问的目录。或者根据会根据网页的Meta信息判断哪些是服务器定义不能索引和访问的,然后只访问能够索引的页面。

(4)网页抓取模块:网页抓取模块主要完成对网页的抓取工作。通过URL建立与服务器的连接,然后获得网页内容。

 (5)网页解析模块:从已下载的网页中提取链出链接,然后把这些提取出的URL放入下载队列。

(6)存储网页模块:这个模块的作用是将已经下载网页经过一定的组织存储在本地服务器上或者分布式文件系统中。以备搜索引擎后续模块的处理

上面这个基本结构是 Web网络爬虫系统必须具备的。在应用时,由于不同的爬虫系统对各个模块的组合方式不同,因此也会形成不同的系统结构。

四、分布式网络爬虫的工作原理

前面描述的是设计一个集中式爬虫系统所必须考虑的两个问题,但是,不论分布式爬虫系统还是集中式爬虫系统都需要考虑这两个核心工作原理与核心基本结构。因为分布式网络爬虫可以看做是多个集中式网络爬虫系统组合而成。结合上面给出的集中爬虫的核心工作原理和核心基本结构,下面本节来阐述分布式网络爬虫的工作原理。

分布式爬虫系统是运行于机器集群之上的,集群中每一个节点都是一个集中式爬虫,其工作原理与集中式爬虫系统的工作原理相同。这些集中式爬虫在分布式爬虫系统中是由一个主节点控制来协同工作的。由于分布式爬虫系统要求多个节点协同工作,这样多个节点需要相互通信来交互信息,所以搭建分布式爬虫系统的关键是网络通信。因为,分布式爬虫系统可以利用多个节点抓取网页,所以,分布式爬虫系统的效率远远高于集中式爬虫系统。

分布式爬虫系统的体系结构有很多种,工作方式和存储方式也很多。但是,典型的分布式爬虫系统都采取主从方式的体系结构。即有一个主节点控制所有从节点执行抓取任务,这个主节点负责分配URL,保证集群中所有节点的负载均衡。另外,关于存储方式,比较流行的是将抓取的网页保存在分布式文件系统上,这样管理多个节点上的数据更加方便。通常情况下使用的分布式文件系统是都是基于HadoopHDFS系统。

五、分布式网络爬虫研究现状

目前,最成功的分布式 Web网络爬虫系统主要应用在搜索引擎公司(如:Google)和其他商业性较强的公司里。然而这些公司并没有公布他们分布式爬虫的技术细节并且云计算的应用尚处在萌芽阶段。现在比较著名的分布式网络爬虫有Mercator,UbiCrawler、WebFountain和 Google Crawler。

六、基于 Web数据采集的搜索引擎系统-基本架构

一个完整的“分布式信息获取和检索平台(即基于 Web 数据采集的搜索引擎系统)”可大体上分为5个模块,而每一个模块都对应着Hadoop的一个或者多个 Map/Reduce任务。这5个模块分别是:分布式采集模块(即爬虫)、分布式分析模块、分布式索引模块、分布式检索模块和用户查询模块。

首先,分布式信息获取模块负责抓取网页的工作,这部分由若干个 Map/Reduce过程共同协作完成。抓取下来的网页经过初步的预处理被保存在分布式文件系统(HDFS)中,构成原始文本库。其次,分布式分析模块负责对原始文本库中的网页进行分析,主要是通过文本解析器提供的分词功能来完成的。将分词处理后的结果递交给分布式索引模块,同时分析模块还会对用户提交的查询进行分析。再次,分布式索引模块负责关键词出现频率分析和创建倒排索引。关键词分析之后生成索引词典,索引器创建倒排索引之后构成索引库保存在分布式文件系统(HDFS)中,创建索引这部分也是由若干个 Map/Reduce过程组成。另外,分布式检索模块负责去索引库中查询索引完成检索将结果数据集反馈给用户。最后,用户查询模块负责用户和搜索引擎之间的交互。用户先向分布式检索模块提交查询,检索模块将查询后的结果集合按照某种规则排好序返回给用户。

七、分布式爬虫系统的结构设计

7.1爬虫基本流程设计

下面对爬虫系统的基本流程进行详细的说明:

(1)先将择优选择的URL种子文件集合从本地文件系统上传至 Hadoop 集群分布式文件系统 HDFS的in文件家中,in这个文件夹始终存放当前层要抓取的 URL。同时,设置已抓层数为 0。

(2)判断 in文件夹中待抓取队列是否为空。若是,跳转到(7);否则,执行(3)。

(3)抓取 in文件夹中的待抓取队列。这个抓取过程是由CrawlerDriver模块完成的,该模块是一个基于 Hadoop的 Map/Reduce过程。后面我们将详细介绍CrawlerDriver模块的 Map/Reduce详细实现。最后将抓取下来的网页存放在HDFS的 doc文件夹中。这个 doc文件夹存放着每一层未经加工过的网页。

(4)解析已抓取的网页,从 doc 文件夹中已抓取的网页中提取出链出链接。这个解析过程是由ParserDriver模块完成的,该模块也是一个 Map/Reduce计算过程。具体抽取实现是在 Map阶段通过 HTML解析完成的。后面我们将详细介绍 ParserDriver模块的 Map/Reduce详细实现。这个过程结束后会将抽取出来的链出链接保存在 HDFS上的 out文件夹。这个 out文件夹始终存放当前层解析出来的链出链接。

(5)优化解析出来的链出链接,过滤已抓取的 URL,即从 out文件夹中已解析出来的链出链接 URL里过滤掉已抓过的 URL。这个优化过程时由OptimizerDriver模块完成的,该模块还是一个 Map/Reduce过程。后面我们会详细介绍如何基于 Hadoop完成 OptimizerDriver模块的 Map/Reduce实现。优化后会将过滤优化好的 URL集合保存在 in文件夹中等待下一轮的抓取。

(6)判断已抓层数是否小于 depth。如果小于,“已抓层数”自加 1,返回(2);否则进入(7)。

(7)合并去重,将每层抓取的网页进行合并同时去掉重复抓取的网页。这个工作是由MergeDriver模块完成的,同样,这个模块也是一个基于 Hadoop开发的Map/Reduce过程。后面我们会详细介绍如何基于 Hadoop完成OptimizerDriver模块的 Map/Reduce实现。合并后将结果依然保存在分布式文件系统 HDFS上的doc文件夹中。

(8)对抓取的网页做简单的预处理。即将 html 代码转化为 xml。这个工作是由HtmlToXmlDriver模块完成的,同样,这个模块也是一个基于 Hadoop开发的Map/Reduce过程。将处理好的 xml文件存放在 HDFS的 xml文件夹中。

(9)结束。

从上面这个流程中我们可以看出,整个爬虫系统可以分为 5个部分,每个部分是一个独立的完成对应功能的模块,每个模块对应着一个 Map/Reduce过程。下面介绍下这 5个模块的功能:

(1)CrawlerDriver模块:并行下载待抓取队列,把 in文件夹中的文本文件作为待抓取的 URL种子集合,该文本文件在第一轮抓取时是用户给定的初始种子,从第二轮开始就是上一轮提取出来的链出链接。该模块是基于 Hadoop开发的一个 Map/Reduce过程,Map和 Reduce分别完成了不同的功能,具体下载是在Reduce阶段完成的,并且采用多线程下载,下载部分是采用 Java的网络编程完成的。下载下来的网页保存在 HDFS上的 doc文件夹中。

(2)ParserDriver模块:并行分析已下载网页,提取链出链接。根据 doc文件夹中已下载的网页分析出每一个网页中向外指向的链接即链出链接。该模块同样是基于 Hadoop开发的 Map/Reduce过程,但是只需要一个 Map阶段即可完成目标。在 Map阶段主要工作是利用 HTML解析器解析出链出链接,另外,还通过规则限制链出 URL的类型,防止抽取出的链接链到其他网站上。最后将这些链出链接保存在 HDFS上的 out文件夹中。

(3)OptimizerDriver模块:并行优化链出链接,过滤掉重复链接。根据 out文件夹中已提取的链出链接,进行优化,剩下为抓取的 URL交给下一层处理。由于网站层与层之间链接的关系是一个图的结构,所以该模块的工作可以理解成寻找环路的问题,将构成环路的 URL过滤掉。这个模块也是一个基于Hadoop开发的 Map/Reduce过程。将优化好的 URL存放在 HDFS上的 in文件夹中。

(4)MergeDriver模块:并行合并各层抓取的网页。根据 doc文件夹中每一层抓取的网页,进行合并,去掉层与层之间可能重复的网页。这部分也是一个基于Hadoop开发的 Map/Reduce过程。最后,依然将结果存放在 doc文件夹中。

(5)HtmlToXMLDriver模块:并行地将 HTML转化为 XML。根据 doc文件夹中抓取的网页,进行转化完成预处理。这部分是通过DOM完成的。同样也是一个Map/Reduce过程。将转化后的 xml保存在 HDFS上的 xml文件夹中。

这样,这 5个功能模块就构成了一个基于 Hadoop的分布式爬虫系统。从生成待抓取队列开始循环执行 CrawlerDriver、ParserDriver和 OptimizerDriver以完成各层网页抓取,跳出循环后,执行 MergeDriver和 HtmlToXMLDriver预处理工作。其中,循环次数是通过预设定的参数“爬取层数 depth”和“待抓取队列是否为空”来控制的。

7.2爬虫系统的框架设计

爬虫系统有四个存储结构:待抓取 URL 库、原始网页库、链出 URL库和 xml库。这四个存储结构都是存在于 Hadoop的分布式文件系统以 HDFS为载体。下面详细说明这四个存储结构:

(1)待抓取 URL 库:存放当前层需要抓取的 URL集合,实际上就是一个记录着待抓取 URL的文本文件,其中 URL之间以“\n”为分隔符。在第一层抓取之前,这个文本文件是用户提交的 URL种子集合作为爬虫进入互联网的入口。

(2)原始网页库:存放每一层抓取下来的原始网页。这里的网页是未经过任何处理的 HTML 信息,其存放形式是 key值为 URL,value值为 URL对应的网页HTML信息。

(3)链出 URL 库:存放每一层解析出来的链出链接,其存放形式是 key值为 URL,value值为 URL对应网页包含的链出链接集合。

(4)xml库:存放所有层抓取下来的网页经过转化的 XML信息。这里的转化相当于对 HTML信息的预处理。其存放形式是 key值为 URL,value值为URL对应的网页的 XML信息。

上述 5个功能模块分别完成不同的功能,且他们都是多台机器并行完成它们的工作,而这四个存储结构分别存储着各个功能模块生成的结果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/spy_h/article/details/80744893

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签