第5章互联网数据采集 本章学习目标  了解爬虫概念、爬行策略、Robots协议等基础知识;  掌握各种网络爬虫方法;  熟练掌握爬虫工具使用方法;  能够运用Python语言编写爬虫软件。 随着网络的飞速发展,网络已经成为世界上最大的信息载体,每天都有大量的新数据涌入网络。因此,如何从网络中提取出有效的信息并加以利用,是开发人士面对的新课题。互联网中大量的相关信息可以反映用户的偏好倾向、事件发展趋势等。更重要的是,互联网数据以共享开放的形式存储在互联网中,这意味着互联网数据收集的成本往往更低。因此,相关互联网数据的采集与整合几乎成为大数据项目建设的必然选择。从网络中自动抓取信息的最常见、最有效的方法是使用网络爬虫。 微课视频 5.1网络爬虫概述 随着大数据时代的来临,我们每天面对的数据数不胜数,为了在繁多数据中找到有效的内容,网络爬虫扮演着越来越重要的角色。互联网中的数据是海量的。如何从这些海量信息中自动、高效地获取用户感兴趣的内容,是互联网数据行业面临的重要问题,网络爬虫技术正是为解决这些问题而诞生的。 5.1.1网络爬虫的基本概念 〖*2〗1. 互联网数据采集面临的困难和挑战 如何在蕴含海量信息的互联网中采集到自己感兴趣的数据,将面临以下的困难和挑战。 (1) 每个门户网站的建设水平不同,每个网站的结构往往因用户体验不同而不同,这意味着通过统一的方法从互联网上收集数据几乎是不可能的。 (2) 互联网数据的结构一般比较复杂,通常以文本、表格、图片、视频等非结构化形式存在,这也给互联网数据的采集带来了挑战和困难。 (3) 大型互联网公司,如百度,总数据量超过1000PB,覆盖中文网页、百度视频、百度日志等部分,拥有70%以上的中文搜索市场。对于如此海量的数据集,需要研究分布式架构来满足其采集需求。 (4) 对于需要从网页获取的互联网数据,可以通过网络爬虫程序自动获取数据,但由于对爬虫程序的监管,不同的网站往往会设置很多障碍,从而增加了互联网数据采集的难度。 2. 网络爬虫的定义 互联网数据的收集通常是借助网络爬虫来完成的。“网络爬虫”(简称爬虫)就是定向或不定向地按照一定的规则,对互联网上的网页数据进行抓取的程序或脚本。抓取网页数据的一般方法是定义一个入口页面,这个页面一般会包含指向其他页面的URL,所以从当前页面获取这些URL,添加到爬虫的爬行队列中,进入新页面后再递归进行上述操作。爬虫数据收集方法可以从网页中提取非结构化数据,将其存储为一个统一的本地数据文件,并以结构化的方式存储。支持图片、音频、视频等文件或附件等各式的信息,附件可以自动与正文关联。 该技术被广泛应用于互联网搜索引擎、信息收集、舆情监测等方面,以获取或更新这些网站的内容和检索方式。同时,这项技术还可以自动收集所有可访问的页面内容,供搜索引擎进一步处理,使用户能够更快地检索到自己需要的信息。 3. 网络爬虫的基本原理 网络爬虫通过网页中的一些超链接信息,辅以一定的算法,按照一定的规则自动采集其所能访问的所有页面内容,为搜索引擎和大数据分析提供数据源,网络爬虫一般具有数据采集、数据处理和数据存储三大功能。 网络爬虫一般从一个或多个初始URL下载网页内容,然后通过搜索或内容匹配的方式获取网页中感兴趣的内容。同时,从当前页面中不断提取新的URL,依照爬虫策略按一定顺序放入待爬取的URL队列中。整个过程循环执行,直到满足系统相应的停止条件,然后对捕获的数据进行清洗、整理、索引并存入数据库或文件中。最后根据查询需要,从数据库或文件中提取相应的数据,以文本或图表的形式显示出来。 4. 网络爬虫的应用 网络爬虫应用广泛。常见的应用包括: (1) 抓取网站上的图片,重点浏览。 (2) 抓取相关财务信息,进行投资分析。 (3) 从多个新闻网站上爬取新闻信息,集中阅读。 (4) 利用爬虫对相应网页上的信息进行爬取,自动过滤网页中的广告,方便信息的阅读和使用。 (5) 使用爬虫,可以设置相应的规则,从网上自动收集目标用户的公开信息,便于营销。 (6) 抓取网站用户活跃度、发言次数、热门文章等信息,进行相关分析。 网络爬虫的本质,是一种自动抓取网页的程序,是搜索引擎的重要组成部分。 5. 网络爬虫算法 网络爬虫算法定义爬取范围、如何过滤重复页面等爬行策略的要求和规则。根据不同的目的,选择不同的爬虫算法,爬虫的运行效率和得到的结果也会不同。 1) 基于网络拓扑的分析算法 该算法的思想是,基于网页之间的链接(网络拓扑),对与已知网页有直接或间接链接关系的对象(可以是网页或网站等)作出评价,然后确定爬取的范围和顺序。该算法有三种不同的类型,分别是网页粒度、网站粒度和网页块粒度。 2) 基于网页内容的分析算法 该算法是指利用网页内容(文本、数据等资源)的特征,对网页进行评价,然后确定爬取的范围和顺序。网页的内容已经从超文本发展到动态页面(或隐藏Web)数据,后者的数据量大约是直接可见页面数据(PIW,公共索引Web)的400~500倍。除此之外,多媒体产生的数据、Web服务等形式的网络资源日益丰富。因此,这种算法已经从最初单纯的网页文本检索,发展到包括网页数据抽取、机器学习、数据挖掘、语义理解等多方面的综合应用。根据网页数据加载的不同形式,可以将算法分为以下三类: 第一类,针对文本和超链接为主的非结构化或简单网页; 第二类,针对结构化数据源动态生成的网页,这种页面的数据不能直接批量访问; 第三类,介于前两种之间,具有良好的结构,遵循一定的模式和规律,可以直接访问的网页。 5.1.2网络爬虫的爬行策略 在使用网络爬虫时,URL队列是一个非常重要的部分,待抓取队列中的URL按什么顺序排列是一个非常重要的问题,这就涉及网络爬虫的抓取策略。 网络爬虫的抓取策略是指,在使用爬虫系统时,待抓取URL队列中URL排序的方法。不同的网页抓取策略会对应不同的网页抓取算法,抓取效率会根据算法不同有所不同。常见的爬虫抓取策略有深度优先策略、广度优先策略、本地PageRank策略、OPIC策略、大站优先策略、反向链接数策略和最佳优先搜索策略。 1. 深度优先策略 图51网页链接关系示意图 深度优先策略是按照深度从低到高的顺序,逐一访问下一层的网页链接,直到无法打开下一层的网页链接为止。在完成一个爬行分支后,爬虫返回到上一个链接节点,进一步搜索其他分支的链接。当遍历所有链接时,爬网任务结束。例如,见图51的网页链接关系,根据深度优先策略,爬虫的爬行顺序为A→B→D→E→I→C→F→G→H。 深度优先策略更适合垂直搜索或站内搜索,但当爬行页面包含的内容层次较深时,会造成巨大的资源浪费。 2. 广度优先策略 广度优先策略是按照广度优先的搜索思想,逐层抓取URL池中每个URL的内容,并将每一层的URL添加到URL池中,按照广度优先策略继续遍历。图51的Web链接关系,按照广度优先策略的爬行顺序为A→B→C→D→E→F→G→H→I。由此可见,这种策略属于盲目搜索。它不考虑结果的可能位置,只对整个网络进行彻底搜索,效率较低。但是,若想要覆盖尽可能多的网页,广度优先是一个较好的选择。这个策略多用在主题爬虫中,因为网页离初始URL越近,它的主题相关性就越大。 3. 局部Page Rank策略 本地Page Rank策略基于Page Rank的思想,根据一定的网页分析算法,预测候选URL与目标页面的相似度,或者与主题的相关性,选择一个或几个评价最好的URL进行抓取,即将下载的网页与要抓取的URL队列中的URL一起组成一个网页集,计算每个页面的Page Rank值。计算结束后,将URL队列中待抓取的URL按照Page Rank的大小排列,按顺序抓取页面。但由于网络中广告链接和作弊链接的存在,这种策略容易导致Page Rank的值不能完全描述其重要性,从而导致捕获的数据无效。 4. OPIC策略 OPIC(Online Page Importance Computation)策略实际上是一个页面的重要性评分。在开始时,所有页面都被给予相同的初始“现金”(cash)。当一个页面P被下载时,P的“现金”被分配给从P解析出的所有链接,P的“现金”被清空。要爬网的URL队列中的所有页面必须根据“现金”的数量进行排序。与Page Rank相比,Page Rank每次都需要迭代计算,而OPIC策略不需要迭代过程。因此,OPIC计算速度明显比局部Page Rank策略快,是一种更好的重要性度量策略,适用于实时计算场景。 5. 大站优先策略 大站优先策略是指将URL队列中所有要抓取的网页按照其网站进行分类。对于需要下载页面数量较多的网站,会优先下载。因为大型网站往往包含的页面较多,往往著名企业的网页质量就更高,这种策略会倾向优先加载大型网站。大量的实际应用表明该策略优于深度优先策略。 6. 反向链接数策略 反向链接数指一个网页被其他网页指向的链接数量,表示网页内容被其他网页推荐的程度。受推荐和认可的指数越高,则被指向的链接数越多,因此很多时候,搜索引擎也会参考这个指标来评估网页的重要性,从而决定不同网页的抓取顺序。 7. 最佳优先搜索策略 最佳优先搜索策略根据一定的网页分析算法,预测候选URL与目标网页的相似度,选择一个或几个备选URL进行抓取。该策略并不会访问所有网页,而只访问被算法预测为“有用”的页面。因为最佳优先级策略是一种局部最优搜索算法,使用这种策略时,许多相关网页可能会被忽略。因此,并不推荐单一使用最佳优先搜索策略,一般都将最佳优先级与具体应用相结合进行改进,才能跳出局部最优。 在实际应用中,通常会结合几种策略来捕获网络信息。例如,百度蜘蛛的抓取策略是以广度优先策略为主,辅以局部Page Rank策略。 5.1.3Web更新策略 Internet中的网页信息是经常更新的,网页更新后,网络爬虫必须对这些网页重新进行爬取。然而,互联网中网页信息的更新速度并不统一; 如果网页更新太慢,网络爬虫太频繁,必然会增加爬虫和Web服务器的压力; 如果网页更新较快,但抓取时间间隔较长,则抓取的内容不能真实反映网页的信息。由此可见,网页的更新率与爬虫的更新率越接近,爬虫的效果就越好。当然,在爬虫服务器资源有限的情况下,爬虫还需要根据相应的策略,使不同的网页具有不同的更新优先级,更新优先级较高的网页会得到更快的抓取响应。 常见的网页更新策略如下。 1. 用户体验策略 通常在搜索引擎查询一个关键词时,结果中会给出大量的网页,这些网页会按照一定的规则进行排名。大多数用户只会关注排名靠前的网页。因此,在服务器资源有限的情况下,爬虫策略会优先更新排名靠前的网页。这种更新策略以用户体验为优先参考,被称为用户体验策略。 在用户体验策略中,爬虫程序会保留相应网页的多个历史版本,并根据多个历史版本的内容更新、搜索质量影响、用户体验等信息进行相应分析,确定这些网页的抓取周期。 2. 历史数据策略 历史数据策略是根据网页的历史更新数据,采用泊松分布建模的方法预测网页的下次更新时间,从而确定网页的下次抓取时间,即更新周期。 以上两种策略都需要历史数据作为依据。但如果一个网页是新的网页,就不会有相应的历史数据,爬虫服务器就需要采用新的更新策略。比较常见的策略是聚类分析策略。 3. 聚类分析策略 聚类分析策略是将聚类分析算法应用于爬虫更新网页的策略。其基本原理是对大量的网页进行聚类(即根据相似度进行分类)。一般来说,类似网页的更新率是差不多的。聚类后,这些海量网页会被划分为多个类,每个类中的网页具有相似的属性,即它们一般具有相似的更新频率。然后对聚类结果中每个类中的网页进行采样,计算采样网页的平均更新频率,从而确定每个集群的网页抓取频率,见图52。 图52爬虫频率聚类分析策略 在图52中,利用一定的聚类算法将大量的网页划分为K个聚类(K是由聚类算法确定的)。在图52的K个簇中,每个集群具有相似的更新频率。然后对每个聚类进行采样,提取一些网页,计算这些网页的平均更新频率。最后将每个集群的平均更新频率确定为该集群中所有网页的爬虫频率。 根据网页的更新策略,爬虫可以更高效地执行,执行逻辑更合理。 5.1.4robots协议 〖*2〗1. robots协议简介 robots是网站和爬虫之间的协议。它以简单直接的txt格式文本告诉相应爬虫的允许权限,即robots.txt是在搜索引擎中访问网站时首先要查看的文件。爬取某站点信息时,首先在根目录检查是否存在robots.txt; 如果存在,搜索机器人会根据文件内容确定访问范围; 如果该文件不存在,所有爬虫将能够访问网站上所有不受密码保护的页面。 robots.txt是存储在网站根目录中的ASCII编码文本文件。它通常会告诉网络搜索引擎的爬虫,网站中哪些内容是爬虫无法获取的,哪些内容是爬虫可以获取的。由于某些系统中的URL区分大小写,robots.txt的文件名应该统一使用小写。robots.txt应该放在网站的根目录上。 robots协议不是规范,只是约定,因此不能保证网站的隐私性。注意,robots.txt使用字符串比较来确定是否获取URL,因此,目录末尾带有或不带有斜杠“/”的目录,指示的是两个不同的URL,不能使用“disallow: *.gif”等通配符。 2. robots协议的使用技巧 (1) 每当用户试图访问一个不存在的URL时,服务器就会记录一个404错误(文件找不到)。每当访问一个不存在robots.txt文件的网站时,服务器也会记录一个404错误,所以应该在网站上添加一个robots.txt文件。 (2) 一般要让爬虫远离某些服务器上的目录——以保证服务器性能,如大多数网站服务器都有程序存储在cgibin目录中,所以在robots.txt文件中添加disallow:/cgibin是个不错的主意,这样可以避免索引所有程序文件,节省服务器资源,一般网站中不需要爬取的文件有: 后台管理文件、程序脚本、编码文件、样式表文件、模板文件、导航图片和背景图片等。 (3) 如果你的网站是一个动态页面,并且你已经为搜索爬虫创建了这些动态页面的静态副本以便更容易地进行爬取,那么你需要在robots.txt文件中进行设置,防止动态页面被爬虫索引,以确保这些页面被认为包含重复内容。 (4) robots.txt文件也可以直接在站点地图文件中包含一个链接http://www.***.com/sitemap.xml。 目前支持这项搜索引擎公司包括谷歌、雅虎、Ask和MSN。这样做的好处是,网站管理员不需要将他的站点地图文件,提交给每个搜索引擎的网站管理员,搜索引擎会抓取robots.txt文件,读取其中的站点地图路径,然后抓取链接的网页。 (5) 适当使用robots.txt文件也可以避免访问错误,比如搜索者不能直接进入购物车页面,因为购物车没有被收录的理由,所以可以在robots.txt文件中设置,防止搜索者直接进入购物车页面。 3. robots.txt文件格式 robots.txt文件包含一个或多个由空行分隔的记录(以CR、CR/NL或NL终止),每个记录的格式如下: "