什么叫爬虫技术?有哪些作用?

优采云 发布时间: 2020-06-15 08:03

  1、爬虫技术2113概述

  网络爬虫(Web crawler),是一种根据5261一定的规则,自动地抓取万4102维1653网信息的程序或则脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以手动采集所有其才能访问到的页面内容,以获取或更新那些网站的内容和检索方法。从功能上来讲,爬虫通常分为数据采集,处理,储存三个部份。

  传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL装入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要按照一定的网页剖析算法过滤与主题无关的链接,保留有用的链接并将其倒入等待抓取的URL队列。然后,它将按照一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统储存,进行一定的剖析、过滤,并构建索引,以便以后的查询和检索;对于聚焦爬虫来说,这一过程所得到的剖析结果还可能对之后的抓取过程给出反馈和指导。

  相对于通用网路爬虫,聚焦爬虫还须要解决三个主要问题:

  (1) 对抓取目标的描述或定义;

  (2) 对网页或数据的剖析与过滤;

  (3) 对URL的搜索策略。

  2、爬虫原理

  2.1 网络爬虫原理

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

  2.2 网络爬虫系统的工作原理

  在网路爬虫的系统框架中,主过程由控制器,解析器,资源库三部份组成。控制器的主要工作是负责给多线程中的各个爬虫线程分配工作任务。解析器的主要工作是下载网页,进行页面的处理,主要是将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工作是由解析器完成。资源库是拿来储存下载到的网页资源,一般都采用小型的数据库储存,如Oracle数据库,并对其构建索引。

  控制器

  控制器是网路爬虫的**控制器,它主要是负责按照系统传过来的URL链接,分配一线程,然后启动线程调用爬虫爬取网页的过程。

  解析器

  解析器是负责网路爬虫的主要部份,其负责的工作主要有:下载网页的功能,对网页的文本进行处理,如过滤功能,抽取特殊HTML标签的功能,分析数据功能。

  资源库

  主要是拿来储存网页中下载出来的数据记录的容器,并提供生成索引的目标源。中大型的数据库产品有:Oracle、Sql Server等。

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

  网络爬虫的基本工作流程如下:

  1.首先选定一部分悉心选购的*敏*感*词*URL;

  2.将这种URL倒入待抓取URL队列;

  3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载出来,存储进已下载网页库中。此外,将这种URL放进已抓取URL队列;

  4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL倒入待抓取URL队列,从而步入下一个循环。

  2.3 抓取策略

  在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的次序排列也是一个很重要的问题,因为这涉及到先抓取那种页面,后抓取那个页面。而决定那些URL排列次序的方式,叫做抓取策略。下面重点介绍几种常见的抓取策略:

  2.3.1 深度优先遍历策略

  深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路以后再转到下一个起始页,继续跟踪链接。我们以下面的图为例:

  遍历的路径:A-F-G E-H-I B C D

  2.3.2 宽度优先遍历策略

  宽度优先遍历策略的基本思路是,将新下载网页中发觉的链接直接**待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以里面的图为例:

  遍历路径:A-B-C-D-E-F G H I

  2.3.3 反向链接数策略

  反向链接数是指一个网页被其他网页链接指向的数目。反向链接数表示的是一个网页的内容遭到其他人的推荐的程度。因此,很多时侯搜索引擎的抓取系统会使用这个指标来评价网页的重要程度,从而决定不同网页的抓取先后次序。

  在真实的网路环境中,由于广告链接、作弊链接的存在,反向链接数不能完全等他我那种也的重要程度。因此,搜索引擎常常考虑一些可靠的反向链接数。

  2.3.4 Partial PageRank策略

  Partial PageRank算法借鉴了PageRank算法的思想:对于早已下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每位页面的PageRank值,计算完以后,将待抓取URL队列中的URL根据PageRank值的大小排列,并根据该次序抓取页面。

  如果每次抓取一个页面,就重新估算PageRank值,一种折中方案是:每抓取K个页面后,重新估算一次PageRank值。但是此类情况都会有一个问题:对于早已下载出来的页面中剖析出的链接,也就是我们之前谈到的未知网页那一部分,暂时是没有PageRank值的。为了解决这个问题,会给那些页面一个临时的PageRank值:将这个网页所有入链传递进来的PageRank值进行汇总,这样就产生了该未知页面的PageRank值,从而参与排序。

  2.3.5 OPIC策略策略

  该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始*敏*感*词*(cash)。当下载了某个页面P以后,将P的*敏*感*词*平摊给所有从P中剖析出的链接,并且将P的*敏*感*词*清空。对于待抓取URL队列中的所有页面根据*敏*感*词*数进行排序。

  2.3.6 大站优先策略

  对于待抓取URL队列中的所有网页,根据所属的网站进行分类。对于待下载页面数多的网站,优先下载。这个策略也因而称作大站优先策略。

  3、爬虫分类

  开发网路爬虫应当选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?上面说的爬虫,基本可以分3类:

  (1)分布式爬虫:Nutch

  (2)JAVA爬虫:Crawler4j、WebMagic、WebCollector

  (3)非JAVA爬虫:scrapy(基于Python语言开发)

  3.1 分布式爬虫

  爬虫使用分布式,主要是解决两个问题:

  1)海量URL管理

  2)网速

  现在比较流行的分布式爬虫,是Apache的Nutch。但是对于大多数用户来说,Nutch是这几类爬虫里,最不好的选择,理由如下:

  1)Nutch是为搜索引擎设计的爬虫,大多数用户是须要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有很大的意义。也就是说,用Nutch做数据抽取,会浪费好多的时间在不必要的估算上。而且假如你企图通过对Nutch进行二次开发,来促使它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非,有更改Nutch的能力,真的不如自己重新写一个分布式爬虫框架了。

  2)Nutch依赖hadoop运行,hadoop本身会消耗好多的时间。如果集群机器数目较少,爬取速率反倒不如单机爬虫快。

  3)Nutch似乎有一套插件机制,而且作为亮点宣传。可以看见一些开源的Nutch插件爬虫软件 性能要求,提供精抽取的功能。但是开发过Nutch插件的人都晓得,Nutch的插件系统有多拙劣。利用反射的机制来加载和调用插件,使得程序的编撰和调试都显得异常困难,更别说在里面开发一套复杂的精抽取系统了。而且Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点虽然是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text文本)。

  4)用Nutch进行爬虫的二次开发,爬虫的编撰和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学**成本很高爬虫软件 性能要求,何况是要使一个团队的人都看懂Nutch源码。调试过程中会出现除程序本身之外的各类问题(hadoop的问题、hbase的问题)。

  5)很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等。很多人虽然理解错了,这里说的持久化数据,是指将URL信息(URL管理所须要的数据)存放到avro、hbase、mysql。并不是你要抽取的结构化数据。其实对大多数人来说,URL信息存在那里无所谓。

  6)Nutch2的版本目前并不适宜开发。官方如今稳定的Nutch版本是nutch2.2.1,但是这个版本绑定了gora-0.3。如果想用hbase配合nutch(大多数人用nutch2就是为了用hbase),只能使用0.90版本左右的hbase,相应的就要将hadoop版本降到hadoop 0.2左右。而且nutch2的官方教程比较有欺骗作用,Nutch2的教程有两个,分别是Nutch1.x和Nutch2.x,这个Nutch2.x官网上写的是可以支持到hbase 0.94。但是实际上,这个Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1以后的一个版本,这个版本在官方的SVN中不断更新。而且十分不稳定(一直在更改)。

  所以,如果你不是要做搜索引擎,尽量不要选择Nutch作为爬虫。有些团队就喜欢随大流,非要选择Nutch来开发精抽取的爬虫,其实是冲着Nutch的名气,当然最后的结果常常是项目延后完成。

  如果你是要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或则es配合,就可以构成一套十分强悍的搜索引擎了。如果非要用Nutch2的话,建议等到Nutch2.3发布再看。目前的Nutch2是一个极其不稳定的版本。

  3.2 JAVA爬虫

  这里把JAVA爬虫单独分为一类,是因为JAVA在网路爬虫这块的生态圈是十分健全的。相关的资料也是最全的。这里可能有争议,我只是随便谈谈。

  其实开源网络爬虫(框架)的开发十分简单,难问题和复杂的问题都被原先的人解决了(比如DOM树解析和定位、字符集检查、海量URL去重),可以说是毫无技术浓度。包括Nutch,其实Nutch的技术难点是开发hadoop,本身代码十分简单。网络爬虫从某种意义来说,类似遍历本机的文件,查找文件中的信息。没有任何难度可言。之所以选择开源爬虫框架,就是为了省事。比如爬虫的URL管理、线程池之类的模块,谁都能做,但是要做稳定也是须要一段时间的调试和更改的。

  对于爬虫的功能来说。用户比较关心的问题常常是:

  1)爬虫支持多线程么、爬虫能用代理么、爬虫会爬取重复数据么、爬虫能爬取JS生成的信息么?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线