菜鸟也想玩搜索引擎——爬虫部分技术要点浅析(补充)

news/2024/7/19 10:11:38 标签: 爬虫, 数据结构与算法, 大数据

  时隔这么久,继续开写。本文系上一篇的补充:爬虫部分技术要点浅析。

  本次将主要讨论上次提出的后两个问题:如何处理抽取出来的Url

3、如何处理抽取出来的Url(爬取策略)?

  所谓爬取策略,就是网络爬虫从种子网址开始,应该按照怎样的顺序向下爬取。以下是几种典型的爬取策略(既然是浅析,这里只做介绍,想要深入了解请自行查阅资料):

  (1)深度优先策略

    看到这个名词估计多数人立马都会明白,该策略的实现思路采用的是图的深度遍历。事实上当我们通常把网络看做一个图,网络中每个页面看做图中节点,这样在考虑遍历的问题时,很自然的就会使用图的遍历方法(其实也就是树的深度优先遍历)。看下图:

  

    按照深度优先遍历,顺序是:A-->B-->C-->D-->E-->F-->G-->H。

    这里需要说的是在多数情况下,全局的爬去策略是不会采取这种方法的,对于复杂的网路图而言,勇往直前并不见得好,而且特别是实现时使用并行处理时很难控制。

    参考:深度优先策略

  (2)广度优先策略

    这个和第一个相似,也是图的遍历方法之一(树的层次遍历),是一种非常简单直观且历史很悠久的遍历方法,在搜索引擎爬虫一出现就开始采用了。新提出的抓取策略往往会将这种方法作为比较基准,但应该注意到的是,这种策略也是一种相当强悍的方法,很多新方法实际效果不见昨比宽度优化遍历策略好,所以至今这种方法也是很多实际爬虫系统优先采用的爬取策略。

    对于上图而言,广度优先的顺序是:A-->B-->F-->C-->D-->E-->G-->H。

    根据一些研究,一般有效的网页深度不会超过10层(这里记不清了,实际应该远小于10),也就是说树高一般很小,但是每递进一层,阶段却是几何倍的增长。例如一个十分简陋的新闻门户网站,一般为:主页(一个)-->栏目列表页(十几个)-->内容页(几千至几十万)。由此考虑两种策略,很明显广度更优。而且采取广度时我们可以很轻易的在合适的层次采用并行处理,如前边可以在栏目列表页将每个栏目分配给子线程(或子爬虫程序),各自进行内容页的抓取。

  (3)非完全pagerank策略

    首先可以了解下何为pagerank:pagerank算法是Google排名运算法则(排名公式)的一部分,是Google用于用来标识网页的等级/重要性的一种方法,是Google用来衡量一个网站的好坏的唯一标准。

    既然pagerank能够很好的对url评级,很自然地可以想到用PageRank的思想来对URL优化级进行排序。但是这里有个问题,PageRank是个全局性算法,也就是说当所有网页下载完成后,其计算结果才是可靠的,而爬虫的目的就是去下载网页,在运行过程中只能看到一部分页面,所以在爬取阶段的网页是无法获得可靠的PageRank得分的。对于已经下载的网页,加上待爬取的URL队列中的一URL一起,形成网页集合,在此集合内进行PageRank计算,计算完成之后,将待爬取URL队列里的网页按照按照PageRank得分由高低排序,形成的序列就是爬虫接下来应该依次爬取的URL列表。这也是为何称之为“非完全PageRank”的原因。

    参考:百科、视频讲解(hadoop的,挺不错,这集里边简单介绍了pagerank的实现)。

  (4)OPIC策略

    OPIC,即,字面含义是“在线页面重要性计算”,可以将其看做是一种改进的PageRank算法。在算法开始之前,每个互联网页面都给予相同的“现金”(cash),每当下载了某个页面P后,P将自己拥有的“现金”平均分配给页面中包含的链接页面,把自己的“现金”清空。而对于待抓取URL队列中的网页,则根据其手头拥有的现金金额多少排序,优先下载现金最充裕的网页。OCIP从大的框架上与PageRank思路基本一致,区别在于:PageRank每次需要迭代计算,而OCIP策略不需要迭代过程,所以计算速度远远快于PageRank,适合实时计算使用。同时,PageRank在计算时,存在向无链接关系网页的远程跳转过程,而OCIP没有这一计算因子。实验结果表明,OCIP是种较好的重要性衡量策略,效果略优于宽度优先遍历策略。

    这个只是摘抄,具体实现没接触过,而且感觉这样的处理更适用于推荐系统。

    参考:《这就是搜索引擎 核心技术详解》

  (5)大站优先策略

    这个从字面就很容易理解,在爬去过程中会倾向于大网站的url,以网站为单位来选题网页重要性,对于待爬取URL队列中的网页根据所属网站归类,如果哪个网站等待下载的页面最多,则优化先下载这些链接,其本质思想倾向于优先下载大型网站。因为大型网站往往包含更多的页面。鉴于大型网站往往是著名企业的内容,其网页质量一般较高,所以这个思路虽然简单,但是有一定依据。实验表明这个算法效果也要略优先于宽度优先遍历策略。

    个人感觉这种策略可以和其他策略结合使用,能够达到更好的效果。

  (6)网页更新策略

     互联网的动态是其显著特征,随时都有新出现的页面,页面的内容被更改或者本来存在的页面删除。对于爬虫来说,并非将网页抓取到本地就算完成任务,也要体现出互联网这种动态性。本地下载的网页可被看做是互联网页的镜像,爬虫要尽可能保证其一致性。可以假设一种情况:某 个网页已被删除或者内容做出重大变动,而搜索引擎对此惘然无知,仍然按其旧有内容排序,将其作为搜索结果提供给用记,其用户体验度之糟糕不言而喻。所以对于已经爬取的网页,爬虫还要负责保持其内容和互联网页面内容的同步,这取决于爬虫所彩用的网页更新策略。网页更新策略的任务是要决定何时重新爬取之前已经下载过和网页,以尽可能使得本地下载网页和互联网原始页面内容保持一致。常用的网页更新策略有三种:历史参考策略,用户体验度策略和聚类抽样策略。

  说实话以上的多数策略对于一个高性能的通用爬虫至关重要,但是对于菜鸟级的入门级爬虫而言还很难很好的应用于实践。所以下边说几点入门级爬虫的爬取处理技巧:

  (1)限制域名,这对于多数垂直爬虫都应该考虑的,对于广告半边天的的互联网来说,如果你不想看到辛辛苦苦爬来的数据里边出现一大堆广告信息,这个处理是非常有效的。

  (2)加大列表页面的优先级,这根没啥好解释的,多数时候要爬取的精华都在此。

  (3)可以根据抓取测试结果对url做适当过滤,比如网站的一些子栏目不需要,可以直接将对应url前缀加入黑名单,抓取时直接跳过。

  暂时写这么多吧,感觉现在写的越来越水了,可能快毕业了有些烦躁。好好整理下思路,下次的滤重处理争取能写好。

转载于:https://www.cnblogs.com/good-temper/archive/2013/05/02/3053922.html


http://www.niftyadmin.cn/n/1636839.html

相关文章

C++-程序设计实现

当我们有一个新的idea或者拿到用户需求的时候,常常会对怎样将其转化为代码而感到困惑。到底程序要解决哪些问题?模拟那些场景?在本文中,我们一起探讨一些这个问题。 俗话说,未雨绸缪,而事半功倍。是的&…

一个高大上的SharedPreferences工具类——XPrefs

背景 SharedPreferences常用来存储一些轻量级的数据,SharedPreferences存储的就是一个key-value(键值对)。Sharedpreferences在日常的android开发中使用的应该算是挺频繁的,通常我们开发者为了存储一个key,都会在一个…

邻接表(无向图)

邻接表(无向图)转载于:https://www.cnblogs.com/LoveFishC/archive/2013/05/04/3846861.html

由拉钩app引起的故事

前言 很偶然的一个机会,在用拉钩app的时候发现了一个上拉加载更多的效果,就是列表到达最底部时继续上拉,底部文字会由点击加载变成松开载入。我感觉这个效果不错,所以给XRefreshView加了这个功能,先上图。 用法说明…

大大的蛋项目 第二篇 第三关

大大的蛋项目 第二篇 这个项目的UI要自动适应分辨率,我们采用了Unity3d自带的UI,对于GUI的自适应原则是这样的! GUI.matrix Matrix4x4.TRS(new Vector3(0, 0, 0), Quaternion.identity, new Vector3(m_fScaleWidth, m_fScaleHeight, 1)); 其…

让多种类型item的Recyclerview能够上拉和下拉刷新--XRefreshView

什么是XRefreshView XRefreshView是一款支持任何view上拉加载和下拉刷新的库,之所以说是任何view,是因为他不仅在内部适配了Recyclerview,abslistview,scrollview,webview等view,还提供了让你自己去判断vi…

深入理解 typedef 与 #define

无论是C,还是C,我们经常发现 typedef 关键字的身影。typedef 与 #define 有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了。 首先,看一下 typedef 的用法: 1、typedef用法总结…

Android实用的任务管理器—tractor

在平时的android开发工作中,我们经常需要执行耗时操作,有时为了用户体验还需要显示个等待框,我之前的做法都是开一个线程,然后用handler发消息进行显示和关闭等待框以及相关的ui操作。如果任务比较多的话,频繁的new Thread会让代码…