• 【搜索引擎基础知识2】网络爬虫



    部分内容参考《这就是搜索引擎》

    通用搜索引擎的处理对象是互联网网页,目前网页数量以百亿计,搜索引擎的网络爬虫能够高效地将海量的网页数据传下载到本地,在本地 形成互联网网页的镜像备份。它是搜索引擎系统中很关键也很基础的构件。

    (一)网络爬虫本质就是浏览器http请求

    浏览器和网络爬虫是两种不同的网络客户端,都以相同的方式来获取网页:

          1、首先, 客户端程序连接到域名系统(DNS)服务器上,DNS服务器将主机 名转换成ip 地址。

          2、接下来,客户端试着连接具有该IP地址的服务器。服务器上可能有多个 不同进程程序在运行,每个进程程序都在监听网络以发现新的选接。.各个进程监听不同的网络端口 (port). 端口是一个l6位的数卞,用来辨识不同的服务。Http请求一般默认都是80端口。

         3、 一旦建立连接,客户端向服务器发送一个http请求,服务器接收到请求后,返回响应结果给客户端。

         4、客户端关闭该连接。

        详细了解http工作原理:网络互联参考模型(详解) Apache运行机制剖析

      (二)搜索引擎爬虫架构

            浏览器是用户主动操作然后完成HTTP请求,而爬虫需要自动完成http请求,网络爬虫需要一套整体架构完成工作。

           尽管爬虫技术经过几十年的发展,从整体框架上已相对成熟,但随着互联网 的不断发展,也面临着一些有挑战性的新问题。 通用爬虫框架如下图:

                           

                                                                                        通用爬虫框架


           通用的爬虫框架流程:

           1、首先从互联网页面中精心选择一部分网页,以这 些网页的链接地址作为种子URL;

           2、将这些种子URL放入待抓取URL队列中;

           3、爬虫从待抓取 URL队列依次读取,并将URL通过DNS解析,把链接地址转换为网站服务器对应的IP地址。 

           4、然后将IP地址和网页相对路径名称交给网页下载器,

           5、网页下载器负责页面内容的下载。

           6、对于下载到 本地的网页,一方面将其存储到页面库中,等待建立索引等后续处理;另一方面将下载网页的 URL放入己抓取URL队列中,这个队列记载了爬虫系统己经下载过的网页URL,以避免网页 的重复抓取。

           7、对于刚下载的网页,从中抽取出所包含的所有链接信息,并在已抓取URL队列 中检査,如果发现链接还没有被抓取过,则将这个URL放入待抓取URL队歹!

           8,9、末尾,在之后的 抓取调度中会下载这个URL对应的网页,如此这般,形成循环,直到待抓取URL队列为空.

    (三)爬虫抓取策略

      在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。

           1、 深度优先搜索策略(顺藤摸瓜)
             即图的深度优先遍历算法。网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。

             我们使用图的方式来说明:

            我们假设互联网就是张有向图,图中每个顶点代表一个网页。 设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点发v 出发,访问此顶点,然后依次从v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和v 有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

    以如下图的无向图G1为例,进行图的深度优先搜索:

              


                                                      G1

        

           搜索过程:

                 


            假设从顶点页面v1 出发进行搜索抓取,在访问了页面v1 之后,选择邻接点页面v2。因为v2 未曾访问,则从v2 出发进行搜索。依次类推,接着从v4 、v8 、v5 出发进行搜索。在访问了v5 之后,由于v5 的邻接点都已被访问,则搜索回到v8。由于同样的理由,搜索继续回到v4,v2 直至v1,此时由于v1 的另一个邻接点未被访问,则搜索又从v1 到v3,再继续进行下去由此,得到的顶点访问序列为:


      2、 广度优先搜索策略
          宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。该算法的设计和实现相对简单。在目前为覆盖尽可能多的网页, 一般使用广度优先搜索方法。也有很多研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是认为与初始URL在一定链接距离内的网页具有主题相关性的概率很大。另外一种方法是将广度优先搜索与网页过滤技术结合使用,先用广度优先策略抓取网页,再将其中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。

           还是以上面的图为例,抓取过程如下:

             广度搜索过程:

                              

            首先访问页面v1 和v1 的邻接点v2 和v3,然后依次访问v2 的邻接点v4 和v5 及v3 的邻接点v6 和v7,最后访问v4 的邻接点v8。由于这些顶点的邻接点均已被访问,并且图中所有顶点都被访问,由些完成了图的遍历。得到的顶点访问序列为:


    v1→v2 →v3 →v4→ v5→ v6→ v7 →v8

    和深度优先搜索类似,在遍历的过程中也需要一个访问标志数组。并且,为了顺次访问路径长度为2、3、…的顶点,需附设队列以存储已被访问的路径长度为1、2、… 的顶点。

    (1)采用广度优先的原因:
    重要的网页往往离种子站点距离较近;万维网的深度没有我们想象的那么深,但却出乎意料地宽(中文万维网直径长度只有17,即任意两个网页之间点击17次后便可以访问到);
    宽度优先有利于多爬虫合作抓取;
    (2)广度优先的存在不利结果:
    容易导致爬虫陷入死循环,不该抓取的反复抓取;
    应该抓取的没有机会抓取;
    (3) 解决以上两个缺点的方法是深度抓取策略(Depth-First Trsversal)和不重复抓取策略 
    (4)为了防止爬虫无限制地宽度优先抓取,必须在某个深度上进行限制,达到这个深度后停止抓取,这个深度就是万维网的直径长度。当最大深度上停止抓取时,那些深度过大的未抓取网页,总是期望可以从其他种子站点更加经济地到达。限制抓取深度会破坏死循环的条件,即使出现循环也会在有限次后停止。 
    (5)评价:   宽度(广度)优先,兼顾深度的遍历策略,可以有效保证抓取过程中的封闭性,即在抓取过程(遍历路径)中总是抓取相同域名下的网页,而很少出现其他域名下的网页。

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

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

       4、Partial PageRank策略,即最佳优先搜索策略
            Partial PageRank算法借鉴了PageRank算法的思想:按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取,即对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。

            它只访问经过网页分析算法预测为“有用”的网页。存在的一个问题是,在爬虫抓取路径上的很多相关网页可能被忽略,因为最佳优先策略是一种局部最优搜索算法。 因此需要将最佳优先结合具体的应用进行改进,以跳出局部最优点。研究表明,这样的闭环调整可以将无关网页数量降低30%~90%。
           如果每次抓取一个页面,就重新计算PageRank值,一种折中方案是:每抓取K个页面后,重新计算一次PageRank值。但是这种情况还会有一个问题:对于已经下载下来的页面中分析出的链接,也就是我们之前提到的未知网页那一部分,暂时是没有PageRank值的。为了解决这个问题,会给这些页面一个临时的PageRank值:将这个网页所有入链传递进来的PageRank值进行汇总,这样就形成了该未知页面的PageRank值,从而参与排序。

        由于PageRank是一个全局算法,就是当所有网页都被下载完成以后,其计算结果才是可靠的,但是爬虫在抓取过程中只能接触到一部分网页,所以在抓取阶段的网页时无法进行可靠的PageRank计算的,所以叫做非完全PageRank策略。

        5、OPIC策略策略
            该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。

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

    (四)网页更新策略

         互联网是实时变化的,具有很强的动态性。网页更新策略主要是决定何时更新之前已经下载过的页面。常见的更新策略又以下三种:

        1.历史参考策略
        顾名思义,根据页面以往的历史更新数据,预测该页面未来何时会发生变化。一般来说,是通过泊松过程进行建模进行预测。
        2.用户体验策略
        尽管搜索引擎针对于某个查询条件能够返回数量巨大的结果,但是用户往往只关注前几页结果。因此,抓取系统可以优先更新那些现实在查询结果前几页中的网页,而后再更新那些后面的网页。这种更新策略也是需要用到历史信息的。用户体验策略保留网页的多个历史版本,并且根据过去每次内容变化对搜索质量的影响,得出一个平均值,用这个值作为决定何时重新抓取的依据。
        3.聚类抽样策略
        前面提到的两种更新策略都有一个前提:需要网页的历史信息。这样就存在两个问题:第一,系统要是为每个系统保存多个版本的历史信息,无疑增加了很多的系统负担;第二,要是新的网页完全没有历史信息,就无法确定更新策略。
        这种策略认为,网页具有很多属性,类似属性的网页,可以认为其更新频率也是类似的。要计算某一个类别网页的更新频率,只需要对这一类网页抽样,以他们的更新周期作为整个类别的更新周期。基本思路如图:
       

                      

     (五)暗网抓取

    请参考《这就是搜索引擎》

    1、查询组合问题


    2、文本框填写问题


    (六)分布式爬虫

    请参考《这就是搜索引擎》

    1、主从式分布爬虫

    对于主从式分布爬虫,不同的服务器担当不同的角色分工,其中有一台专门负责对其他服务器提供URL 分发服务,其他机器则进行实际的网页下载。

    但会导致瓶颈。


    2、对等式分布爬虫

    在对等式分布爬虫体系中,服务器之间不存在分工差异,每台服务器承担相同的功能,各自负担一部分URL的抓取工作。


    (七)爬虫质量的评价标准

    1、【更全】 抓取网页覆盖率,爬虫抓取的网页数量占互联网所有网页数量的比例。(即召回率越高越好)
    2、 【更快】抓取网页时新率,网页很可能处于不断变化之中,有的更新,有的删除。保证时新率能够保证网页在变化后的第一时间反映到网页库中,而过期和失效的数据就会越少,用户访问到的东西越新。
    3、 【更准】抓取网页重要性,重要性越高,说明网页质量越好,越能满足用户的搜索需求。(即搜索精度越好)

    (八)网络爬虫的组成模块
    一般的网络爬虫通常包含以下5个模块:
    1、保存种子URL的数据结构
    2、保存待抓取URL的数据结构
    3、保存已经抓取过的URL的数据结构
    4、页面获取模块
    5、对已经获取页面内容的各个部分进行抽取的模块,例如HTML,JS等。

    其它可选的模块包括:
    1、负责连接前处理模块
    2、负责连接后处理模块
    3、过滤器模块
    4、负责多线程的模块
    5、负责分布式的模块

    (九)URL存储的常用数据结构
    1、种子URL
    爬虫都是从一系列的种子URL开始爬取,一般从数据库表或者配置文件中读取这些种子URL。
    一般来说,网站拥有者把网站提交给分类目录,例如dmoz(http://www.dmoz.org/),爬虫则可以从开放式目录dmoz抓取。
    种子URL一般有以下几个字段
    Id   url  Source(网站来源)  rank(PageRank值)
    2、待抓取URL的数据结构
    (1)一个比较小的示例爬虫程序,可能就使用内存中的一个队列,或者是优先级别队列进行存储。
    (2)一个中等规模的爬虫程序,可能使用BerkelyDB这种内存数据库来存储,如果内存中存放不下的话,还可以序列化到磁盘上。
    (3)真正的大规模爬虫系统,是通过服务器集群来存储已经爬取出来的URL。
    3、已抓取过的URL的数据结构
    由于Visited表经常被查询,以确认是否已经处理过。因此,Visited表如果是一个内存数据结构的话,可以采用Hash(HashSet/HashMap)来存储。
    如果存储在数据库中的话,可以对URL列建立索引。


  • 相关阅读:
    那些不能错过的Xcode插件
    iOS开发过程中使用Core Data应避免的十个错误
    define和typedef
    #号运算符
    第三方移动后端服务开发
    9款优秀的APP免费测试框架
    网络协议初探(二)
    iphone第三方库
    HTTP状态码
    JDK8新特性:在JDK8中,默认添加final
  • 原文地址:https://www.cnblogs.com/jediael/p/4304139.html
Copyright © 2020-2023  润新知