如何使用Node.js构建网络爬虫
如何提高工作效率,尤其是在需要同时处理多项任务并在短时间内完成大量工作的情况下?我们都遇到过这样的情况:领导指示我们从互联网上获取(抓取)信息,尤其是在团队中需要大量手动操作才能完成工作时。用笔和纸记录信息很容易出错,也可能遗漏网站上的特定信息。
本教程将演示如何自动抓取网站数据并将其用于任何用途。
沙盒
您可以在CodeSandbox上找到已完成项目的源代码。您可以 fork 项目,修改脚本并运行代码。
<CodeSandbox title="scrape the web" id="web-scraper-nxmv8" />
先决条件
作为开发者,您需要具备 JavaScript 的基础知识才能完成使用 Node.js 和 Express 构建的项目。此外,要完成以下步骤,我们需要执行以下操作:
- 我们的电脑上已经安装了 Node.js。我们使用
npm包管理器来安装程序所需的依赖项。 - 我们将使用我们选择的一款代码编辑器。
当您从官方文档安装Node时,即可使用 NPM。
安装
使用以下命令创建节点服务器。
npm init -y
package.json上述命令使用 npm 在项目根目录创建一个文件来初始化我们的项目,并使用-y默认标志来接受默认设置。我们将从expressnpm 注册表安装该软件包,以便编写运行服务器的脚本。
初始化完成后,我们需要安装依赖项express,,cheerio和axios。
npm install express cheerio axios
express一个快速灵活的Node.js Web框架cheerioCheerio 是一个解析标记并提供 API 的软件包,用于遍历/操作生成的数据结构。Cheerio 的实现与 jQuery 完全相同。axios一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js。
使用 Node.js 创建服务器
在我们的app.jsJavaScript 文件中,我们使用以下代码导入 Express.js,创建 Express 应用程序的实例,并最终将应用程序作为 Express 服务器启动。
const express = require('express');
const app = express();
const PORT = process.env.port || 3000;
app.listen(PORT, () => {
console.log(`server is running on PORT:${PORT}`);
});
在命令行启动应用程序之前,我们需要安装nodemon开发依赖项。
npm install nodemon --save-dev
Nodemon 是一个用于 Node.js 应用开发过程中的监控脚本。此外,我们将配置该package.json文件,以便我们的应用无需重启即可运行。
{
"scripts": {
"start": "nodemon app.js"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}
现在在命令行中使用 启动应用程序npm start,命令行应该会输出以下内容。
server is running on PORT:3000
Express.js适用于路由,我们将在本教程后面看到。
创建爬虫
服务器设置完成后,我们将部署网络爬虫,帮助您在几分钟内提高工作效率和生产力。
现在,在同一个文件中,app.js我们将导入该包,向表示状态转移axios(REST)端点发送 HTTP 请求以执行 CRUD 操作。
const express = require('express');
const axios = require('axios')
const app = express();
const PORT = process.env.port || 3000;
const website = 'https://news.sky.com';
try {
axios(website).then((response) => {
const html = response.data;
console.log(html);
});
} catch (error) {
console.log(error, error.message);
}
app.listen(PORT, () => {
console.log(`server is running on PORT:${PORT}`);
});
从上面的代码片段可以看出,我们使用了 axios。Axios 通过链式调用接收网站的 URL,解析完成后,我们就可以在命令行中收到来自新闻网站的响应。
数据抓取
要抓取新闻网站的 URL 数据,请将app.js以下内容更新到我们的文件中。该cheerio软件包将实现此功能。
const express = require('express');
const axios = require('axios');
const cheerio = require('cheerio');
const app = express();
const PORT = process.env.PORT || 3000;
const website = 'https://news.sky.com';
try {
axios(website).then((res) => {
const data = res.data;
const $ = cheerio.load(data);
let content = [];
$('.sdc-site-tile__headline', data).each(function () {
const title = $(this).text();
const url = $(this).find('a').attr('href');
content.push({
title,
url,
});
app.get('/', (req, res) => {
res.json(content);
});
});
});
} catch (error) {
console.log(error, error.message);
}
app.listen(PORT, () => {
console.log(`server is running on PORT:${PORT}`);
});
让我们一起来分析上面的代码。
- 该
cheerio软件包使我们能够通过读取页面上的元素来操作 DOM。我们将只抓取页面上需要抓取的特定元素。 - 为了解析 HTML,我们利用
cheerio.load(data)解析器解析页面上的所有 HTML 并将其保存到一个变量中const $。 - 要查找网站上具有标题的特定元素,我们检查页面并复制标签的类名
h3。
- 对于每个标题,我们希望使用 `getText`
text()和指向标题的链接来获取文本,该标题具有 `title` 属性href。 - 现在,为了将所有数据抓取到 JSON 文件中,我们创建一个包含变量的空数组
content。有了这个数组,我们需要将保存的数据推送到一个对象中title,URL并使用 push 方法向该对象显示所有客户端抓取的数据GET,app.get并通过一个端点进行显示/。 - 最后,我们执行语句块中的代码
try...catch。catch如果发生异常,则执行该语句。异常即为错误。
网站抓取过程完成后,我们现在得到了抓取到的 JSON 格式数据。
概括
既然你已经了解了如何使用 Express.js 框架和 Node.js 创建网络爬虫,那么你完全可以尝试用它来抓取任何你选择的网站,从而节省时间并获取准确的数据。
这篇文章探讨了如何抓取网站数据,以及如何利用这种方法提高效率,你可以将这种方法复制到尽可能多的网站 URL 上。
在此处克隆并 fork 完整的源代码。
延伸阅读
接下来你可以做什么?
要体验我们开发的功能,您可以从服务器获取数据,并在您的前端应用程序中调用它。
欢迎在Twitter上分享你的作品,如果你觉得这篇文章有用,也请留言。
文章来源:https://dev.to/terieyenike/how-to-build-a-web-scraper-with-nodejs-f6h


