
3.4 网络爬虫
3.4.1 爬虫简介
1.搜索引擎存在的问题
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。传统的搜索引擎AltaVista,Yahoo!和Google等存在着一定的局限性,如:
1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
3)随着万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
为了解决上述问题,定向抓取相关网页资源的爬虫技术应运而生。爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择地访问万维网上的网页与相关的链接,获取所需要的信息。与搜索引擎不同,爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
2.网络爬虫的组成
Python爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器和应用程序(爬取的有价值数据)。
调度器:相当于一台计算机的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,即通过内存、数据库、缓存数据库来实现。
网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块),包括需要登录、代理、Cookie和Requests(第三方包)。
网页解析器:将一个网页字符串进行解析,可以按照要求来提取出有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常困难)、html.parser(Python自带的)、BeautifulSoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析xml和HTML),html.parser、BeautifulSoup以及lxml都是以DOM树的方式进行解析的。
应用程序:就是从网页中提取的有用数据组成的一个应用。
图3.8说明调度器是如何协调工作的。

图3.8 调度器协调工作原理
网络爬虫的基本工作流程如下:
1)首先选取一部分精心挑选的种子URL。
2)将这些URL放入待抓取URL队列。
3)从待抓取URL队列中取出待抓取的URL,解析DNS,得到主机的IP,并将URL对应的网页下载下来,存储在已下载网页库中。此外,将这些URL放入已抓取URL队列。
4)分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。