
1.3 网络爬虫的原理
1.3.1 网络爬虫概述
1.网络爬虫的定义
或许你不太了解网络爬虫(Web Crawler,简称爬虫),但一定很熟悉搜索引擎,我们几乎每天都在通过搜索引擎获取互联网信息。无论搜索引擎的功能多么强大,其基本工作原理并不复杂,我们总结如下:
1)在Web中广泛收集数据。
2)为数据建立倒排索引。
3)根据搜索词将相关结果排序后返回给用户。
其中第1步“收集数据”的工作就是由网络爬虫完成的。
网络爬虫不仅是搜索引擎的关键组件,在其他领域也有广泛应用。借助网络爬虫,语言学家可以下载大量文本以研究语言现象,销售人员可以搜集产品的价格和销量以分析市场行情,领域爱好者能够将某个网站或栏目的内容收藏到本地,AI研究者能够采集各类数据作为机器学习的素材。
网络爬虫是按照一定规则自动获取Web信息资源的计算机程序。对于网络爬虫的定义,可以从以下几个方面进行理解:
□ 爬虫这个称谓是一种形象的比喻,有时也被称为网络蜘蛛(Web Spider)或网络机器人(Web Robot)。
□ 关于运行环境,虽然Web不是因特网的全部,但网络爬虫主要是面向Web的,这是由Web资源的开放性和丰富性所决定的。
□ 关于爬虫规则,一方面指网络爬虫所采用的搜索策略(如深度优先、广度优先等),另一方面指网络爬虫要遵循的行业规范(如Robots协议)。
□ 关于存在形式,网络爬虫是能够执行数据采集任务的自动化程序,其具体形式既可以是可执行文件,也可以是某种脚本。
□ 关于抽取目标,网络爬虫通常会对原始Web数据进行二次抽取,以提高目标数据的结构化程度和价值密度。
2.爬虫的分类
根据数据采集的范围和精度不同,网络爬虫大致可分为“漫爬型”和“垂直型”:前者用于搜索引擎的广泛采集,也被称为通用爬虫(General Purpose Web Crawler);后者用于领域数据的精准采集,也被称为聚焦爬虫(Focused Web Crawler)。如图1-15所示,通用爬虫对网页中的所有超链接进行无差别搜索,得到一棵完整的生成树;聚焦爬虫则按照一定条件进行筛选,得到一棵被剪枝的生成树。

图1-15 两类网络爬虫的搜索路径
搜索引擎能够满足日常生活中的信息检索,却难以满足行业用户的需求。搜索引擎存在以下问题:
1)包含不相关的内容(如广告、推广等)。
2)包含内容重复的页面。
3)仅返回部分搜索结果。
这与行业用户对数据“查准、查全”的要求相去甚远。如何高效获取资源,解决信息不对称问题,已成为互联网信息利用的关键。面向特定主题和应用的爬虫是行业人员获取领域数据的重要工具,也是本书的主要研究对象。
网络爬虫还可从其他角度进行分类。根据目标资源的位置不同,网络爬虫可以分为浅层爬虫(Surface Web Crawler)和深层爬虫(Deep Web Crawler)。通过URL能够直接到达的数据为浅层数据(如静态页面),需要用户登录、提交表单或异步加载才能获得的数据为深层数据。研究发现,Web中的深层数据量远远超过浅层数据量,因此深层爬虫就显得十分重要。相比之下,浅层爬虫比较容易开发,而开发深层爬虫则需要更多的技术手段。
根据部署方式不同,网络爬虫可分为集中式爬虫和分布式爬虫。集中式爬虫运行在单台计算机上,可用于面向个人的中小规模数据采集;分布式爬虫能够实现在多台计算机上的协同爬取,可用于面向企业的大规模数据采集。
根据数据更新方式的不同,网络爬虫可以分为累积式爬虫(Cumulative Crawler)和增量式爬虫(Incremental Crawler)。累积式爬虫常用于数据集的整体建立或大规模更新,增量式爬虫主要针对数据集的日常维护与实时更新。
3.工作流程
网络爬虫涉及很多技术环节,必要技术包括Web访问、信息抽取、数据存储、爬虫控制等,可选技术包括多线程爬取、分布式部署、可视化编程、模拟浏览器、使用代理服务等。每个环节又包含很多技术细节,这些细节将在后续章节详细介绍。网络爬虫的基本工作流程如图1-16所示。

图1-16 网络爬虫的基本工作流程
爬虫的基本工作流程可描述为以下7个步骤:
1)初始化爬虫参数,将种子添加到URL队列。
2)判断URL队列是否为空,若不空则进入第3步,否则进入第7步。
3)从队列中取出下一个URL,访问其Web资源。
4)解析Web资源,根据条件抽取目标数据和扩展链接。
5)根据用户需要将目标数据保存到文件或数据库。
6)将符合条件的扩展链接补充到URL队列,转到第2步。
7)结束任务,退出爬虫。
在上述步骤中,种子可以是一个或多个,这是爬虫采集的起点。采集任务启动后将循环判断URL队列是否为空,在URL不断出列的同时又有新的补充,这样就实现了自动采集。目标数据和扩展链接的选取条件可在初始化模块中设置。
为了避免重复采集,我们通常借助一个Visited数组来记录那些已被访问的URL。随着爬虫任务的执行,Visited数组将会越来越大,直到所有符合条件的扩展链接都包含在其中,此时不会再有新的URL入列,URL队列最终将被清空。
爬虫的目标数据通常是对原始Web数据进一步抽取的结果(如文章的标题和正文、产品的款型和价格)。常见的抽取对象包括HTML数据、XML数据、JSON数据等。
1.3.2 Robots协议
网络爬虫排除协议(Robots Exclusion Protocol,简称Robots协议)用于告知网络爬虫允许抓取网站哪些内容,不允许抓取哪些内容。Robots协议内容通常以文本文件(robots.txt)的形式存放于网站根目录下,也可以在HTML文档的<meta>标签中进行描述。
1.通过robots.txt文件描述Robots协议
网站根目录下的robots.txt文件默认采用ASCII编码,其中描述了一系列Robots规则。不同网站的robots.txt文件的书写方式各不相同,百度(www.baidu.com)网站的robots.txt文件内容如图1-17所示。

图1-17 百度网站的robots.txt文件
百度网站的Robots协议指定了某些网络爬虫(如Baiduspider、Googlebot等)不允许抓取的资源(如/baidu、/s?、/home/news/data/等),除此之外的内容都可以抓取。搜狐(www.sohu.com)网站的robots.txt文件内容如图1-18所示。

图1-18 搜狐网站的robots.txt文件
搜狐网站的Robots协议指定了某些网络爬虫(如Baiduspider等)允许抓取的资源(如/a/*?*、/abroad_a/*?*、/picture/*?*等),除此之外的内容都不能抓取。由此可见,百度和搜狐所采取的爬虫排除策略恰好相反。
如果网站不存在robots.txt文件或者文件内容为空,则默认没有设置排除规则,网络爬虫可以访问站点的所有资源。如图1-19所示,网易网站的robots.txt文件内容即为空。

图1-19 网易网站的robots.txt文件
通过以上几个示例可见,robots.txt文件由若干字段构成,表1-13给出了robots.txt文件中的常用字段名及说明。
表1-13 robots.txt文件的常用字段及说明

(续)

下面通过几个简单例子来说明常见robots.txt内容的书写方法。
1)允许所有的爬虫访问所有内容,写法如下:

另一种写法如下:

2)仅允许特定爬虫访问所有内容,写法如下:

3)禁止所有爬虫访问网站的任何内容,写法如下:

4)禁止所有爬虫访问指定目录,写法如下:

5)禁止特定爬虫访问指定目录,写法如下:

6)禁止所有爬虫访问指定文件类型,写法如下:

Robots协议通过模式匹配字符串(Allow和Disallow字段值)定位URL。以斜杠“/”结尾时表示目录,否则表示文件。若希望单独定义网络爬虫对某个子目录的行为限制,可将相关设置合并到根目录下的robots.txt中。User-agent字段用于指定网络爬虫,常见的网络爬虫名称如表1-14所示。
表1-14 常见的网络爬虫名称

2.通过<meta>标签描述Robots协议
除了通过robots.txt文件描述之外,还可以通过HTML文档的<meta>标签描述Robots协议。前者用于描述整个站点对爬虫的访问限制,后者用于描述某个具体的页面。描述Robots协议的<meta>标签的基本形式如下:

标签的name属性用来指定爬虫名称(如name="Baiduspider"),若取值为Robots,则表示对所有网络爬虫有效。contect属性用于描述爬虫的操作权限,其可选取值如表1-15所示。
表1-15 contect属性的可选取值

这里的“检索”是指下载网页的内容,“查询”是指继续搜索页面中的链接。表1-15中的contect取值还可组合使用,以下代码表示本网页可检索、可查询:

上述代码相当于:

若contect="index,nofollow",则表示可检索、不可查询;若contect="noindex,nofollow",则表示不可检索、不可查询,相当于contect="none"。
说明:Robots协议只是一种行业约定,并不是法律规范,没有强制约束力。但需要强调的是,若进行商业用途的数据采集,无论是否使用网络爬虫、是否遵守Robots协议,哪怕采用手动复制的方式,都可能会侵犯他人知识产权,引发不正当竞争。
1.3.3 网络爬虫框架
国内外众多机构和个人已开发出多款爬虫工具软件,如Nutch、Heritrix、SOUP、ParseHub、GooSeeker、八爪鱼、火车头等。常用的爬虫框架包括WebCollector、Nutch、WebMagic、Heritrix、Scrapy和PySpider等。这些爬虫软件和框架极大地方便了人们对网络数据的获取,但具有以下局限性:
□ 有的爬虫功能相对单一,使用方式受限,可定制化程度不够。
□ 有的爬虫安装配置烦琐,框架结构复杂,使用门槛较高。
□ 有的爬虫采用封闭式框架,不提供开源代码,难以进行二次开发。
□ 有的爬虫抓取速度慢,解析和抽取能力弱,性能表现不佳。
总之,基于现有框架快速开发个性化爬虫仍然具有一定难度。因此,为开发者提供一个轻量级、模块化、免费开源、高效易用的网络爬虫框架就显得十分重要。
面向个性化需求的轻量级爬虫框架应当采用模块化设计,能够下载各类网络资源,并支持异步下载、编码检测、提交表单、压缩传输、使用代理等机制;能够解析和抽取HTML、XML、JSON等多种数据;能够提供灵活的爬虫控制方式,内置常用搜索算法;能够管理、分配线程资源和代理资源,支持分布式部署。根据上述需求,可设计如图1-20所示的爬虫框架,主要组件包括:控制器、下载器、解析器、线程池、代理池、分布式部署器和智能化工具包。

图1-20 轻量级爬虫框架
框架中的智能化工具包通过人机交互技术实现可视化模板配置,用户不必掌握Web专业知识就能完成模板配置,从而降低了爬虫的使用门槛;通过智能抽取技术实现对网页内容(如正文、日期、目录等)的自动抽取,进一步减少配置工作量;通过主题模型计算网页内容的相关度,从而提高主题爬虫的采集精度。
通常情况下,框架中的控制器、解析器、下载器为必选组件,其余为可选组件,用户可根据需要进行组装。爬虫框架的基本应用模式如图1-21所示。

图1-21 爬虫框架的应用模式
引入爬虫框架后,开发者只需编写几行代码即可完成对简单任务的爬取;对于较复杂的任务,亦可通过参数化定制或二次开发来实现。当需要规划新的爬虫路线时,开发者通常只需要重写控制器的相关方法,从而最大限度地复用框架功能。
上述框架具有高内聚、低耦合、可拼装、易使用的特点,能够有效降低使用门槛,简化配置流程,优化搜索路线,提高采集精度,从而提高爬虫的自动化、智能化水平。
爬虫框架中的重要模块将在后续章节中详细介绍,其中第3章重点介绍下载器,第4、5章重点介绍解析器,第7章重点介绍控制器,第8章重点介绍线程池,第9章重点介绍代理池。