您打算构建一个简单的网络抓取工具吗?您是否已经知道如何开始,或者您仍在寻找适合这项工作的工具?那么,就没有必要再继续寻找了。

在本文中,我们旨在指导您如何使用 Node.js 从头开始​​构建可靠的网络抓取工具,Node.js 是构建抓取工具的最佳工具之一。

关于 Node.js 的一切

那么首先,为什么我们推荐使用 Node.js 进行网页抓取? 为了回答这个问题,让我们谈谈 Node.js 到底是什么,以及它相对于其他编程语言的优势是什么。

简而言之,Node.js 是一个开源 JavaScript 运行时环境,可以在 Web 浏览器之外使用。基本上,Node.js 的创建者采用了主要限于 Web 浏览器的 JavaScript,并允许它在个人计算机上运行。借助 Google Chrome 的 v8 引擎,我们现在能够在本地计算机上运行 Javascript,这使我们能够访问文件、侦听网络流量,甚至侦听您的计算机获取的 HTTP 请求并发回文件。还可以像使用 PHP 或 Ruby on Rails 执行的任何操作一样直接访问数据库。

说到编码,不了解Javascript是不可能的。它是当今几乎 95% 的现有网站中用作客户端开发工具的最流行的编程语言。然而,随着 Node.js 的推出,JavaScript 现在已经成为一种通用的全栈开发编程语言。

关于 Node.js 的一切

使用 Node.js 抓取框架的好处

Node.js 成为行业标准的原因有很多。 Netflix、eBay 和 PayPal 等公司已将 Node.js 集成到其核心中。因此,为了让您更广泛地了解为什么要使用 Node.js,我们列出了它的一些优点:

处理速度: Node.js 的速度相当快,这主要归功于 Chrome 的 v8 引擎。它不使用解释器,而是利用引擎将 JavaScript 编译为机器代码。通过处理仅在单个线程中使用事件循环的并发请求,性能得到进一步增强。由于它是针对非阻塞输入输出建模的,因此在同时处理多个请求时会减少 CPU 使用率。

轻量级且高度可扩展: 它能够在不断扩大的工作负载中应对并表现良好,这使其受到大多数开发人员的青睐。 Node.js 通过解耦每个部分,让您更轻松地更新和维护应用程序,同时添加新的甚至修复现有的架构,而无需更改或调整项目或应用程序的其他部分。在开发方面,还可以通过像单独的代码块一样的模块来重用和共享代码。

包/库: 您不会对可与 Node.js 一起使用的大量软件包感到失望。很少有编程语言享有如此丰富的生态系统。从字面上看,有数以千计的工具和库可用于 JavaScript 开发,并且可以通过 NPM(用于发布开源项目的在线存储库)供您使用。有了不断增长的社区的稳定支持,您几乎肯定会找到可以帮助满足您的特定需求的新软件包。

社区支持: 当然,像 Node.js 这样的开源项目将拥有庞大的开发人员社区,通过互联网提供解决方案和指导。无论您是访问 Github 并搜索存储库,还是通过 Stack Overflow 等在线社区寻求答案,您始终都有一个明确的路线来解决在此过程中可能遇到的任何问题。

什么是 Node.js 抓取框架?

Node.js 抓取框架是一组工具、库和约定,旨在简化使用 Node.js 抓取数据的过程。这些框架为开发人员提供了预构建的功能和抽象,可简化常见的抓取任务,例如发出 HTTP 请求、解析 HTML、处理并发和管理数据提取。

Node.js 抓取框架通常提供以下功能:

  • HTTP 请求处理: 发出 HTTP 请求以获取网页的简化方法。
  • HTML 解析: 用于解析和导航 HTML 文档以提取相关数据的工具。
  • 并发管理: 支持同时处理多个抓取任务,提高效率。
  • 数据提取: 使用 CSS 选择器、XPath 或其他方法从 HTML 文档中提取结构化数据的实用程序。
  • 错误处理: 用于处理使用 Node.js 抓取数据期间可能发生的错误的机制,例如连接超时或无效的 HTML 结构。
  • 定制和可扩展性: 用于自定义抓取行为和扩展 Node.js 抓取框架功能以满足特定项目要求的选项。

流行的 Node.js 抓取框架包括 Puppeteer、Cheerio 和 Axios 等。这些框架抽象了许多复杂性 网络抓取,使开发人员能够专注于高效构建强大的抓取应用程序。

为什么使用 Crawlbase 作为您的网络爬虫?

您可以编写城里最好的代码,但您的抓取工具的好坏取决于您的代理。如果您热衷于网络抓取,那么您现在必须知道庞大的代理池应该是爬虫程序不可或缺的一部分。使用代理池将显着增加您的地理位置选项、并发请求数量,以及最重要的是,您的爬行可靠性。但是,如果您的预算有限,这可能会很困难。幸运的是,Crawlbase 对您来说是一个负担得起且可靠的选择。使用 抓取 API 让您可以即时访问数千个住宅和数据中心代理。将其与人工智能相结合,您就可以为您的项目提供最佳的代理解决方案。

如何使用 Node.js 和 Crawlbase 构建 Web Scraper

现在,我们处于最好的阶段。您可以通过几个简单的步骤使用 Node.js 构建网络抓取工具。在开始编码之前我们只需要准备一些东西。那么,话不多说,让我们完成以下步骤:

  1. 创建一个 免费 Crawlbase 帐户 使用 Crawling API 服务。
  2. 打开 Node.js 并创建一个新项目。
  3. 通过终端执行以下命令安装 Crawlbase 模块:
1
npm 我爬虫库
  1. 创建一个新的 .js 文件,我们将在其中编写代码。
  2. 打开 .js 文件并充分利用 Crawlbase 节点库.

对于前两行,请确保通过需要必要的 API 并初始化 Crawlbase 请求令牌来引入所有依赖项,如下所示:

1
2
常量 { 抓取API } = 要求('crawlbase');
常量 接口= 抓取API({ 象征: '你的令牌' });

执行 GET 请求以传递您想要抓取的 URL,并从可用参数中添加任何选项 抓取 API 文档.

代码现在应该如下所示:

1
2
3
4
5
6
7
8
9
10
11
常量 { 抓取API } = 要求('crawlbase');
常量 接口= 抓取API({ 象征: '你的令牌' });

API
.得到('https://www.ebay.com/sch/i.html?_nkw=ryzen+cpu')
.然后((响应) => {
if (回复。状态码 === 200 && 回复。电脑状态 === 200){
领事.日志(回复。身体);
}
})
.捕捉((错误) => 领事.错误);

您还可以使用任何可用的 数据刮板 从 Crawlbase 中获取页面的抓取内容:

1
2
3
4
5
6
7
8
9
10
11
常量 { 抓取API } = 要求('crawlbase');
常量 接口= 抓取API({ 象征: '你的令牌' });

API
.得到('https://www.ebay.com/sch/i.html?_nkw=ryzen+cpu',{ 刮刀: '易趣-serp' })
.然后((响应) => {
if (回复。状态码 === 200 && 回复。电脑状态 === 200){
领事.日志(回复。身体);
}
})
.捕捉((错误) => 领事.错误);

代码已完成,Windows下按F5即可运行。

JSON代码输出

这段简单的代码将使用 Crawling API 抓取任何 URL,该 API 构建在数百万个代理之上,并将以 JSON 格式返回结果。但是,如果不向您展示如何使用 Node.js 中的其他可用包正确地抓取信息,本指南将是不完整的。

使用 Cheerio 构建网络爬虫

所以,让我们构建另一个版本的刮板,但这一次,我们将集成 切里奥,一个可用于 Node 的模块,专门为网络抓取而构建。有了它,我们可以更轻松地使用 jQuery 从网站中选择特定内容。

在这个例子中,我们将尝试在 Newegg 上获取产品的产品名称和当前价格。

让我们从安装 Cheerio 包开始:

1
npm 我欢呼

此时,您可以选择覆盖之前的代码或创建一个新的 .js 文件并再次声明常量。

1
2
3
4
常量 { 抓取API } = 要求('crawlbase');
常量 欢呼= 要求('cheerio');

常量 接口= 抓取API({ 象征: '你的令牌' });

通过发出带有 if/else 语句的 GET 请求来正确设置条件,从而将目标 URL 再次传递给 API。

1
2
3
4
5
6
7
8
9
10
API
.得到('https://www.newegg.com/samsung-860-evo-series-500gb/p/N82E16820147670?Item=9SIA12K6U07909')
.然后((响应) => {
if (回复。状态码 === 200 && 回复。电脑状态 === 200){
解析HTML(回复。身体);
} 其他 {
领事.日志('失败的: ', 回复。状态码, 回复。原始状态, 回复。电脑状态);
}
})
.捕捉((错误) => 领事.错误);

最后,为 Cheerio 创建一个函数来解析 HTML 并找到产品名称和价格的特定 CSS 选择器。

1
2
3
4
5
6
7
8
9
10
11
功能 解析HTML(HTML){
常量 $ = 快乐。加载(html);
// 查找产品名称
常量 产品 = $('.product-wrap');
常量 标题 = 产品.发现('h1').文本();
领事.日志('产品名称:', 标题);
// 查找当前价格
常量 价格 = $('.product-price');
常量 当前价格 = pPrice。发现('.product-price > ul:nth-child(1) > li:nth-child(3)').文本();
领事.日志('打折后价格:', 目前的价格);
}

完整的刮板现在应该如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
常量 { 抓取API } = 要求('crawlbase');
常量 欢呼= 要求('cheerio');

常量 接口= 抓取API({ 象征: '你的令牌' });

功能 解析HTML(HTML){
常量 $ = 快乐。加载(html);
// 查找产品名称
常量 产品 = $('.product-wrap');
常量 标题 = 产品.发现('h1').文本();
领事.日志('产品名称:', 标题);
// 查找当前价格
常量 价格 = $('.product-price');
常量 当前价格 = pPrice。发现('.product-price > ul:nth-child(1) > li:nth-child(3)').文本();
领事.日志('打折后价格:', 目前的价格);
}

API
.得到('https://www.newegg.com/samsung-860-evo-series-500gb/p/N82E16820147670?Item=9SIA12K6U07909')
.然后((响应) => {
if (回复。状态码 === 200 && 回复。电脑状态 === 200){
解析HTML(回复。身体);
} 其他 {
领事.日志('失败的: ', 回复。状态码, 回复。原始状态, 回复。电脑状态);
}
})
.捕捉((错误) => 领事.错误);

执行代码以获取结果:

代码输出

使用 Node.js 进行高效网页抓取的提示和技巧

当您想使用 Node.js 构建网络抓取工具时,请遵循以下提示和技巧,以使您的抓取过程更顺畅、更高效。以下是一些关键提示和技巧的概述:

  • 查看网站条款: 在使用 Node.js 抓取数据之前,请花点时间查看网站的使用条款。确保不禁止抓取,并注意频率的任何限制。
  • 管理 HTTP 请求: 为了避免网站不堪重负,请限制 HTTP 请求的数量。控制请求的频率有助于防止使用 Node.js 抓取数据期间的过载和潜在问题。
  • 适当设置标题: 通过在 HTTP 请求中设置适当的标头来复制常规用户行为。这可以帮助您融入并减少被检测为机器人的机会。
  • 实施缓存: 通过缓存网页和提取数据来减轻网站的压力。这不仅减轻了负担,还加快了抓取过程。
  • 处理错误: 了解由于网站的多样性,网络抓取可能会很棘手。准备好遇到错误并优雅地处理它们。
  • 监控和调整: 密切关注您的抓取活动。监控性能指标并根据需要调整抓取设置,例如速率限制和标头,以确保平稳运行。

借助这些久经考验的小技巧,享受使用 Node.js 顺利抓取数据的过程!

结论

希望本文能够阐明 Node.js 非常适合 Web 抓取。我们向您展示了如何使用 Node.js 构建网络抓取工具。我们构建的简单抓取工具展示了 v8 引擎在发出 HTTP 请求时的优化程度,并且每次抓取的快速处理速度将为您在抓取内容时节省宝贵的时间。该语言本身非常轻量级,可以轻松地由大多数现代机器处理。它也适用于任何项目规模,从我们这里的单一抓取指令到企业使用的大型项目和基础设施。

Cheerio 只是 Node 中提供的数千个包和库之一,确保您始终拥有适合您选择的任何项目的正确工具。您可以使用此处的示例构建一个简单的网络抓取工具,并从您想要的任何网站获取您需要的任何内容。 Node生态系统将给您自由和无限的可能性。也许现在唯一的限制是你的创造力和学习意愿。

最后,如果您想要一个有效且高效的网络抓取工具,最好使用代理来避免阻止、验证码以及抓取不同网站时可能遇到的任何连接问题。使用 爬行工具刮刮工具 Crawlbase 将为您节省无数时间寻找解决方案来绕过被阻止的请求,以便您可以专注于您的主要目标。在 Crawlbase 人工智能的帮助下,您可以放心,发送到 API 的每个请求都将提供尽可能最佳的数据结果。