Node Unblocker 是一个基于 Express 框架的 Node JS 库,用于代理和重写远程网页。它的核心功能是创建一个在机器内充当代理的服务器实例,从而绕过地理或其他访问限制。像其他代理一样,Node Unblocker 接收机器的请求,转发到目标服务器,然后将响应返回给源机器。
Node Unblocker 的设置非常简单,只需几行代码就可以在几乎任何机器上启动实例。除了在机器内创建代理,Node Unblocker 还通过在 HTTP 协议前添加 /proxy/ 来重写 URL,这种变化可能有助于绕过本地网络限制。
由于网络爬虫需要使用代理,Node Unblocker 是那些可以访问第三方机器的人的热门选择。你可以在云服务中设置 Node Unblocker,创建一个可以用于网络爬虫的代理。
然而,Node Unblocker 也有一些限制,它在读取某些高级页面时会遇到问题。你将难以访问社交媒体网络(因为这些网络使用 postMessage,而 Node Unblocker 无法与之交互)以及一些使用 AJAX 或 OAuth 登录表单的高级网站。
Node Unblocker 如何工作?
如上所述,Node Unblocker 在机器内创建一个网络代理服务器,用于读取和发送通常在源机器和目标服务器之间传输的 HTTP 请求。
虽然 Node Unblocker 可以作为一个基本的网络代理运行,但一些高级功能使其即使在你拥有代理池的情况下也具有价值。然而,如果不使用这些高级功能,Node Unblocker 在你拥有良好的住宅代理池时的重要性会显著降低。
大多数高级定制选项可以通过 Node Unblocker 的中间件实现。这些选项会根据你的网络爬虫使用场景而有所不同,但有几个功能可能非常有用:
- 移除 CSP(内容安全策略)有时会泄漏到其他网站并破坏代理。此外,移除 CSP 可以让你执行内联脚本,这在通过 JavaScript 动态加载内容时非常有用。
- Cookies 可以帮助维护会话、导航多步骤工作流程,甚至减少被封锁的几率。
- 重定向功能减少了重定向无法通过代理的可能性。
如果你想修改请求和响应解析行为,中间件通常非常有用,因为大多数这些行为都受到代理提供商的限制。通过 Node Unblocker,你可以轻松修改请求头等方面,使其在网络爬虫和其他项目中非常有用。
另外,配置文件允许你进一步调整 Node Unblocker 网络代理的行为。例如,客户端默认强制 JavaScript 通过代理,但如果需要,可以关闭这一功能。
Node Unblocker 的准备条件
如果你是从零开始,需要准备一些东西来启动 Node Unblocker。
1. Node.JS
在开始创建 Node Unblocker 服务器之前,你需要安装 Node JS 运行环境。
2. 一个集成开发环境 (IDE)
有很多适用于 Node JS 的优秀 IDE,例如 Atom 或 Webstorm。我们将使用 Webstorm,但无论你使用哪个 IDE,原理都是相同的。
3. 一个云服务提供商
虽然你可以在本地机器上运行 Node Unblocker,但你仍然会使用自己的 IP 地址,这使得网络代理在进行网络爬虫时效果大打折扣。
在教程的最后,当应用程序按预期工作时,你将开始使用云服务。
安装和启动 Node JS
一旦你的 IDE 设置并运行起来,你需要初始化一个 Node JS 项目。在终端(或任何等效工具)中输入:
npm init -y
运行“-y”参数会自动回答一些设置问题。你可以移除它并手动回答这些问题,但大多数问题都是关于应用程序的元数据和名称,对我们的目的来说并不那么重要。
然后你需要安装 Node Unblocker 和 Express 包:
npm install unblocker express
Unblocker 是 Node Unblocker 包。Express 是一个允许你通过 Node JS 创建服务器的库。
运行这些命令将创建一个名为“package.json”的新文件,其中包含有关你应用程序的详细信息。在项目目录中创建一个名为“app.js”的新文件并打开它。导入这些库。
const express = require('express') const Unblocker = require('unblocker');
由于我们不会重复使用这些变量,我们可以使用“const”来导入 Express 和 Node Unblocker,这意味着引用不能在之后重新赋值。“Var”也是可以接受的,但在更大的代码库中可能会导致问题。
我们的“require”函数用于导入这些库。它的功能类似于其他语言中的“import”,因为每当它被调用时,Node JS 会在核心模块或第三方模块中查找并加载指定的库。
创建网络代理
const app = express(); const unblocker = new Unblocker({prefix: '/proxy/'}); app.use(unblocker);
我们首先初始化 Express 应用程序,这将允许我们设置服务器并在后续进行配置。
下一行初始化一个 Unblocker 实例,它将使用前缀 /proxy/ 来获取请求。如果你尝试访问没有 /proxy/ 前缀的网站,Unblocker 实例将不会接管请求,而是使用你的常规 IP 地址。因此,所有代理的 URL 都以该前缀开头,而你想正常访问的任何 URL 都不应包含这个前缀。
最后,“app.use” 告诉 Express 应用程序使用 Unblocker 实例作为中间件。所有传入的请求都会经过 Unblocker 实例处理,从而充当你的网络代理。
如果需要,你还可以为你的应用程序设置自定义端口:
const port = 3000;
启动服务器
虽然我们已经设置了 Unblocker 服务器,但仍需要让服务器启动并监听选定的端口:
app.listen(process.env.PORT || port || 8080).on('upgrade', unblocker.onUpgrade); console.log("Node Unblocker Server Running On Port:", process.env.PORT || port || 8080)
我们使用“app.listen”启动服务器,并设置为默认端口或定义的端口(如果你之前使用了“const port”函数),如果都没有找到,则使用8080端口。
我们的函数继续使用“.on”并指定“upgrade”,这用于需要“升级”的各种网络协议(例如 WebSocket)。这两个参数都是 Node Unblocker 服务器处理可能使用 HTTP 以外协议的请求所必需的。
最后,“console.log”只是一个消息,表明 Node Unblocker 服务器正在运行,并显示在哪个端口运行。
本地测试服务器
在将其部署到远程服务器之前,你应该始终在本地运行它,以确保 Node Unblocker 按预期工作。
根据你的 IDE 和操作系统,启动服务器可能会有一些不同的步骤。打开终端并导航到你的项目位置:
cd X:\YOUR\PROJECT\FOLDER
然后,启动服务器:
node app.js
如果你将文件命名为其他名称而不是“app.js”,你需要使用相应的文件名。
现在你可以使用 cURL 或常规浏览器来访问网站。要使用浏览器,只需在浏览器中输入以下 URL(以IPRoyal为例):
http://localhost:8080/proxy/https://iproyal.com/
请注意用于 Node Unblocker 的端口,因为使用错误的端口可能会导致页面无法加载。如果端口正确,你不应该注意到任何不必要的缓冲或延迟,页面应该能够正确加载。
在远程服务器上启动 Node Unblocker
如前所述,你可以在本地机器上运行 Node Unblocker 服务器。如果你需要访问被本地网络管理员限制的网站,这可能会很有帮助。然而,由于 IP 地址相同,你将无法访问地理位置受限的内容。
在云服务器上启动 Node Unblocker 可以让你将其用作网络代理,以规避互联网审查、访问地理位置受限的内容以及绕过大多数其他限制。
你可以使用许多提供商,例如 Heroku、Render 等。我们将使用 Google Cloud Compute Engine,因为它允许我们部署低成本的虚拟机。
首先,按如下方式编辑“package.json”文件:
{ "name": "node-unblocker", "version": "1.0.0", "description": "", "main": "app.js", "private" : true, "keywords": [], "author": "", "license": "ISC", "engines": { "node": "21.x" }, "dependencies": { "express": "^4.18.2", "unblocker": "^2.3.0" }, "scripts": { "start": "node app.js" } }
我们添加了一些新内容,但最重要的是添加“scripts”键值对,因为它为虚拟机提供了运行 Node Unblocker 代理服务器的命令。此外,“engines”键指定了虚拟机应使用的 Node JS 版本。
然后,注册 Google Cloud 并在你的账户上启用 Compute Engine。你将进入一个新菜单,在那里点击“创建实例”。
选择最便宜的虚拟机实例(在撰写本文时为 E2)并点击“创建”。Google 将创建一个符合规格的随机服务器,你可以自由使用。
你需要等待一段时间让实例启动。如果你有一些云服务器的经验,可以使用 SSH 连接到它。否则,你也可以通过点击“SSH”旁边向下的箭头,通过浏览器连接。
你将进入服务器,该服务器应运行 Ubuntu。在完全授权之前,你可能需要多次重新登录你的 Google 账户。
如果你选择了 Ubuntu 或 Debian,你需要稍微调整一下“listen”函数:
app.listen(process.env.PORT || port || 8080, '0.0.0.0').on('upgrade', unblocker.onUpgrade); console.log("Node Unblocker Server Running On Port:", process.env.PORT || port || 8080)
然后,你需要将你的项目文件上传到虚拟机。如果你是通过浏览器连接的,可以点击“上传文件”按钮并选择文件。否则,请使用 SSH 命令:
scp /path/to/file username@a:/path/to/destination
文件发送完成后,在机器上安装 Node JS。首先,你需要添加 NodeSource 仓库,相关指南可以在 Node JS 的 Github 仓库中找到。运行该命令应该会自动安装 Node JS 和 npm。
然后,通过输入以下命令运行应用程序:
node app.js
如果一切正常,使用本地机器的浏览器并输入:
VM_EXTERNAL_IP_ADDRESS:PORT/proxy/https://iproyal.com
如果出现错误,可能需要在VM实例中启用HTTP流量,或者创建允许流量通过所选端口的防火墙规则。
总 结
现在,只要符合你的云服务提供商的使用条款,你可以将代理服务器用于网络爬虫目的。然而,单个代理服务器并不足以长期使用,因为任何 IP 地址都可能很快被封禁。
如果你有一个小项目或可以访问许多云虚拟机,Node Unblocker 代理是一个很好的选择。在这种情况下,你可以创建多个 Node Unblocker 代理,从而减轻被封禁、互联网审查和其他限制的威胁。
然而,对于更大的项目,建议获取更大的代理池。这样每个 IP 地址(或流量)的成本可能会比运行 Node Unblocker 更低,并且提供更好的功能。