返回博客
指南
Sergiu InizianLast updated on Mar 31, 20262 min read

Cheerio 与 Puppeteer:最佳网页抓取工具选择指南

Cheerio 与 Puppeteer:最佳网页抓取工具选择指南

您正在为选择哪种网络爬虫工具而犹豫不决吗?面对市面上琳琅满目的选择,做出决定确实不易,但请放心——我来帮您。本文将深入对比两款广受欢迎的网络爬虫工具:Cheerio 与 Puppeteer。

Cheerio 是一个用于解析和操作 HTML 文档的库,而 Puppeteer 则是一个用于控制无头 Chrome 浏览器的库。Cheerio 允许您使用类似 jQuery 的语法选择元素,而 Puppeteer 则可用于网页抓取、测试以及表单提交自动化等任务。

那么,让我们深入探讨,开始抓取吧!

什么是 Cheerio?

Cheerio 是一个用于解析和操作 HTML 文档的 JavaScript 库,它允许您使用类似 jQuery 的语法来选择、修改文档中的元素并对其执行操作。

Cheerio 轻量且易于使用,是简单网页抓取任务的理想选择。由于无需加载所有资源和资产,其运行速度比 Chrome 或 Firefox 等完整浏览器更快,因此非常适合从 HTML 文档中提取数据。

Cheerio 拥有众多功能和优势,使其成为网页抓取的热门选择。Cheerio 的主要功能和优势包括:

  • 轻量且易于使用:Cheerio 设计轻量且易于使用,是简单网页抓取任务的绝佳选择。其语法类似于许多开发者熟悉的 jQuery,仅需几行代码即可选择和操作 HTML 文档中的元素。
  • 高效:与使用完整浏览器进行网页抓取相比,Cheerio 运行速度更快,因为它无需加载浏览器所需的所有资源。这使其成为对速度要求较高的任务的理想选择。
  • 支持 HTML 和 XML 文档:Cheerio 既能解析也能操作 HTML 和 XML 文档,让您能够根据需要灵活处理不同类型的文档。
  • 可与其他工具结合使用:Cheerio 可与 Fetch API 或 Axios 等其他工具结合使用,以执行网页抓取任务。这使您能够根据具体需求定制工作流程,并选用最适合的工具来完成任务。

什么是 Puppeteer?

Puppeteer 是一个 Node.js 库,提供用于控制无头 Chrome 浏览器的高级 API。它允许您在不实际打开 Chrome 窗口的情况下自动化 Chrome 中的任务,从而减少爬虫消耗的资源。

您可以使用 Puppeteer 执行诸如填写表单、点击按钮以及从网站提取数据等操作。

Puppeteer 的主要优势之一在于,它能以类似人类用户的方式与网站进行交互。这使其成为需要与网站进行更复杂交互的任务(如登录、页面导航和表单填写)的理想选择。

Puppeteer 拥有多项功能和优势,使其成为网页抓取和自动化领域的热门选择。Puppeteer 的主要功能和优势包括:

  • 高级 API:Puppeteer 提供易于使用和理解的高级 API。这使其成为刚接触网页抓取或自动化开发的新手开发者的理想选择。
  • 控制无头 Chrome 浏览器:Puppeteer 允许您控制无头 Chrome 浏览器,这意味着您无需实际打开 Chrome 窗口即可在其中自动化执行任务。这使其成为需要与网站进行更复杂交互的任务的理想选择。
  • 模拟人类行为:Puppeteer 能够模拟人类行为,例如点击按钮、滚动页面和填写表单。这使其成为需要与网站进行更复杂交互的任务的理想选择。
  • 支持现代 Web 功能:Puppeteer 全面支持 JavaScript、Cookie 和 CAPTCHA 等现代 Web 功能。这使其成为需要这些功能的任务的理想选择。
  • 可与其他工具结合使用:Puppeteer 可与 Cheerio 等其他工具结合使用,以执行网页抓取任务。这使您能够根据具体需求定制工作流程,并选用最适合的工具来完成任务。

Cheerio 与 Puppeteer 的区别

Cheerio 和 Puppeteer 都是广受欢迎的网页抓取工具,但二者存在一些关键差异,使得它们更适合处理特定任务。以下是 Cheerio 与 Puppeteer 之间的主要区别:

  • 性能:Cheerio 通常比 Puppeteer 更快,因为它无需加载浏览器通常需要加载的所有资源。然而,Puppeteer 的优势在于能够像人类用户一样与网站进行交互,这使得它在某些任务中反而更快。
  • 功能:Cheerio 适用于从 HTML 或 XML 文档中提取数据的简单网页抓取任务。Puppeteer 功能更强大,可在无头 Chrome 浏览器中自动化执行登录、页面导航和表单填写等任务。
  • 易用性:Cheerio 的语法与 jQuery 相似,许多开发者对此已很熟悉。这使得熟悉 jQuery 的用户能轻松上手。Puppeteer 同样拥有易于使用的高级 API,但相比 Cheerio 需要更多的初始化设置和配置。

总体而言,选择 Cheerio 还是 Puppeteer 取决于您的网页抓取任务的具体需求。如果您只需从 HTML 文档中提取一些数据,且对性能有要求,Cheerio 可能是更好的选择。如果您需要自动化操作,Puppeteer 则是正确的选择。

检查或安装 Node.JS

开始之前,请确保您的机器上已安装 Node.JS。本文使用的 Node 版本为 18.9.0。运行以下命令检查本地版本:

node -v

若出现错误,请从官方网站下载并安装 Node.js此操作同时会安装 Node.js 的包管理器 `npm`。

项目设置

打开终端并创建一个名为 `scraper` 的新文件夹。进入该目录并运行 `npm init` 命令。这将为您的项目生成一个 `package.json` 文件,其中包含名称、版本和依赖项等元数据。

请按照提示输入项目信息。您可以按 `Enter` 键接受每个提示的默认值,也可以根据需要输入自定义值。

现在可以开始安装依赖项并为项目创建文件:

npm install cheerio puppeteer

依赖项将安装在项目的 `node_modules` 目录中,并会添加到 `package.json` 文件的依赖项部分。

定义目标

在本篇文章中,我们将从 ArsTechnica 抓取一篇文章,并提取文章标题、封面图片 URL 以及文章正文的首段内容。

数据提取入门指南

首先,访问目标网站并打开一篇文章。右键点击文章标题,选择“检查”。这将打开开发者工具,并高亮显示标题标签的 HTML 元素。

根据良好的 SEO 实践,一个页面应仅包含一个 H1 元素。因此,h1 可以作为标题的可靠选择器。

要选择封面图片的匹配器,请使用“检查”工具。图片被包裹在 `figure` 标签中,因此将父元素包含在匹配器中是个好主意。最终的匹配器是 `figure img`。

最后但同样重要的是,我们需要找到首段落的选择器。

由于首段并非父元素的第一个子元素,因此需要一个额外的 CSS 选择器。父元素有一个名为 `article-content` 的类。我们可以将该类与 `:first-of-type` 选择器结合,从而得到最终的选择器:`.article-content p:first-of-type`。

以下是包含所有选择器的最终列表:

  • 标题:`h1`
  • 封面图片:`figure img`
  • 首段:`.article-content p:first-of-type`

构建爬虫

现在项目中已包含所需依赖项,我们将探讨如何结合使用 Cheerio 和 Puppeteer 来构建一个网页爬虫。通过结合这两种工具,您可以创建一个既快速又强大的爬虫,让我们开始吧!

创建一个名为 `scrape.js` 的文件,并将以下代码粘贴进去:

const puppeteer = require('puppeteer');

const cheerio = require('cheerio');

async function scrape() {

    // Launch a headless Chrome browser

    const browser = await puppeteer.launch();

    // Create a new page

    const page = await browser.newPage();

    // Navigate to the website you want to scrape

    await page.goto('https://arstechnica.com/tech-policy/2023/01/musk-led-twitter-faces-another-lawsuit-alleging-it-failed-to-pay-bills/');

    // Wait for the page to load

    await page.waitForSelector('h1');

    // Extract the HTML of the page

    const html = await page.evaluate(() => document.body.innerHTML);

    // Use Cheerio to parse the HTML

    const $ = cheerio.load(html);

    // Extract the title, cover image, and paragraph using Cheerio's syntax

    const title = $('h1').text();

    const paragraph = $('.article-content p:first-of-type').text()

    const coverImage = $('figure img').attr('src');

    // Display the data we scraped

    console.log({

        title,

        paragraph,

        coverImage

    });

    // Close the browser

    await browser.close();

}

scrape();

您可以通过 `node scrape.js` 命令运行该代码。输出结果应显示文章标题和封面图片的 URL,效果如下所示:

{

  title: 'Lawsuit: Twitter failed to pay $136,000 in rent at San Francisco office tower',

  paragraph: 'The Elon Musk-owned Twitter is facing another lawsuit alleging that it failed to pay its bills.',

  coverImage: 'https://cdn.arstechnica.net/wp-content/uploads/2023/01/getty-musk-twitter-800x533.jpg'

}

进阶应用

既然您已经学会了如何使用 Puppeteer 和 Cheerio 从单个网页抓取基本数据,现在是时候将您的网页抓取技能提升到更高水平了。以下是将这个基础抓取器升级为尖端抓取器的具体方法:

  • 抓取整个分类:通过修改代码中的 URL 和选择器,您可以抓取某个分类下的文章。这对于抓取大量数据或跟踪特定内容分类的更新非常有用。
  • 每次请求使用不同的用户代理:通过更改爬虫的用户代理,你可以绕过限制并更好地模拟人类行为。这对于爬取那些根据用户代理屏蔽或限制请求的网站非常有用。
  • 集成代理网络:代理网络可帮助您轮换 IP 地址并避免被检测。这对于抓取会封禁 IP 或限制请求频率的网站尤为有用。
  • 破解验证码:部分网站使用验证码来防止自动化抓取。有多种方法可以绕过验证码,例如使用验证码破解服务,或通过机器学习模型来识别并破解验证码。

总结

至此,您应该已经充分了解 Cheerio 和 Puppeteer 的优势与局限,并能根据自身需求做出明智的选择。无论您是初学者还是经验丰富的开发者,总有一款适合您的网页抓取工具。

若想深入了解 Cheerio,不妨阅读我的一位同事撰写的这篇文章。文中详细介绍了如何使用“检查元素”功能识别节点、将结果保存到磁盘,以及如何爬取 Reddit 这样的大型网站。

关于 Puppeteer 的功能,我们目前仅做了简要介绍。若想了解更多,这篇文章将深入探讨截图、表单提交以及多页面抓取等主题。

希望本文能帮助您了解可选方案,并为您的网页抓取需求做出最佳决策。

一种更简便的替代方案

虽然我们已探讨了 Cheerio 和 Puppeteer 的优势与局限,但还有另一种方案值得考虑:使用 WebScrapingAPI 这样的爬虫即服务(SaaS)平台。

使用此类服务具有以下优势:

  • 您可以确信该爬虫可靠且维护良好:服务商投入了专门资源确保其始终保持最新状态并正常运行。相比于自行构建和维护爬虫,这能为您节省大量时间和精力。
  • 使用网页抓取服务通常比自行开发更具成本效益:您无需投入资源进行抓取工具的开发和维护,还能充分利用服务商提供的各项特殊功能和技术支持。
  • 被检测到将不再是问题:高级网页抓取工具能规避检测,其抓取网站的效率和效果通常优于您自行开发的抓取工具。这为您节省了时间,让您能够专注于分析和利用抓取到的数据。

我们诚邀您试用我们的网页抓取工具,亲身体验使用值得信赖且可靠工具带来的优势。立即注册免费账户。

关于作者
Sergiu Inizian, 技术内容撰稿人 @ WebScrapingAPI
Sergiu Inizian技术内容撰稿人

Sergiu Inizian 是 WebScrapingAPI 的技术内容撰稿人,负责创作清晰、实用的内容,帮助开发者了解产品并有效使用它。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。