python系列整理---爬虫

网络爬虫

一.基本概念

一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

1.1 网络爬虫分类

  网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的

  通用网络爬虫

  通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。 由于商业原因,它们的技术细节很少公布出来。 这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。 虽然存在一定缺陷,通用网络爬虫适用于为搜索引擎搜索广泛的主题,有较强的应用价值。

  通用网络爬虫的结构大致可以分为页面爬行模块 、页面分析模块、链接过滤模块、页面数据库、URL 队列、初始 URL 集合几个部分。为提高工作效率,通用网络爬虫会采取一定的爬行策略。 常用的爬行策略有:深度优先策略、广度优先策略。

1) 深度优先策略:其基本方法是按照深度由低到高的顺序,依次访问下一级网页链接,直到不能再深入为止。 爬虫在完成一个爬行分支后返回到上一链接节点进一步搜索其它链接。 当所有链接遍历完后,爬行任务结束。 这种策略比较适合垂直搜索或站内搜索, 但爬行页面内容层次较深的站点时会造成资源的巨大浪费。

2) 广度优先策略:此策略按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。 这种策略能够有效控制页面的爬行深度,避免遇到一个无穷深层分支时无法结束爬行的问题,实现方便,无需存储大量中间节点,不足之处在于需较长时间才能爬行到目录层次较深的页面。

  聚焦网络爬虫

  聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫[8]。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求。

  聚焦网络爬虫和通用网络爬虫相比,增加了链接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。

1) 基于内容评价的爬行策略:DeBra将文本相似度的计算方法引入到网络爬虫中,提出了 Fish Search 算法,它将用户输入的查询词作为主题,包含查询词的页面被视为与主题相关,其局限性在于无法评价页面与主题相关 度 的 高 低 。 Herseovic对 Fish Search 算 法 进 行 了 改 进 ,提 出 了 Sharksearch 算法,利用空间向量模型计算页面与主题的相关度大小。

2) 基于链接结构评价的爬行策略 :Web 页面作为一种半结构化文档,包含很多结构信息,可用来评价链接重要性。 PageRank 算法最初用于搜索引擎信息检索中对查询结果进行排序,也可用于评价链接重要性,具体做法就是每次选择 PageRank 值较大页面中的链接来访问。 另一个利用 Web结构评价链接价值的方法是 HITS 方法,它通过计算每个已访问页面的 Authority 权重和 Hub 权重,并以此决定链接的访问顺序。

3) 基于增强学习的爬行策略:Rennie 和 McCallum 将增强学习引入聚焦爬虫,利用贝叶斯分类器,根据整个网页文本和链接文本对超链接进行分类,为每个链接计算出重要性,从而决定链接的访问顺序。

4) 基于语境图的爬行策略:Diligenti 等人提出了一种通过建立语境图(Context Graphs)学习网页之间的相关度,训练一个机器学习系统,通过该系统可计算当前页面到相关 Web 页面的距离,距离越近的页面中的链接优先访问。印度理工大学(IIT)和 IBM 研究中心的研究人员开发了一个典型的聚焦网络爬虫。 该爬虫对主题的定义既不是采用关键词也不是加权矢量,而是一组具有相同主题的网页。 它包含两个重要模块:一个是分类器,用来计算所爬行的页面与主题的相关度,确定是否与主题相关;另一个是净化器,用来识别通过较少链接连接到大量相关页面的中心页面。

  增量式网络爬虫

  增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增 量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。 和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。增量式网络爬虫的体系结构[包含爬行模块、排序模块、更新模块、本地页面集、待爬行 URL 集以及本地页面URL 集。

  增量式爬虫有两个目标:保持本地页面集中存储的页面为最新页面和提高本地页面集中页面的质量。 为实现第一个目标,增量式爬虫需要通过重新访问网页来更新本地页面集中页面内容,常用的方法有:1) 统一更新法:爬虫以相同的频率访问所有网页,不考虑网页的改变频率;2) 个体更新法:爬虫根据个体网页的改变频率来重新访问各页面;3) 基于分类的更新法:爬虫根据网页改变频率将其分为更新较快网页子集和更新较慢网页子集两类,然后以不同的频率访问这两类网页。

  为实现第二个目标,增量式爬虫需要对网页的重要性排序,常用的策略有:广度优先策略、PageRank 优先策略等。IBM 开发的 WebFountain是一个功能强大的增量式网络爬虫,它采用一个优化模型控制爬行过程,并没有对页面变化过程做任何统计假设,而是采用一种自适应的方法根据先前爬行周期里爬行结果和网页实际变化速度对页面更新频率进行调整。北京大学的天网增量爬行系统旨在爬行国内 Web,将网页分为变化网页和新网页两类,分别采用不同爬行策略。 为缓解对大量网页变化历史维护导致的性能瓶颈,它根据网页变化时间局部性规律,在短时期内直接爬行多次变化的网页 ,为尽快获取新网页,它利用索引型网页跟踪新出现网页。

  Deep Web 爬虫

Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可访问信息容量是 Surface Web 的几百倍,是互联网上最大、发展最快的新型信息资源。

Deep Web 爬虫体系结构包含六个基本功能模块 (爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源。

Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:

1) 基于领域知识的表单填写:此方法一般会维持一个本体库,通过语义分析来选取合适的关键词填写表单。 Yiyao Lu[25]等人提出一种获取 Form 表单信息的多注解方法,将数据表单按语义分配到各个组中 ,对每组从多方面注解,结合各种注解结果来预测一个最终的注解标签;郑冬冬等人利用一个预定义的领域本体知识库来识别 Deep Web 页面内容, 同时利用一些来自 Web 站点导航模式来识别自动填写表单时所需进行的路径导航。

2) 基于网页结构分析的表单填写: 此方法一般无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各字段值。 Desouky 等人提出一种 LEHW 方法,该方法将 HTML 网页表示为DOM 树形式,将表单区分为单属性表单和多属性表单,分别进行处理;孙彬等人提出一种基于 XQuery 的搜索系统,它能够模拟表单和特殊页面标记切换,把网页关键字切换信息描述为三元组单元,按照一定规则排除无效表单,将 Web 文档构造成 DOM 树,利用 XQuery 将文字属性映射到表单字段。

Raghavan 等人提出的 HIWE 系统中,爬行管理器负责管理整个爬行过程,分析下载的页面,将包含表单的页面提交表单处理器处理,表单处理器先从页面中提取表单,从预先准备好的数据集中选择数据自动填充并提交表单,由爬行控制器下载相应的结果页面

1.2 网页搜索策略

网页的抓取策略可以分为深度优先、广度优先和最佳优先三种。深度优先在很多情况下会导致爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。

  广度优先搜索

   广度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。该算法的设计和实现相对简单。在目前为覆盖尽可能多的网页,一般使用广度优先搜索方法。也有很多研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是认为与初始URL在一定链接距离内的网页具有主题相关性的概率很大。另外一种方法是将广度优先搜索与网页过滤技术结合使用,先用广度优先策略抓取网页,再将其中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。

  最佳优先搜索

  最佳优先搜索策略按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问经过网页分析算法预测为“有用”的网页。存在的一个问题是,在爬虫抓取路径上的很多相关网页可能被忽略,因为最佳优先策略是一种局部最优搜索算法。因此需要将最佳优先结合具体的应用进行改进,以跳出局部最优点。将在第4节中结合网页分析算法作具体的讨论。研究表明,这样的闭环调整可以将无关网页数量降低30%~90%。

  深度优先搜索

  深度优先搜索策略从起始网页开始,选择一个URL进入,分析这个网页中的URL,选择一个再进入。如此一个链接一个链接地抓取下去,直到处理完一条路线之后再处理下一条路线。深度优先策略设计较为简单。然而门户网站提供的链接往往最具价值,PageRank也很高,但每深入一层,网页价值和PageRank都会相应地有所下降。这暗示了重要网页通常距离种子较近,而过度深入抓取到的网页却价值很低。同时,这种策略抓取深度直接影响着抓取命中率以及抓取效率,对抓取深度是该种策略的关键。相对于其他两种策略而言。此种策略很少被使用。

1.3 网络爬虫爬行策略

下述的三种网络特征,造成了设计网页爬虫抓取策略变得很难:

  Ø 巨大的数据量;

  Ø 快速的更新频率;

  Ø 动态页面的产生;

  正如爱德华等人所说的:“用于检索的带宽不是无限的,也不是免费的;所以,如果引入衡量爬虫抓取质量或者新鲜度的有效指标的话,不但伸缩性,连有效性都将变得十分必要”(爱德华等人,2001年)。一个爬虫就必须小心的选择下一步要访问什么页面。网页爬虫的行为通常是四种策略组合的结果。

♦ 选择策略,决定所要下载的页面;

♦ 重新访问策略,决定什么时候检查页面的更新变化;

♦ 平衡礼貌策略,指出怎样避免站点超载;

♦ 并行策略,指出怎么协同达到分布式抓取的效果;

  选择策略

  没有一个搜索引擎抓取的内容达到网络的16%(劳伦斯河盖尔斯,2001)。

网络爬虫通常仅仅下载网页内容的一部分,但是大家都还是强烈要求下载的部分包括最多的相关页面,而不仅仅是一个随机的简单的站点。这就要求一个公共标准来区分网页的重要程度。

一个页面的重要程度与他自身的质量有关,与按照链接数、访问数得出的受欢迎程度有关,甚至与他本身的网址(后来出现的把搜索放在一个顶级域名或者一个固定页面上的垂直搜索)有关。设计一个好的搜索策略还有额外的困难,它必须在不完全信息下工作,因为整个页面的集合在抓取时是未知的。

  重新访问策略

  网络具有动态性很强的特性。

抓取网络上的一小部分内容可能会花费真的很长的时间,通常用周或者月来衡量。当爬虫完成它的抓取的任务以后,很多操作是可能会发生的,这些操作包括新建,更新和删除。从搜索引擎的角度来看,不检测这些事件是有成本的,成本就是我们仅仅拥有一份过时的资源。

  最常使用的成本函数,是新鲜度和过时性。

    新鲜度:这是一个衡量抓取内容是不是准确的二元值。

    过时性:这是一个衡量本地已抓取的内容过时程度的指标。

爬虫的目标是尽可能高的提高页面的新鲜度,同时降低页面的过时性。这一目标并不是完全一样的,第一种情况,爬虫关心的是有多少页面时过时的;在第二种情况,爬虫关心的页面过时了多少。

  两种最简单的重新访问策略

统一策略:使用相同的频率,重新访问收藏中的所有的链接,而不考虑他们更新频率。

正比策略:对变化越多的网页,重新访问的频率也越高。网页访问的频率和网页变化的频率直接相关。

  (两种情况下,爬虫的重新抓取都可以采用随机方式,或者固定的顺序)

Cho和Garcia-Molina证明了一个出人意料的结果。以平均新鲜度方式衡量,统一策略在模拟页面和真实的网络抓取中都比正比策略出色。对于这种结果的解释是:当一个页面变化太快的时候,爬虫将会将会在不断的尝试重新抓取而浪费很多时间,但是却还是不能保证页面的新鲜度。为了提高页面的新鲜度,我们应该宣判变化太快的页面死罪(Cho和Garcia-Molina,2003a)。

  最佳的重新访问策略既不是统一策略,也不是正比策略;保持平均页面新鲜度高的最佳方法策略包括忽略那些变化太快的页面,而保持页面平均过时性低的方法则是对每一页按照页面变化率单调变化的策略访问。两种情况下,最佳的策略较正比策略,都更接近统一策略。正如Coffman等人(Edward G.Coffman,1998)所注意到的:“为了最小化页面过时的时间,对任一个页面的访问都应该尽可能的均匀间隔地访问。”对于重新访问的详尽的策略在大体上是不可以达到的,但是他们可以从数学上得到,因为他们依赖于页面的变化。(Cho和Garcia-Molina,2003a)指出指数变化是描述页面变化的好方法,同时(Ipeirotis等人,2005)指出了怎么使用统计工具去发现适合这些变化的参数。注意在这里的重新访问策略认为每一个页面都是相同的(网络上所有的页面价值都是一样的)这不是现实的情况,所以,为了获取更好的抓取策略,更多有关网页质量的信息应该考虑进去。

  平衡礼貌策略

爬虫相比于人,可以有更快的检索速度和更深的层次,所以,他们可能使一个站点瘫痪。不需要说一个单独的爬虫一秒钟要执行多条请求,下载大的文件。一个服务器也会很难响应多线程爬虫的请求。

  就像Koster(Koster,1995)所注意的那样,爬虫的使用对很多工作都是很有用的,但是对一般的社区,也需要付出代价。使用爬虫的代价包括:

  Ø 网络资源:在很长一段时间,爬虫使用相当的带宽高度并行地工作。

  Ø 服务器超载:尤其是对给定服务器的访问过高时。

  Ø 质量糟糕的爬虫,可能导致服务器或者路由器瘫痪,或者会尝试下载自己无法处理的页面。个人爬虫,如果过多的人使用,可能导致网络或者服务器阻塞。

  对这些问题的一个部分解决方法是漫游器排除协议(Robots exclusion protocol),也被称为robots.txt议定书(Koster,1996),这份协议对于管理员指明网络服务器的那一部分不能到达是一个标准。这个标准没有包括重新访问一台服务器的间隔的建议,虽然访问间隔是避免服务器超载的最有效的办法。最近的商业搜索软件,如Ask Jeeves,MSN和Yahoo可以在robots.txt中使用一个额外的 “Crawl-delay”参数来指明请求之间的延迟。

  对于那些使用爬虫用于研究目的的,一个更详细的成本-效益分析是必要的,当决定去哪一个站点抓取,使用多快的速度抓取的时候,伦理的因素也需要考虑进来。访问记录显示已知爬虫的访问间隔从20秒钟到3-4分钟不等。需要注意的是即使很礼貌,采取了所有的安全措施来避免服务器超载,还是会引来一些网络服务器管理员的抱怨的。

  并行策略

  一个并行爬虫是并行运行多个进程的爬虫。它的目标是最大化下载的速度,同时尽量减少并行的开销和下载重复的页面。为了避免下载一个页面两次,爬虫系统需要策略来处理爬虫运行时新发现的URL,因为同一个URL地址,可能被不同的爬虫进程抓到。

二.网络爬虫体系结构

结构图

 python系列整理---爬虫

流程图

 python系列整理---爬虫

1.1 引擎---主方法

  1.2 调度模块

  1.3 下载模块

    1.3.1下载中间件

    1.3.2 下载中心

      三种下载方式
      并发下载
      上传与下载管理

  1.4 上下文管理器

    1.4.1 url管理器

    1.4.2 file管理器

    1.4.3 全局变量作为上下文管理器

  1.5 解析模块

    1.5.1 使用工厂模式作为解析中间件

    1.5.2 工厂函数调用

    涉及对工厂函数的调用,同时要关注解析过程中的上下文信息同步储存问题

    1.5.3 动态网页和静态网页

    正则解析

    Xpath定位解析

    选择器定位接

  1.6 存储模块

    1.6.1数据库接口封装

    1.6.2按功能区分

  1.7 数据清洗

  1.8 其他应用

    1.8.1 日志与报表

    1.8.2 文件配置

    1.8.3 按功能封装常见应用

2. 常见问题

  2.1 爬取效率

    2.1.1 动态页面加载

    2.1.2 bs4的解析器性能

    2.1.3 结构化数据解析策略

  2.2 数据库优化

  2.3 高并发问题

    2.3.1 大量网页并发解析问题

    2.3.2 频繁并发访问数据库

  2.4 爬虫分布式与负载均衡

  核心在于物理机制上的数据共享。

  2.5 网页乱码和压缩网页问题

    2.5.1 内容乱码即解码再编码

      检查网页内容的编码格式,查看html中的charset字段

    2.5.2 网页压缩

    info = response.info()

    # 判断返回的code,如果不是200,则返回空

    if code == 200:

          html = response.read()

          if ("Content-Encoding" in info) and (info[‘Content-Encoding‘] == "gzip"):

              html = zlib.decompress(html, 16 + zlib.MAX_WBITS);

      或者url格式编码后的html

      html[:3] == u‘%1F%8B%08‘:

           html = zlib.decompress(html, 16 + zlib.MAX_WBITS)

3. 反反爬虫策略(下载平台核心解决问题)

  3.1 常用手段

    3.0.1  Header设置

      User-Agent
      Reffer
      Cookie

    3.0.2  代理池机制

    3.0.3  随时延时机制

    3.0.4  模拟浏览器(自动化工具)

  3.2 其他手段

    3.2.1 IP池分布式下载机制

    主要用于集群式下载系统,同时常用反反爬虫手段并用

    3.2.2 账号登录

    自动化工具模拟登录

      使用cookie手段

    强制性破解(该方法需要较强的侦查手段,暂无介绍)

相关推荐