在信息技术的飞速发展的今天,大数据的应用无处不在,对社会的生产和生活产生了深远的影响。在大数据时代,互联网作为最庞大的数据集合每天产生的数据量都在呈指数增长,而互联网上海量的公开数据已经成为最有用的数据资源。无论是对数据进行简单分析还是深入研究,抑或对数据进行预测或者可视化,这一切的基础都是需要先获得数据[1]。数据采集是数据处理流程里的首个环节,而爬取网页又是数据采集的首要工作,爬取可以用来收集整个网络的具体信息,然后跟踪链接找到需要的页面。笔者从网络爬虫的工作原理出发,分析和实现了主要爬取策略,对比不同策略的运行特点,为优化和深入研究网络爬虫奠定条件。
1网络爬虫的工作原理及过程
网络爬虫是一种自动提取网页的程序,它可以自动爬取海量网页,抓取目标信息并存储,同时也是搜索引擎的核心组成部分。通用网络爬虫运行时最先从选取一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,循环执行直到满足系统的一定条件后停止[2]。通用网络爬虫爬取的路径如同网络有向图,每个网页可以通过URL链接起来,所以每个URL链接类似有向图中的弧。通用网络爬虫的每个任务都会有一定的搜索策略,在搜索策略中会从某个节点出发,在整个有向图中遍历,爬取过程会把网页的链接提取出来以备继续爬取,同时可以按照抓取规则提取网页信息并保存起来。网络爬虫的工作原理流程,如图1所示。
2网络爬虫的分类
网络爬虫按照实现的技术主要分为通用网络爬虫(generalpurposewebcrawler)和主题网络爬虫(topicalcrawler),在这两类爬虫基础上进行细化和深入分析,又可以进一步实现增量式网络爬虫、深层网络爬虫等依据具体需求生成的爬虫类型。通用网络爬虫的目标在整个互联网中,爬虫从种子URL开始访问网页,采集当中所有超链接。为了防止获取重复的URL,将爬取到的网页信息存储在原始数据库或队列中,然后对网页进行解析,并根据网页搜索策略爬取新URL。重复上述过程,直到采集到的URL符合停止条件,则完成整个采集流程。通用网络爬虫的运行原理是主题网络爬虫的基础,主题网络爬虫可以按照需要的信息目标明确的进行采集,初始URL的获取是基于对抓取目标的定义以及相关的描述,爬虫将定位在互联网中与主题相关的页面中,解析网页来根据网页搜索策略预测链接的主题相关度,并确定继续爬取的URL优先级。主题网络爬虫关注与主题相关页面,更多应用于垂直搜索领域。通用网络爬虫是以完成采集更多的网页信息为目标的,适合不关心主题而针对指定的一个或几个网站进行爬取具有较好的效果,特别当有需求从一些官方权威大型网站爬取数据时,在网站内部采用通用网络爬虫,就可以收集到与该网站相关的大量网页和信息。在需要特定数据源背景下,例如需要采集空气质量监测指数、疾病预防控制情况数据等信息,为大数据处理的分析预测进行准备时,就可以采用通用爬虫的网页爬取策略。
3网络爬虫关键技术分析
常用的网页爬取策略主要包括深度优先搜索策略(Depth-First-Search)、广度优先搜索策略(Breadth-First-Search)、最佳优先搜索策略(Best-First-Search),更多的爬取策略都是在这3种策略基础上改进而来的。主题爬虫主要采用的是最佳优先搜索策略[3],以获得与主题相关性最优的URL进行爬取。通用爬虫的爬取策略以深度优先搜索策略和广度优先搜索策略为主,主要应用在搜索引擎和指定站点信息搜索领域。深度优先搜索策略[4]是比较常用的一种搜索方法,该方法的最终目标就是沿着网站中的一个超链接进行深层遍历直至无链接。深度优先搜索策略基本过程为,爬虫程序从初始种子网页出发,获取当前网页的超链接集合后,任选一个超链接进行爬取,这时爬虫在此方向建立并重复上述的过程,当爬虫程序在一条方向上无法再前进爬取时本条方向结束,并返回上一层页面另一超链接路径继续采集过程。当爬虫再也找不到另一个超链接爬行时则爬虫结束,搜索爬取完成。深度优先搜索策略在选定某一超链接后则一直爬取到底,整个爬取是一个递归过程。广度优先搜索策略[5]是使用比较广泛的一种方法,也是很多重要算法的原型。策略基本过程为,首先给定种子URL并从初始种子网页开始遍历,获取种子网页中的所有超链接并依次采集,然后重复上述过程对之后的链接层的网页链接进行抓取,当网络中该路径下的所有链接全部遍历完,搜索爬取停止。广度优先搜索是一种层序遍历方法,从选定的初始种子访问,逐层对所有链接进行遍历直到完成,遍历时按照从浅层到深层,同一层链接优先处理原则。当采用广度优先去爬取一个特定的网络站点或者深层结构网站的网络拓扑集合时,到底层时需要耗费较长的时间。目前国内的搜索引擎中,大多数是以广度优先搜索为主要的爬行策略,而那些很少被引用或者孤立的网站,就有可能被忽略掉,可以采用其他搜索策略来进行弥补,得到全面的搜索结果。
4网络爬虫策略实现
为对比深度优先搜索策略和广度优先搜索策略的运行原理和过程,本文以爬取大型深层网站百度百科https://baike.baidu.com/为例,在Python3.6和Anaconda环境下进行网络爬虫的实现和分析。网络爬虫进行网页信息爬取需要对网站的HTML文档进行解析,采用python语言实现爬虫的方法有很多,python网络爬虫常用的3种筛选技术包括:正则表达式;XPath路径语言;BeautifulSoup。从解析效率上正则表达式优于另两种方法,故本文在实现时采用正则表达式抓取信息。正则表达式能够通过组合的“规则字符串”来对表达式进行过滤,从而获取或匹配想要的特定内容[6]。当解析页面的HTML文件获取到URL时,先用过滤器进行判断,如果URL与正则表达式匹配,则放入待爬取队列,如果不匹配则过滤掉该URL[7]。深度优先搜索需要找一个或几个种子URL,笔者执行时从百度百科词条首页开始进行深度优先搜索,以下是深度优先搜索爬虫的正则表达式部分代码和主函数代码,如图2所示。分析程序将深度优先搜索算法运行控制的最大追踪深度定为3,算法实现函数调用原理关系如图3所示。广度优先搜索是将新下载网页中发现的链接直接插入待抓取URL队列的末尾,也就是网络爬虫会先抓取起始网页中链接的所有网页,然后选择其中的一个链接网页,继续抓取在此网页中所有链接[8]。以下是进入百度百科网站首页开始,进行广度优先搜索爬虫的主类爬取部分代码如图4所示,将广度优先搜索算法运行控制的最大追踪深度定为3,算法实现函数调用原理关系如图5所示。
5结束语
深度优先搜索和广度优先搜索是网络爬虫的基本爬取策略,在这两种策略基础上可以根据采集信息和网站结构等具体需求,结合页面权重或大站优先等抓取策略原则,改进和优化网络爬虫的采集效果。基于深度优先搜索的递归爬虫可以了解,由于是串行的爬虫,所以采用多线程提高爬虫速度并不合适,因为深度优先的链接是逐个获取,在获取之前不知道下一个页面有多少链接,调用多线程的队列并不能带来太多速度提升。多线程配合广度优先搜索比较合适,因为广度优先的遍历以层次为顺序,每层上所有链接都遍历到后才向下一层搜索,每层都可以有大量链接能够在队列里分配给多线程搜索,所以能够显著提高爬虫效率。
《网络信息采集策略研究》来源:《内蒙古科技与经济》,作者:齐虎春