来源爬虫程序调研报告
一、什么是爬虫
爬虫:就是抓取网页数据的程序。从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。网络爬虫就是一个爬行程序,一个抓取网页的程序,网络爬虫的基本操作是抓取网页。
二、网络爬虫的组成
网络爬虫由控制节点、爬虫节点、资源库构成。
图1.控制节点和爬虫节点的结构关系。
网络爬虫中可以有多个控制节点,每个控制节点下可以有多个爬虫节点,控制节点之间可以互相通信,同时,控制节点和其下的各爬虫节点之间也可以进行互相通信,属于同一个控制节点下的各爬虫节点间,亦可以互相通信。
控制节点,也叫作爬虫的中央控制器,主要负责根据URL地址分配线程,并调用爬虫节点进行具体的爬行。
爬虫节点会按照相关的算法,对网页进行具体的爬行,主要包括下载网页以及对网页的文本进行处理,爬行后,会将对应的爬行结果存储到对应的资源库中。
三、爬虫的技术原理与实现
3.1 爬虫的分类
爬虫可以分为四种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。
通用网络爬虫,又称全网爬虫,主要任务是为门户站点搜索引擎和大型Web服务提供商采集数据。这类爬虫的爬行范围和数量巨大,对爬行速度和存储空间有较高要求,而相对较低的要求是对爬行页面的顺序。由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。尽管存在一定缺陷,通用网络爬虫适用于为搜索引擎搜索广泛的主题,具有较高的应用价值。
聚焦网络爬虫,也称为主题网络爬虫,选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。与通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源。保存的页面由于数量少而更新快,可以很好地满足一些特定人群对特定领域信息的需求。聚焦爬虫和通用网络爬虫相比,增加了链接评价模块以及内容评价模块,其爬行策略实现的关键在于评价页面内容和链接的重要性。
增量式网络爬虫,是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫。增量式爬虫能够在一定程度上保证所爬行的页面是尽可能新的页面。与周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只在需要时爬行新产生或发生更新的页面,不重新下载没有发生变化的页面,从而有效减少数据下载量,及时更新已爬行的网页,但增加了爬行算法的复杂度和实现难度。
深层网络爬虫,这是按照存在方式划分的类型,与表层网页(传统搜索引擎可以索引的页面)相对,深层网页指的是以非超链接形式存在的动态网页或其他难以通过传统搜索引擎索引的页面。深层网络爬虫专门用于抓取这些深层次的网页内容。
3.2 爬虫的技术原理
通用爬虫,目标是在保持一定内容质量的情况下爬取尽可能多的站点,比如百度这样的搜索引擎就是这种类型的爬虫,如图2是通用搜索引擎的基础架构:
首先在互联网中选出一部分网页,以这些网页的链接地址作为种子URL;
将这些种子URL放入待抓取的URL队列中,爬虫从待抓取的URL队列依次读取;
将URL通过DNS解析,把链接地址转换为网站服务器对应的IP地址;
网页下载器通过网站服务器对网页进行下载,下载的网页为网页文档形式;
对网页文档中的URL进行抽取,并过滤掉已经抓取的URL;
对未进行抓取的URL继续循环抓取,直至待抓取URL队列为空。
图2.通用搜索引擎的基础架构
爬虫通常从一个或多个 URL 开始,在爬取的过程中不断将新的并且符合要求的 URL 放入待爬队列,直到满足程序的停止条件。
而我们日常见到的爬虫基本为聚焦网络爬虫,目标是在爬取少量站点的情况下尽可能保持精准的内容质量。典型的比如图3抢票软件所示,就是利用爬虫来登录售票网络并爬取信息,从而辅助商业。
图3.抢票软件
聚焦网络爬虫面向有特殊需求的人群,它会根据预先设定的主题顺着某个垂直领域进行抓取,而不是漫无目的地随意抓取。与通用网络爬虫相比,聚焦网络爬虫会根据一定的网页分析算法对网页进行筛选,保留与主题有关的网页链接,舍弃与主题无关的网页链接。其目的性更强。聚焦网络爬虫的工作原理如图4所示。
关于图4中各环节的介绍如下。
(1)根据需求确定聚焦网络爬虫的采集目标,以及进行相关的描述。
(2)获取初始URL。
(3)根据初始URL抓取对应的网页,并获得新LRL。
(4)从新URL中过滤掉与采集目标无关的URL。因为聚焦网络爬虫对网页的采集有着明确的目标,所以与目标无关的URL都会被过滤掉。
(5)将过滤后的URL放入URL队列。
(6)根据一定的抓取策略,从URL队列中确定URL优先级,并确定下一步要抓取的URL。
(7)从下一步要抓取的URL中读取新URL,以准备根据新URL抓取下一个网页。
(8)若聚焦网络爬虫满足设置的停止条件,或没有可获取的URL时,停止采集;若网络爬虫没有满足设置的停条件,则继续根据新URL抓取对应的网页,并重复步骤(3)~步骤(8)。
图4.聚焦网络爬虫的工作原理
增量式爬虫是一种用于爬取网页信息的技术,它与全量式爬虫相比具有更高效和节省资源的特点。
增量式爬虫的基本原理是通过比较已爬取的数据和新爬取的数据,只爬取和更新最新的数据。它会记录上一次爬取的状态,将新爬取的数据和已有的数据进行匹配和对比,只提取出新数据并进行存储。
增量式爬虫原理如图5所示,一般包括以下几个步骤:
初始化:设置爬取的起始点和爬取规则。
爬取网页:按照规定的规则和策略爬取网页内容,并将爬取的数据存储到数据库中。
数据对比和更新:将新爬取的数据与已有的数据进行对比,判断是否是新的数据。如果是新数据,则进行存储更新。
持续爬取:根据设定的规则和策略,定时或定量地进行持续的爬取和更新。
图5. 增量式爬虫的工作原理
通过增量式爬虫,可以实现对目标网站数据的高效爬取和及时更新,提高了爬取的效率和精确度,减少了资源的浪费和重复爬取的数据量。
3.3 爬虫的简单示例
除了使用爬虫框架来进行爬虫,也可以从头开始来编写爬虫程序,步骤如图6所示:
图6.爬虫的基本原理
接下来通过一个简单的例子来实际演示上述的步骤,我们要爬取的是某应用市场的榜单,以这个作为例子,是因为这个网站没有任何的反爬虫手段,我们通过上面的步骤可以轻松爬取到内容。
图7.网页与其对应的源代码
网页与其对应的源代码如图7所示,对于网页上的数据,假定我们想要爬取排行榜上每个app的名称以及其分类。
我们首先分析网页源代码,发现可以直接在网页源代码中搜索到“抖音”等app的名称,接着看到app名称、app类别等都是在一个<li>标签里,所以我们只需要请求网页地址,拿到返回的网页源代码,然后对网页源代码进行正则匹配,提取出想要的数据,保存下来即可,如图8所示
图8.爬虫的代码以及结果
四、爬虫的机制
1.确定爬取目标:首先需要明确要爬取的网站、要爬取的数据类型和要爬取的数据范围。
2.发起请求:爬虫程序通过 HTTP 或 HTTPS 协议向目标网站发起请求,获取网页的 HTML 文档。
3.解析 HTML:爬虫程序使用网页解析库(如 BeautifulSoup、lxml)解析网页的 HTML 文档,提取出需要的数据。
4.处理数据:爬虫程序对获取到的数据进行处理和存储,例如将数据存储到数据库中或写入文件。
5.反爬措施:由于许多网站采取了反爬虫措施,爬虫程序需要进行相应的解决策略,例如设置 User-Agent 参数、使用代理和验证码识别等。
6.定时任务:如果是长期维护的爬虫,需要定期对目标网站进行监测和更新,确保数据的实时性和准确性。
常见的来源爬虫优缺点:
1. Scrapy框架
Scrapy是一个用Python编写的强大的爬虫框架,具有高速度、灵活性和易用性等特点。它支持各种网站和数据抓取,同时提供了许多有用的内置功能,例如调度、跟踪和过滤器等。此外,Scrapy还具有良好的文档和活跃的社区支持。但是,Scrapy也有一些缺点。首先,它只能在Python中使用,这限制了它的应用范围。其次,Scrapy的学习曲线相对较陡,需要花费一些时间来掌握。此外,Scrapy的代码相对较为冗长,因此对于需要快速上手的人来说可能不太适合。
2. Selenium框架
Selenium是一个自动化测试工具,可以模拟用户在浏览器中的行为。可以用于抓取动态网页和Web应用程序中的数据,同时提供了对JavaScript的支持。此外,Selenium还可以与多种编程语言(如Java、Python和C#等)进行集成。然而,Selenium也有一些缺点。首先,它只能模拟用户在浏览器中的行为,因此对于一些复杂的网站和应用程序可能无法完全准确地抓取数据。其次,Selenium启动浏览器和测试套件需要时间和资源,因此不适合大规模的并发请求。此外,Selenium的代码相对较为复杂,需要较高的技术水平才能掌握。
3. Beautiful Soup框架
Beautiful Soup是一个用于解析HTML和XML文档的Python库。它可以用于从网页中提取数据,同时提供了许多有用的搜索、修改和导航功能。此外,Beautiful Soup还具有良好的文档和广泛的应用支持。然而,Beautiful Soup也有一些缺点。首先,它只能处理静态网页,对于动态网页和Web应用程序可能无法完全准确地抓取数据。其次,Beautiful Soup的搜索功能不如XPath和CSS选择器强大,因此对于某些网站可能无法准确地提取数据。此外,Beautiful Soup的代码相对较为冗长,需要花费一些时间来掌握。
4. PyQuery框架
PyQuery是一个用Python编写的jQuery风格的库,可以用于解析HTML文档并对其进行查询和修改。它可以非常方便地抓取网页中的数据,并支持各种CSS选择器和AJAX等功能。此外,PyQuery还具有灵活性和可扩展性等特点,可以与多种Python库进行集成。然而,PyQuery也有一些缺点。首先,它只能处理静态网页,对于动态网页和Web应用程序可能无法完全准确地抓取数据。其次,PyQuery的功能相对较为简单,不如Scrapy和Beautiful Soup等专业爬虫框架强大。此外,PyQuery的文档和学习资源相对较少,需要花费一些时间来掌握。
5. scrapy-redis
Scrapy-Redis是Scrapy的一个扩展,它提供了基于Redis的分布式爬取能力。通过使用Redis作为共享存储,多个爬虫节点可以协同工作,共同处理爬取任务,从而提高了爬取效率和并发能力。Scrapy-Redis使用Redis作为任务调度器,它将待爬取的URL存储在Redis的队列中。由于Redis支持高效的数据结构和持久化存储,因此可以轻松地处理大规模数据,并实现URL的去重和任务分发。Scrapy-Redis将爬取到的数据存储在Redis中,这使得多个爬虫节点可以共享数据,避免了数据不一致和重复存储的问题。同时,Redis的高性能读写能力也提高了数据处理的效率。Scrapy-Redis作为Scrapy的扩展,提供了一套基于Redis的组件,如Redis调度器、Redis去重中间件等。这些组件与Scrapy的现有组件集成在一起,共同实现分布式爬取功能。然而,Scrapy-Redis也有一些缺点。在高并发环境下,Redis可能成为瓶颈,因为它需要处理大量的请求并保持数据的一致性。由于Redis是内存数据库,如果服务器宕机或重启,所有的爬取状态可能会丢失。由于所有的爬虫活动都在Redis中,调试和诊断问题可能会更加困难。与纯Python工具包相比,Scrapy-Redis需要额外的配置步骤。Redis是单线程的,因此在高并发下可能成为瓶颈。在分布式爬虫环境中,如果没有正确处理,可能会导致数据不一致。Scrapy-Redis不支持Scrapy的去重组件,需要额外的去重方案。
6. 基于 Python 的 Requests 库
Requests 是 Python 语言中一个流行的 HTTP 库,提供了多种HTTP请求方法,包括GET、POST、PUT、DELETE等,可以方便地发送请求并获得服务器响应。requests库支持设置请求头、Cookies、代理、超时等参数,还可以获取服务器返回的响应状态码、响应头和响应内容,以及处理响应的编码、JSON数据等。requests库可以创建会话对象,用于保持持久连接和共享Cookie等信息,以提高性能和效率。requests库可以方便地上传文件,也可以下载文件到本地,支持断点续传和流式传输。requests库支持SSL证书验证,可以处理HTTPS请求,并提供了方便的接口来管理证书和SSL选项。requests库可以通过设置代理来发送请求,以实现IP隐藏和反爬虫。但是,Requests 库也有一些局限性,例如:不支持 JavaScript 和 CSS,无法处理动态加载的内容。不能保持连接,不能在连接关闭时进行一些操作,例如在一个连接关闭时重试。不支持HTTP的CONNECT方法,不能通过HTTP代理服务器。不支持cookies的session持久性,每次请求都需要手动处理cookies。因此,如果需要爬取的网站使用了这些技术,使用 Requests 库就可能会遇到困难。
7. 基于 Node.js 的 Express 框架
Express 是 Node.js 语言中一个流行的 Web 应用框架,可以用于构建高性能的 Web 服务器。Express 框架具有高度灵活性和可扩展性,可以轻松地处理 HTTP 请求并返回响应内容。另外,Express 还支持中间件、路由、模板引擎等高级功能。但是,Express 框架主要适用于构建 Web 应用,对于爬虫而言可能会有些大材小用。此外,Node.js 中有些库和工具在处理 HTML 解析和爬虫方面并不是很成熟,需要额外的工作和代码量。
8. 基于 Node.js 的 Cheerio 库
Cheerio 是 Node.js 语言中一个流行的 HTML 解析库,可以用于解析和操作 HTML 文档。Cheerio 具有高效的 DOM 操作和解析速度,可以很方便地获取和提取 HTML 中的元素和数据。同时,Cheerio 还支持一些高级功能,例如:支持异步操作、可链式调用等。然而,Cheerio 的文档和社区支持相对较弱,需要一定的时间和经验才能熟练掌握。此外,Cheerio 的依赖项较多,可能会对项目造成一定的复杂性和维护难度。
9. Java爬虫
Java爬虫是一种常用的网络数据抓取工具,它能够自动化地从网页中提取和解析数据。Java语言天生支持多线程,可以使用多线程技术提高爬虫的并发能力,加快数据抓取速度。Java拥有丰富的第三方库和框架,如Jsoup、HttpClient等,可以方便地进行HTML解析、HTTP请求、Cookie管理等操作,简化了爬虫的开发过程。Java具有强大的网络编程功能,可以处理网络连接、数据传输等复杂的网络操作,并提供了Socket和URL等类库,方便进行网络数据的抓取和处理。Java是一种跨平台的编程语言,可以在不同操作系统上运行,因此Java爬虫具有良好的可移植性。Java是一种类型安全的编程语言,拥有严格的异常处理机制,可以有效地避免程序崩溃或执行错误。但是,Java爬虫也有一些缺点。相对于其他语言,Java的学习曲线较为陡峭,需要掌握较多的语法和相关知识才能进行爬虫开发。由于Java是一种解释型语言,相比于编译型语言,它的执行速度较慢。在大规模数据抓取的场景下,可能会面临性能瓶颈。虽然Java拥有丰富的第三方库和框架,但相对于其他语言如Python来说,Java在爬虫领域的可扩展性相对较低。一些网站为了防止爬虫的访问,会采取一些反爬虫策略,例如各种封禁等。而Java的代理、验证码识别等功能的实现相对复杂,对于一些需要频繁变更IP的场景来说,可能会遇到困难。一些网页使用JavaScript动态生成内容,对于这类网页,Java爬虫的HTML解析能力相对有限,很难获取到完整的数据。
10. Nutch
ApacheNutch是一个高度可扩展的和可伸缩的开源网页爬虫软件项目。源于ApacheLuceneTM,项目多样化,Nutch支持分布式抓取,并有Hadoop支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。但是,Nutch也有一些缺点。Nutch的抓取策略虽然灵活,但在实际应用中需要根据具体的需求进行优化,避免出现重复抓取和漏抓的情况。Nutch的分布式架构需要依赖于其他组件(如Hadoop),在配置和管理方面需要花费一定的精力。虽然Nutch在小规模数据上有良好的表现,但在处理大规模数据时,性能有所下降,需要进一步优化。
11. Pyspider
Pyspider提供了直观的可视化界面,使得爬虫任务的管理和调试变得简单方便。使用Pyspider,您可以使用Python编写简洁、可读性强的爬虫代码。Pyspider支持分布式爬取,能够提高爬虫任务的效率和速度。但是,Nutch也有一些缺点。对于新手来说,Pyspider可能需要一定时间来适应其使用方法和概念。由于Pyspider使用的是Python解释器,其可扩展性受到Python的限制。
12. Crawley
简单易学,能高速爬取对应网站内容,可将爬取到内容轻松存到数据库中,比如:postgres,mysql,oracle,sqlite等数据库。可以将爬取到的数据导出为json,xml等格式,支持非关系型数据库,比如:mongodb,couchdb等。支持使用命令行工具,可以使用你喜欢的工具提取数据,比如使用xpath或者pyquery等工具,支持使用cookie登陆并访问哪些只有登陆才能够访问的网页。但是,Crawley也有一些缺点。不支持动态网页抓取,例如网页的ajax部分。不支持分布式采集,可以考虑将其作为分布式爬虫的一部分,客户端采集部分。
13. Portia
Portia的优点包括其强大的功能和灵活性,能够满足各种需求,并且具有较好的稳定性和安全性。此外,Portia还具有易于使用的界面和强大的社区支持,使得用户能够轻松上手并获得帮助。然而,Portia也存在一些缺点。首先,它可能对一些特定的高级功能或定制需求支持不够,这可能会限制其在某些特定场景下的应用。此外,虽然Portia在许多方面表现出色,但在某些特定性能上可能还有提升的空间。
14. Grab
Grab提供了简洁、直观的API,使得编写爬虫代码变得容易。你可以快速设置请求参数、发送请求并处理响应,而无需过多的复杂配置。Grab内置了强大的文档解析器,可以使用CSS选择器或XPath来解析HTML文档。这使得提取所需数据变得简单,无需额外的第三方库或复杂的解析代码。Grab支持多线程和进程池,可以并发地发送请求,提高爬取速度。这对于需要处理大量页面或需要快速爬取的任务非常有用。它在处理大型、复杂的爬虫项目上可能稍显不足,但对于小型或中型的爬虫任务,Grab的简洁和易用性无疑是一大优势。
15. Newspaper
Newspaper库提供了一个简单而高效的方式来抓取新闻网页,即使是完全没有爬虫经验的初学者也能快速上手。它自动下载网页内容并进行解析,无需用户考虑复杂的header、IP代理、网页解析和网页源代码架构等问题,大大简化了爬虫的开发过程。除了基本的文章文本提取外,Newspaper还能自动识别并提取出文章的作者、发布日期等关键信息。它支持多种语言,包括英语、中文、德语、阿拉伯语等,适应不同国家和地区的新闻网站。此外,它支持多进程文章下载,可以同时处理多个网页,大大提高了数据抓取的效率。Newspaper能识别新闻链接,并从HTML文件中提取文本、图片等多媒体内容,为用户提供更全面的新闻信息。虽然Newspaper库简化了爬虫的开发过程,但它也依赖于外部服务来处理一些复杂的网页解析任务。这可能在某些情况下限制了其独立使用的能力。尽管Newspaper特别适用于抓取新闻类网页,因为它能处理较为规范的HTML结构和内容格式,但在抓取非新闻类网站时可能效果不佳。
16. Mechanize
可以处理重定向、cookie等,像真实用户一样与网页交互。方便快速地填写和提交网页表单。相比Selenium,Mechanize更轻量级,使用起来更简单。可以处理复杂的HTTP操作,如设置User-Agent、cookie、header等。不容易处理Ajax和DHTML。但不支持并发请求,对JavaScript的支持有限。不容易处理需要CAPTCHA的情况,不适合进行高并发请求,对应网站的反爬机制较为脆弱,容易被识别为爬虫而被封禁。