网络爬虫
网络爬虫又称网络蜘蛛、网络机器人和网络追踪器,是按照一定规则自动抓取互联网信息的程序或脚本。它们广泛用于互联网搜索引擎或其他类似网站,可以自动收集所有可以访问的页面内容以获取或更新这些网站的内容。网络爬虫可以从公共网页中抓取数据,为金融分析和市场趋势预测等不同领域提供数据支持。
网络爬虫技术起源于90年代初的搜索引擎。1994年初,美国华盛顿大学的师生开发了一种在互联网上搜索信息的工具。该工具于1994年4月20日正式完成,是网络爬虫的雏形。随着互联网的发展,它们已经成为不可或缺的工具。现代爬虫技术在搜索引擎中占据核心地位,其目的是提高爬行速度、扩大数据范围和提高爬行精度。
从互联网上收集信息是一项重要的任务,而爬虫的出现在一定程度上取代了人工访问网页,实现了互联网数据的自动收集,从而更高效地利用互联网中的有效信息。基本爬虫主要包括数据采集、处理和存储。高级爬虫引入了更复杂的技术,如并发编程或分布式技术,并配备了调度程序和后台管理功能。根据数据的不同使用场景、爬行形式、存储方式和实现方式,爬虫还可以进一步细分为不同的类别。
历史发展
背景
互联网进入大数据时代以来,通过分析海量数据可以产生巨大的商业价值。数据市场充斥着各种数据,例如企业在生产经营中会产生大量与自身业务相关的数据,政府和机构也会发布一些公共数据。如果数据市场上没有需要的数据,或者价格太高无法购买,那么可以使用爬虫技术来抓取网站上的数据。搜索引擎和个人或单位都需要从公共网站上抓取大量数据。在这种需求下,爬虫技术应运而生并迅速发展成为一项成熟的技术。
发展
随着互联网的兴起,早期的网络爬虫作为搜索引擎的关键功能部分出现。1990年,阿奇搜索引擎的出现标志着网络爬虫研究的开始。后来在1993年,麻省理工学院(MIT)的马修·格雷开发了一个名为万维网漫游者(World wide Web Wanderer)的爬虫系统,该系统可以统计互联网中的服务器数量,为爬虫系统的后续开发提供了一个非常重要的设计思路。随着互联网技术的发展,新的网络爬虫不断涌现。1994年,出现了机器人、蜘蛛和爬虫等自动跟踪和索引程序。
网络爬虫技术的发展与搜索引擎的兴起密切相关。1994年初,为了支持布莱恩·平克顿的项目,美国华盛顿大学的师生团队开发了一种在互联网上搜索信息的工具。该工具于1994年4月20日正式完成,被认为是现代网络爬虫的雏形。它是第一个网页全文搜索引擎,使用广度优先策略遍历网页。同年4月,杨致远和斯坦福大学的大卫·费罗共同创立了雅虎,其搜索引擎后来成为一个有影响力的分类搜索引擎。随后,Lycos、Infoseek、Metacrawler和HotBot等搜索引擎相继推出。
1995年春,来自数字设备公司(DEC)的三名科学家开发了Altavista搜索引擎,并于同年12月开始提供信息检索服务。这是使用爬虫技术索引网页的第一个例子之一。
1997年,分布式网络爬虫技术的出现进一步推动了搜索引擎技术的发展。同年年底,斯坦福大学的拉里·佩奇、谢尔盖·布林、斯科特·哈桑和艾伦·斯特伦伯格共同开发了谷歌搜索引擎,开启了由搜索引擎主导的互联网新时代。谢尔盖·布林和拉里·佩奇在1998年开发的PageRank算法极大地改善了搜索引擎的效果,后来成为谷歌爬虫的著名算法。
2002年,开源网络搜索引擎Apache Nutch发布。Nutch项目是网络爬虫的一个原型,通过开源代码推动了网络爬虫技术的发展,促进了学术界和工业界对网络爬虫的研究和应用。
现状
随着技术的发展,网络爬虫经历了从单一处理模式到分布式并行处理的显著演变。起初,爬虫技术仅限于捕获静态网页信息,但后来发展到能够处理动态和实时加载的页面内容。数据爬行的范围和准确性也得到了改进,从一般的爬行到更有针对性和更准确的目标数据爬行。尤其是在线社交网络数据的抓取中,高效、准确的爬虫程序成为获取有价值数据的关键。
Google和AltaVista等著名搜索引擎采用的分布式网络爬虫系统通过在短时间内收集大量网页,显著提高了搜索引擎的效率。现代分布式网络爬虫主要采用主从分布模式,由一个中心控制节点将任务分配给从节点,使得爬虫任务更加高效和集中。这些技术的发展不仅提高了爬虫的功能性,而且拓宽了其应用范围,使爬虫成为获取和处理大量网络信息的重要工具。
自动爬虫工具的出现进一步简化了数据抓取过程,如Octopus Collector、ParseHub、WebHarvy等。这些工具通常操作简单,功能多样,可以更好地帮助用户获取更广泛、更多类型的信息资源。
原理过程
基本原理
网络爬虫的原理基本相同,其基本功能是通过广度优先搜索策略、深度优先搜索策略或最佳优先搜索策略遍历网站资源,从而自动抓取万维网上的信息。
一个基本的爬虫通常分为三个部分:数据获取(网页下载)、数据处理(网页分析)和数据存储(持久有用信息)。更高级的爬虫在收集和处理数据时会使用并发编程或分布式技术,这可能还包括调度程序和后台管理程序(监视爬虫的工作状态并检查数据爬行的结果)。
通用网络爬虫工作时需要一个或多个网页的URL作为预定义的初始化值;从URL队列中抓取URL作为初始值,解析DNS,获取主机IP地址,最后下载URL对应的网页并存储在下载的网页库中。此外,这些URL被放入已爬网URL队列中,通过解析已爬网网页提取新URL,并对新URL进行重复数据删除。如果不对它们进行去重,爬虫将陷入无限循环而无法终止任务,并不断提取当前页面的URL作为新的URL并将其存储在排序队列中,直到满足爬虫的某个停止条件。
爬虫算法
基本爬虫算法使用包含统一资源定位器(URL)和选择算法A的种子集S作为输入。概括地说,算法A根据当前边界列表确定下一个要爬行的文档,该列表表示从网页中提取的URL,这些是爬虫程序最终可以爬行的候选页面。选择算法A决定了爬虫用来发现资源的基本策略。例如,如果一个新的URL被添加到URL队列的末尾,而算法A从队列的头部选择一个文档,则该策略对应于宽度优先算法。
抓取过程
网络爬虫的爬行过程如下:
手动选择一些种子URL并将其放入要爬取的URL队列中,也可以由用户指定的一个或多个初始爬取页面来决定。
根据初始URL地址爬取页面后,将相应的网页存储在原始数据库中,并在此过程中找到并获取新的URL地址。
将新获取的URL地址放入URL队列进行重复数据删除并跟踪爬网进度。然而,由于网络垃圾邮件、蜘蛛陷阱、主题偏好或队列大小的实际限制,所有未访问的URL在爬行期间都无法添加到URL队列中。
从URL队列中读取新URL,根据新URL爬取网页,同时从新网页中获取新URL,重复上述爬取过程。当队列为空时,进程停止。空队列不一定意味着爬虫已经爬行了整个网络,因为网络不是强连接的,并且大多数随机选择的种子集无法到达许多页面。
主要功能
客户搜寻:销售理财产品时,找到目标客户及其联系方式是关键。网络爬虫可以根据设定的营销活动规则从互联网上自动收集目标用户的联系信息。
数据收集:数据收集需要网络爬虫从目标网站上的网页下载文本或图片到指定位置。这个过程需要完成以下配置任务:下载网页配置、解析网页配置、批改结果配置和数据输出配置。
搜索引擎:网络爬虫是搜索引擎的核心模块。爬虫帮助搜索引擎捕获互联网上的web信息,然后将信息存储在原始web数据库中。
网络监控:网络爬虫可作为项目的数据监控系统。它通过抓取公开发布的数据和服务状态(如基础设施服务、平台服务和软件即服务)来提供有效的网络监控和数据聚合,以满足用户对实时监控的需求。
信息推荐:网络爬虫可以在网络上捕获符合用户偏好的相关信息并传输给用户。在这个过程中,用户无需任何操作即可满足自己的个性化需求,节省了用户的时间,提高了用户的体验满意度。
数据挖掘:数据挖掘是以数据为研究对象的任务,任务的核心点是数据。爬虫技术是收集网络数据的好工具,因此网络爬虫也可以用来挖掘数据。
数据提供:在金融领域,可以使用网络爬虫收集数据资源,集中处理金融经济的发展信息和相关数据,从而为经济发展趋势、金融投资和风险分析提供全面的数据支持。
广告过滤:浏览网页时,广告信息频繁出现,造成干扰。网络爬虫可以用来抓取网页信息并自动过滤掉这些广告,使信息阅读更加方便。
数据分析:在网站上购买产品时需要了解畅销品牌、价格趋势等信息。对于普通用户来说,手动统计数据既费时又不方便。网络爬虫可以很容易地收集这些数据进行深入分析。
系统分类
根据使用场景
通用爬虫是搜索引擎爬行系统的重要组成部分,而聚焦爬虫是一种“满足特定主题需求”的网络爬虫程序。
通用爬行动物:通用爬虫又称全网爬虫,旨在尽可能高效地抓取互联网上的各种网页数据,并进行存储和检索,主要为门户搜索引擎和大规模Web服务收集数据。这类网络爬虫的爬取范围和数量巨大,要求爬取速度快、存储空间大,爬取页面的顺序较低。通常并行工作,但刷新页面需要很长时间。通用网络爬虫适用于搜索广泛的主题,具有很强的应用价值。基于通用网络爬虫的搜索引擎大多提供基于关键词的检索,难以支持基于语义信息的查询,无法准确理解用户的具体需求。针对这些情况,聚焦网络爬虫技术得到了广泛应用。
搜索引擎:焦点爬虫,也称为主题网络爬虫,是一种“面向特定主题需求”的网络爬虫程序,它将有选择地爬行那些与预定义主题相关的网络爬虫。聚焦爬虫工作的基本目标是通过编写爬虫程序,从一个或多个初始URL开始,获取符合某个主题的特定网页的URL,然后根据这些URL抓取网页内容并从中提取有价值的信息,这些信息将用于进一步的数据分析。与一般爬虫相比,聚焦爬虫只需抓取与主题相关的页面,大大节省了硬件和网络资源;保存的页面也因为数量少而更新很快,可以很好地满足一些特定人群对特定领域信息的需求。
按搜索形式划分
累积爬虫用于数据集的整体建立或大规模更新,而增量爬虫主要针对数据集的日常维护和实时更新。
累积爬行动物:累积爬虫是指从某个时间点开始遍历允许系统存储和处理的所有网页。累积爬虫常用于数据集的整体建立或大规模更新。在理想的软硬件环境下,经过足够的运行时间后,累积爬取的策略可以保证爬取相当多的网页集合。然而,由于Web数据的动态特性,集合中网页的爬取时间不同,更新页面的情况也不同,因此累积爬取的网页集合无法与真实环境中的网络数据保持一致。
增量爬行动物:增量爬虫是指具有一定规模的网页集合,通过更新数据来选择现有集合中过时的网页进行爬取,以保证爬取的数据足够接近真实的网络数据。增量爬虫主要针对数据集的日常维护和实时更新。增量爬取的前提是系统已经爬取了足够数量的网络页面,并且拥有这些被爬取页面的时间信息。与周期性抓取和刷新页面的网络爬虫相比,增量爬虫只在必要时抓取新生成或更新的页面,不重新下载未更改的页面,可以有效减少数据下载量,及时更新抓取的页面,减少时间和空间消耗,但增加了抓取算法的复杂度和实现难度。
根据数据抓取方式
网页根据其存在形式可以分为表层网页和深层网页。这两种网页的爬虫分别称为表面爬虫和深度爬虫。
表面爬行动物:爬取表面网页的爬虫称为表面爬虫。表面页面是指可以被传统搜索引擎索引的页面,网页主要由可以通过超链接到达的静态页面组成。
深层爬行动物:爬取深度网页的爬虫称为深度爬虫。深度网页是那些大部分内容无法通过静态链接获得并隐藏在搜索表单后面的网页,只有用户提交一些关键字才能获得。例如,在用户注册之前内容不可见的网页就是深度网页。因此,deep web爬虫最重要的部分是表单填写部分,需要模拟人类行为来分析、填写和提交表单,并最终从返回的页面中提取所需的内容并将其添加到搜索引擎中参与索引,从而为用户提供搜索。深度爬虫与常规爬虫的区别在于,深度爬虫在下载页面后不会立即遍历所有超链接,而是使用一定的算法对其进行分类,针对不同类别采用不同的方法计算查询参数,并再次提交给服务器。如果提交的查询参数是正确的,您将获得隐藏的页面和链接。
按实施模式划分
集中式爬虫可用于个人的中小型数据收集,分布式爬虫可用于企业的大规模数据收集。
集中式爬行动物:在给出初始URL后,集中式网络爬虫可以通过单线程或多线程解析URL并提取页面内容,并将信息存储在本地以供分析,并将网页中其他页面的URL保存在队列中以供后续访问。集中式爬虫在单台计算机上运行,可用于个人的中小型数据采集。
分布式爬虫:分布式网络爬虫可以看作是多个集中式网络爬虫的组合,分布式系统中的每个节点都可以看作是一个集中式网络爬虫。分布式爬虫的工作原理与集中式爬虫基本相同,但分布式爬虫需要所有节点协作来抓取网页,这使得分布式爬虫的效率远高于集中式爬虫。分布式爬虫系统结构多种多样,工作模式也各不相同。对于典型的分布式爬虫系统,每个节点不仅从网页中获取URL,还从其他节点接收URL。然后节点解析该URL对应的网页,并将不属于自己爬取范围的URL转发给其他节点。分布式爬虫可以在多台计算机上实现协同爬行,可用于企业大规模数据采集。
系统协议
Robots协议
在搜索引擎抓取网站之前,有必要在一定程度上了解目标网站的规模和结构。此时,您可以通过网站本身提供的robots.txt和Sitemap.xml文件获得帮助。例如,一些网站不希望爬虫是白色的,以免影响这些网站的正常对外公共服务。此时爬虫需要遵循礼貌原则,从而与更多网站建立友好关系。
Robots协议(也称为爬虫协议、机器人协议等。)就是“Robots Exclusion Protocol”,这是互联网领域常见的道德规范。它基于以下原则:搜索技术应为人类服务,同时尊重信息提供者的意愿并保护其隐私权。网站有义务保护用户的个人信息和隐私不受侵犯。该网站通过一个符合robots协议的robots.txl文件告诉搜索引擎哪些页面可以被抓取,哪些页面不能被抓取。
Robots.txl文件是搜索引擎访问网站时首先查看的文件,这将限制网络爬虫的访问范围。当网络爬虫访问一个网站时,它将首先检查该网站的根目录中是否有robots.txt文件。如果文件存在,网络爬虫会根据文件内容确定访问范围;如果该文件不存在,则所有网络爬虫都可以访问网站上没有密码保护的所有页面。
网站地图协议
Sitemaps协议使网站能够通知搜索引擎可以抓取的网址,从而使搜索引擎可以更方便地抓取网站。Sitemap.xml是一个xml格式文件,包含网站的所有链接(URU)。简单来说,sitemap就是一个网站地图。
网站地图(Sitemap.xml)文件为了方便网站管理员通知爬虫遍历和更新网站内容,而无需抓取每个页面,网站提供了一个网站地图(Sitemap.xml)文件。在Sitemap.xml文件中,列出了网站中的网站以及每个网站的其他元数据,例如上次更新时间、更改频率以及相对于网站上其他网站的重要性,以便爬虫可以更智能地抓取网站。
爬虫系统
爬虫的体系结构描述了整个系统的设计和组织,而爬虫的框架则是用于开发和实现爬虫的软件工具、库或框架。架构指导框架的设计,框架实现架构的模块,而框架提供开发工具来支持架构的实现。
爬虫架构
一个简单的爬虫架构由URL管理器、网页下载器和网页解析器组成。爬虫调度器用于启动、执行、停止爬虫,或者监视爬虫中的运行情况。爬虫程序中有三个核心模块:URL管理器,用于管理待爬取的URL数据和已爬取的URL数据;网页下载器下载与URL管理器中提供的URL相对应的网页,并将其存储为字符串。该字符串将被发送到网页分析器进行分析;一方面,网页解析器将解析有价值的数据,另一方面,由于每个页面都有许多指向其他页面的网页,这些URL可以在解析后添加到URL管理器中。
关键技术
信息提取
信息抽取是从结构化或半结构化网页中识别和提取HTML标签中嵌入的信息的关键技术,在使用爬虫程序获取数据时尤为重要。该技术根据提取方法的不同可以分为几种主要类型,每种方法都有其特点和适用场景。这些方法是爬取web数据的核心环节,决定了爬取的效率和数据的质量。
选择合适的信息抽取方法是有效数据抓取的关键。例如,基于网页结构的方法通过将网页解析为DOM树(文档对象模型树)来提取内容,这种方法很简单,但需要了解网页结构。此外,还有其他类型的方法,它们使用不同的特征和策略来提取数据,并且可以适应各种场景和需求。
页面解析
爬虫使用URL或requests等模块发起HTTP请求来获取网页的源代码,但其工作只是一小部分,然后还需要分析网页。正则表达式、BeautifulSoup、XPath、CSS选择器、PyQuery和Scrapy都是分析网页的常用方法。
正则表达式:正则表达式是分析和提取web内容的最有效方法之一。正则表达式是字符串处理的强大工具,它使用预定义的模式匹配一类具有共同特征的字符串,可以快速准确地完成搜索和替换等复杂的处理需求,具有比字符串本身提供的方法更强大的处理功能。
beautiful Soup:抓取页面后,beautiful Soup可以处理返回的HTML字符串(或列表)并匹配一部分所需数据。BeautifulSoup是一个优秀的Python扩展库,它可以从HTML或XML文件中提取数据,并允许指定不同的解析器。
XPath:在Python程序中,可以使用XPath解析爬虫数据。XPath不仅提供简洁的路径选择表达式,还提供数百个内置函数来处理字符串、值、序列、时间匹配和节点。
CSS选择器:使用CSS选择器,您可以轻松地向元素添加样式,而无需更改HTML结构。仅仅通过添加不同的CSS规则,网页的结构和呈现风格就完全分离了,你可以得到各种不同风格的网页。
PyQuery:在Python程序中,可以使用库PyQuery来解析HTML文件的内容。PyQuery是JS框架jQuery的Python版本,通过Python语言模仿jQuery的源代码实现,其语法与jQuery几乎相同。
Scrapy:Scrapy是一个多线程的爬虫框架,它的爬虫文件可以用来定制自己的页面解析规则,从特定的网页中提取自己需要的信息。
数据清理
数据清洗是对爬虫获取的数据源进行处理的关键步骤,旨在消除不完整和无效的数据,从而保证数据分析的准确性和有效性。在大数据环境下,由于大数据通常具有体量大、多维度、格式复杂、准确率低等特点,直接使用它进行分析可能并不合适。因此,高质量的数据清洗不仅有助于提升数据价值,而且对确保分析结果的客观性和可靠性非常重要。
应付策略
随着搜索引擎的普及,网络爬虫技术得到了广泛应用。由于频繁的请求和重复的爬行,许多爬虫给中小型网站带来了压力,导致访问缓慢甚至中断,因此许多网站都实施了反爬行措施。面对这些措施,爬虫程序需要采用模拟用户行为和使用代理等策略来成功抓取数据。
设置用户代理:User-Agent代表用户代理,是HTTP(超文本传输协议)协议中的一个字段。其作用是描述发送HTTP请求的终端信息,服务器通常通过该字段判断访问网站的对象。每个常规爬虫都有一个固定的用户代理,只要该字段设置为知名用户代理,就不建议伪装知名爬虫,因为这些爬虫很可能有固定的IP,例如百度爬虫有自己的固定IP,会被识破并伪装。
代理池:如果网站通过某段时间内IP访问的数量来判断爬虫的行为并阻止相应的IP,那么仅依靠用户代理设置是不够的。为了处理单个IP的访问限制,可以使用代理池来解决。代理池是一个包含大量代理IP的队列,它可以支持网络爬虫从中选择IP进行爬行任务,并在遇到屏蔽时快速替换新的IP,从而不间断地继续爬行任务。结合多线程技术,该方法可以有效提高爬虫的爬行效率。
降低访问频率:如果找不到免费且稳定的代理IP,可以降低访问网站的频率,这可以达到与用户代理相同的效果,并防止对方从访问中识别爬虫的身份,但爬行效率会差很多。为了弥补这一缺点,我们可以基于这一思路及时调整具体操作。例如,每次抓取页面时休息几秒钟,或者限制每天抓取的页面数量。
验证码限制:尽管有些网站无需登录即可访问,但当检测到异常IP流量时,将需要验证码来验证用户身份。基于这种情况,常见的应对方法是使用机器学习对验证码样本进行学习,直到其达到较高的识别率,然后将学习结果与爬虫程序相结合来应对这种情况。