您是否打算构建自己的网络爬虫? 您是否已经知道如何开始,或者您还在为这项工作寻找合适的工具? 那么,就没有必要再搜索了。 在本文中,我们的目标是指导您如何使用 Node.js 从头开始​​构建可靠的网络爬虫,Node.js 是构建爬虫的最佳工具之一。

为什么使用 Node.js?

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

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

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

Node.js 代码

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

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

轻量级和高度可扩展性 - 它在不断扩大的工作量中应对和表现良好的能力使其对大多数开发人员有利。 Node.js 通过在您添加新架构甚至修复现有架构时解耦每个部分来更轻松地更新和维护应用程序,而无需更改或调整项目或应用程序的其他部分。 在开发方面,也可以通过类似于单独代码块的模块来重用和共享代码。

包/库 - 您不会对可以与 Node.js 一起使用的大量软件包感到失望。 很少有编程语言能享受如此繁茂的生态系统。 从字面上看,成千上万的工具和库可用于 JavaScript 开发,可通过 NPM 随时供您使用,NPM 是用于发布开源项目的在线存储库。 在不断增长的社区的稳定支持下,您几乎可以保证找到可以帮助您满足特定需求的新软件包。

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

为什么将 ProxyCrawl 用于您的网络爬虫

你可以编写城里最好的代码,但你的爬虫只会和你的代理一样好。 如果您喜欢网络抓取,那么您现在必须知道庞大的代理池应该是爬虫不可或缺的一部分。 使用代理池将显着增加您的地理位置选项、并发请求的数量,最重要的是,您的爬网可靠性。 但是,如果您的预算有限,这可能会很困难。 但幸运的是,ProxyCrawl 是您负担得起且可靠的选择。 通过使用 抓取 API,您将可以立即访问数以千计的住宅和数据中心代理。 将此与人工智能相结合,您将拥有适合您项目的最佳代理解决方案。

使用 Node.js 和 ProxyCrawl 构建网络爬虫

现在,我们处于最好的状态。 在 Node.js 中构建你的爬虫比你想象的要容易,我们只需要在开始编码之前先准备一些东西。 因此,事不宜迟,让我们完成以下步骤:

  1. 创建一个 免费的 ProxyCrawl 帐户 使用 Crawling API 服务。

  2. 打开 Node.js 并创建一个新项目。

  3. 通过执行以下命令,通过终端安装 ProxyCrawl 模块:
    npm 我代理爬行

  4. 创建一个新的 .js 文件,我们将在其中编写代码。

  5. 打开 .js 文件并充分利用 ProxyCrawl 节点库.

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

1
2
常量 { 抓取API } = 要求('代理爬行');
常量 api = 抓取API({ 象征: '你的令牌' });
  1. 执行 GET 请求以传递您希望抓取的 URL,并从可用参数中添加所需的任何选项 抓取 API 文档.

代码现在应该如下所示:

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

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

您还可以使用任何可用的 数据刮板 来自 ProxyCrawl ,因此您可以取回页面的抓取内容:

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

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

代码已完成,您可以在 Windows 上按 F5 运行它。

JSON 代码

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

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

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

  1. 让我们从安装 Cheerio 包开始: npm 我欢呼

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

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

常量 api = 抓取API({ 象征: '你的令牌' });
  1. 通过使用 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(回复。身体);
} 其他 {
领事.日志('失败的: ', 回复。状态码, 回复。原始状态, 回复。电脑状态);
}
})
.捕捉((错误) => 领事.错误);
  1. 最后,为 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 } = 要求('代理爬行');
常量 欢呼= 要求('cheerio');

常量 api = 抓取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 非常适合 Web 抓取。 我们构建的简单抓取工具展示了 v8 引擎在执行 HTTP 请求时的优化程度,并且每次抓取的快速处理速度将为您在抓取内容时节省宝贵的时间。 该语言本身非常轻量级,可以很容易地被大多数现代机器处理。 它也适用于任何规模的项目,从像我们这里的单一抓取指令到企业使用的大型项目和基础设施。

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

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