什么是 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 的优势与局限,但还有另一种方案值得考虑:使用 WebScrapingAPI 这样的爬虫即服务(SaaS)平台。
使用此类服务具有以下优势:
- 您可以确信该爬虫可靠且维护良好:服务商投入了专门资源确保其始终保持最新状态并正常运行。相比于自行构建和维护爬虫,这能为您节省大量时间和精力。
- 使用网页抓取服务通常比自行开发更具成本效益:您无需投入资源进行抓取工具的开发和维护,还能充分利用服务商提供的各项特殊功能和技术支持。
- 被检测到将不再是问题:高级网页抓取工具能规避检测,其抓取网站的效率和效果通常优于您自行开发的抓取工具。这为您节省了时间,让您能够专注于分析和利用抓取到的数据。
我们诚邀您试用我们的网页抓取工具,亲身体验使用值得信赖且可靠工具带来的优势。立即注册免费账户。




