如何在 Node.js 中使用 Cheerio 抓取网页
在这里,我将向您展示如何在 Node.js 中使用 Cheerio 从网站上抓取数据。我们将逐步介绍整个过程:设置项目、发出 HTTP 请求和提取必要的数据。在本指南结束时,您将知道如何以简洁的格式(如 JSON)收集和保存数据,以便在您的项目中轻松使用。准备好了吗?让我们开始吧!
什么是 Cheerio?
Cheerio 是一个基于 htmlparser2 的快速、轻量级 JavaScript 库。它允许你以与 jQuery 非常相似的方式处理 HTML,从而轻松地从 HTML 文档中选择、操作和提取数据。Cheerio 专为在 Node.js 等服务器端环境中使用而设计,因此是网络搜刮任务的最佳选择。
由于 Cheerio 是为 Node.js 构建的,因此它并不打算像 Puppeteer 或 Playwright 那样渲染或模拟浏览器。相反,它直接对页面的 HTML 标记进行操作,让你可以高效地对其进行解析和交互。
Cheerio 提供类似 jQuery 的语法,简单易懂,是初学者和经验丰富的开发人员的理想工具。不确定应该选择 Cheerio 还是 BeautifulSoup?请查看我们的文章 Cheerio vs. BeautifulSoup.
跳过手动扫描
如果你想跳过手动网络搜索,我已经创建了详细的 最佳数据集网站 和 最佳网络搜刮工具.现在,让我们继续我们的指南!
先决条件
在开始之前,你需要在电脑上设置一些东西:
- Node.js: JavaScript 运行环境,用于执行我们的搜索代码。
- npm (Node Package Manager): 这将用于安装项目所需的库。
- 代码编辑器 使用 Visual Studio 代码 或 Sublime Text 来编写和运行代码。
如果您不确定是否安装了 Node.js 和 npm,可以打开终端(或命令提示符)并键入以下内容进行检查:
node -v
npm -v
如果这些命令返回的是版本号,您就可以使用了!否则,请从以下网址下载并安装 Node.js nodejs.org.
设置项目
首先,让我们建立一个简单的 Node.js 项目,在其中安装 Cheerio 和 Axios(一种流行的 HTTP 请求客户端)。请按照以下步骤设置项目:
步骤 1:创建项目目录
首先为项目创建一个文件夹。打开终端,运行以下命令创建新目录:
mkdir cheerio-web-scraping
CD cheerio-web-scraping
这将创建一个名为 cheerio-web-scraping 的新文件夹,并将你移入其中。
第 2 步:初始化 Node.js 项目
接下来,初始化一个新的 Node.js 项目。这将创建一个 package.json 文件来管理项目的依赖关系:
npm 启动 -y
-y标志会自动对所有提示回答 "是",并以默认值创建 package.json 文件。
第 3 步:安装依赖项
现在,让我们安装 Cheerio 和 Axios。在终端运行
npm install cheerio axios
- Cheerio 是我们用来解析和处理 HTML 的库。
- Axios 是一种 HTTP 客户端,可轻松向网站发送请求并获取 HTML 返回信息。
步骤 4:创建第一个脚本
在项目文件夹中创建一个名为 index.js 的新文件。这将是你编写刮擦代码的主要文件。
现在我们已经建立了我们的项目,是时候编写脚本来抓取网页了!
用 Cheerio 抓取网页
让我们从扫描一个简单的网页开始。在这个示例中,我们将抓取一个电子商务网站,收集产品的详细信息,如图片、名称和价格。但在开始扫描之前,我们先检查一下网页的结构。
检查页面
在本例中,我们将从一个演示电子商务商店中抓取产品。首先,在浏览器中打开要抓取的网站,然后使用浏览器的开发工具(在 Chrome 浏览器或 Firefox 浏览器中右键单击页面并选择 "检查")来查看 HTML 结构。
查找包含要提取的数据的类名或 HTML 元素等模式。在这种情况下,假设我们想为每个产品收集以下数据:
- 产品图片 URL
- 产品名称
- 产品价格
编写刮刀
检查了页面并确定了结构后,就该编写刮擦代码了。打开 index.js 文件,添加以下代码:
const axios = require('axios');
const cheerio = require(cheerio);
const fs = require(fs);
// 我们要搜索的网站的 URL
const targetURL = 'https://www.example.com/products';
// 搜索产品数据的功能
const 获取产品 = ($) => {
// 选择页面上的所有产品项目
const 产品 = $(产品项目);
const productData = [];
// 循环浏览每个产品项目
产品each((index, element) => {
const 产品 = {};
// 提取产品图片 URL
产品图像 = $(元素)。find(图像).attr(src);
// 提取产品名称
产品name = $(元素)。find('.product-name').text();
// 提取产品价格
产品price = $(元素)。find('.product-price').text();
// 将产品数据导入数组
产品数据。push(产品);
});
// 将搜刮到的数据保存到 JSON 文件中
fs.写入文件('products.json, JSON.串化(产品数据 null, 2), (err) => {
if (err) {
console.error(向文件写入数据时出错:',err);
return;
}
console.log(写入 products.json 的数据);
});
};
// 使用 Axios 获取页面的 HTML 代码
axios.get(targetURL)
.then(response => {
const $ = cheerio。load(回应。data);
获取产品($); // 调用函数搜索产品
})
.catch(error => {
console.error(获取页面时出错:', error);
});
代码如何工作
提出 HTTP 请求:
- 我们使用 Axios 向我们要抓取的网页(targetURL)发出 GET 请求。
- 响应数据是页面的 HTML 内容。
用 Cheerio 解析 HTML
我们使用 Cheerio(cheerio.load(response.data))加载 HTML 响应,它为我们提供了一个类似于 jQuery 的界面来与 HTML 进行交互。
提取数据:
- 我们使用 Cheerio 选择器($('.product-item')、$(element).find('img')等)来查找页面上的特定元素。
- 对于每个产品,我们都会提取图片 URL、产品名称和价格。
保存数据
数据存储在一个数组(productData)中,一旦所有产品都被刮除,我们就使用 fs.writeFile 将数据写入 JSON 文件。
运行刮刀
要运行刮板,请打开终端,导航到项目文件夹,然后运行:
node index.js
脚本完成后,将在项目文件夹中创建一个名为 products.json 的文件,其中包含刮擦的数据。
处理错误和边缘情况
刮擦时,必须处理潜在的错误。例如,您正在抓取的网页可能无法加载,或者 HTML 结构可能发生变化。下面是一些处理这些问题的策略:
检查 HTTP 错误: 始终优雅地处理 HTTP 错误(如 404 或 500 错误)。Axios 有一个内置的 .catch() 方法来处理错误。
缺失数据: 并非每个产品都包含所有元素。要处理缺失数据,可以在尝试访问元素值之前检查该元素是否存在:
product.img = $(element).find(图像).attr(src) || 默认图像.jpg;
速率限制和阻断 某些网站可能会阻止搜索机器人。为避免这种情况,您可以
- 增加请求之间的延迟。
- 使用轮流代理服务。
- 尊重网站的 robots.txt 文件,其中说明了网站的刮擦政策。
结论
就是这样!现在你知道如何在 Node.js 中使用 Cheerio 搜刮网页了。我们介绍了从项目设置、HTTP 请求到解析 HTML 并将数据保存为干净的 JSON 文件的所有内容。
网络搜刮是一种非常有用的工具,但一定要记住遵守网站的服务条款。有些网站不允许刮擦,有些网站可能有反僵尸措施。因此,要确保你的搜刮工具能应对这些挑战。有了这些基础知识,你就可以开始在任何网站上搜刮你需要的数据了。祝你搜刮愉快,项目顺利!