我们都讨厌那种试图访问某个页面时,网站却毫无理由地阻止我们请求的时刻。例如,地理限制只能通过使用代理才能绕过。
Node-unblocker 能帮助我们创建自定义代理,并在几分钟内完成部署。

我们都讨厌那种试图访问某个页面时,网站却毫无理由地阻止我们请求的时刻。例如,地理限制只能通过使用代理才能绕过。
Node-unblocker 能帮助我们创建自定义代理,并在几分钟内完成部署。
Node-unblocker 是一个通用库,用于创建 Web 代理,拦截并修改请求和响应。
该库还常用于网页抓取,以绕过网站实施的限制(如地理封锁、隐藏 IP 地址和速率限制),或用于发送认证令牌。
简而言之,使用该库后,您将告别被屏蔽和审查的内容。
在本文中,我们将使用 Node-Unblocker 创建一个带有自定义代理的 Express 应用程序,添加一个用于更改每个请求用户代理的中间件,讨论代理的局限性,将其部署到 Heroku,并将其与 WebScrapingAPI 等托管服务进行比较。
开始之前,请确保已安装最新版本的 Node.JS。各平台(Windows、Linux、Mac)的 Node.JS 安装方法将另文详述,因此在此不作赘述,请访问官方网站并按照说明进行操作。
首先,我们创建一个名为 unblocked 的项目目录,并在其中初始化一个 Node.JS 项目:
mkdir unblocked
cd unblockednpm init
对于本应用,我们将安装两个库:Express(一个面向 Node.JS 的极简框架)和 Node Unblocker。
npm install express unblocker
由于 node.unblocker 是在 Express 实例中运行的,因此我们需要在应用程序中设置“Hello World”示例。
创建一个 index.js 文件,并粘贴以下代码:
const express = require('express') const app = express() const port = 8080 app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Example app listening on port ${port}`) })
我们可以使用以下命令运行应用程序:
node index.js
访问 http://localhost:8080 即可看到“Hello World”消息。这表明我们的应用程序已成功运行。
现在是时候将 Node Unblocker 库导入到我们的应用程序中了:
var Unblocker = require('unblocker')
我们创建一个 Node Unblocker 实例并传入 proxy 参数。您可以在此处查看所有可用参数的完整列表。
var unblocker = new Unblocker({prefix: '/proxy/'})
我们将 Node Unblocker 库作为中间件注册到 Express 中,以便拦截请求:
app.use(unblocker)
我们更新 Express 应用程序监听器以添加对 WebSockets 的支持:
app.listen(process.env.PORT || 8080, () => { console.log(`Example app listening on port ${port}`) }).on('upgrade', unblocker.onUpgrade)
完成所有这些步骤后,我们的应用程序应呈现如下状态:
const express = require('express') const Unblocker = require('unblocker') const app = express() const port = 8080 const unblocker = new Unblocker({prefix: '/proxy/'}) app.use(unblocker) app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Example app listening on port ${port}`) }).on('upgrade', unblocker.onUpgrade)
重启应用程序,并在浏览器中访问以下 URL:
http://localhost:8080/proxy/https://webscrapingapi.com
为确保代理按预期工作,请在浏览器中打开开发者工具并检查“网络”选项卡。所有请求都应通过代理进行。
若代理出现任何问题,建议通过设置 DEBUG 环境变量来启用调试模式。使用以下命令以调试模式启动代理:
DEBUG=unblocker:* node index.js
在生产环境中启用此功能绝非明智之举,因此请仅将其保留在开发环境中。
Nodeunblocker 不仅是一个自定义代理解决方案,还允许通过中间件拦截和修改进出请求。
我们可以利用此功能,根据资源类型或域名阻止特定资源加载,更新用户代理,替换返回内容,或在请求头中注入认证令牌。
您可以在这里找到完整的示例列表。
让我们先创建一个用于设置自定义用户代理的中间件。创建一个名为 user-agent.js 的文件,并向其中添加以下代码:
module.exports = function(userAgent) {
function setUserAgent(data) {
data["headers"]["user-agent"] = userAgent
}
return setUserAgent
}该函数通过 userAgent 参数接收自定义用户代理,并使用 setUserAgent 函数将其注册到 data 对象中。Node Unblocked 会在每次请求时调用 setUserAgent 函数。
const userAgent = require('./user-agent')
我们在 Unblocker 构造函数中设置 requestMiddleware 参数,这样就大功告成了。
const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})我们的 index.js 文件应如下所示:
const express = require('express')
const Unblocker = require('unblocker')
const userAgent = require('./user-agent')
const app = express()
const port = 8080
const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})
app.use(unblocker)
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(process.env.PORT || 8080, () => {
console.log(`Example app listening on port ${port}`)
}).on('upgrade', unblocker.onUpgrade)现在是时候检查代码是否正常工作了。我们需要修改 node-unblocker 的 URL,以确保请求头已正确更新。
重启应用程序,并在浏览器中打开以下 URL:
http://localhost:8080/proxy/https://www.whatsmyua.info/
如果网站显示 nodeunblocker/1.5,说明我们的中间件正常工作。
代理运行后,是时候将其部署到 Heroku 了。Heroku 是一个平台即服务(PaaS)平台,允许我们在云端完全创建、发布和管理应用程序。
请注意,并非所有服务商都允许在其基础设施上运行代理和网络爬虫应用。只要不忽略 robots.txt 中的规则,Heroku 便接受此类应用。
在明确了法律问题后,让我们开始准备项目部署。
我们需要在 package.json 文件中设置启动脚本和引擎。
`engines` 属性告知 Heroku,我们的环境需要安装最新版本的 Node.JS 16。当环境配置完成且应用程序准备就绪时,启动脚本将被执行。
我们的 package.json 应如下所示:
{
"name": "unblocked",
"version": "1.0.0",
"main": "index.js",
"engines": {
"node": "16.x"
},
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1",
"unblocker": "^2.3.0"
}
}Heroku 让 Node.JS 应用的部署变得轻而易举。在进入下一节之前,请确保您已安装 Heroku CLI 和 Git 工具。
请在本地终端中使用以下命令与 Heroku 进行身份验证:
heroku login
运行以下命令创建一个新的 Heroku 应用程序:
heroku apps:create
该命令将返回应用程序的 ID 以及一个 Git 仓库。让我们使用该 ID 来设置仓库的远程源:
git initheroku git:remote -a [YOUR_APP_ID]
由于将 `node_modules` 文件夹纳入版本控制绝非明智之举,因此请创建一个 `.gitignore` 文件并将该文件夹添加其中。
在代码进入生产环境前的最后一步是提交并部署。让我们添加所有文件,创建一个提交,并将主分支合并到 Heroku 分支中。
git add .
git commit -am "Initial commit"git push heroku master
几秒钟后,应用程序将部署到 Heroku。恭喜!现在可以在浏览器中访问它,并确保其正常运行。
请使用以下 URL 结构构建 Heroku 访问地址:
[HEROKU_DYNO_URL]/proxy/https://webscrapingapi.com
如果您忘记或丢失了 Dyno URL,可以使用以下命令获取当前应用的相关信息:
heroku info
这种自定义代理的简易配置伴随着一个限制:它仅适用于简单网站,而无法处理复杂任务。其中部分限制无法克服,需要使用其他库或第三方服务。
像 WebScrapingAPI 这样的托管服务不仅解决了所有这些限制,还提供了自动验证码破解、住宅代理以及高级规避机制等额外功能,以防止 Akamai、Cloudflare 和 Datadome 等服务检测到您的请求。
在考虑将 Node Unblocker 应用于生产环境项目之前,请务必了解以下限制。
OAuth 是 Facebook、Google、YouTube、Instagram 和 Twitter 等现代网站首选的身份验证标准。任何使用 postMessage 的库都无法与 Node Unblocker 协同工作,而您可能已经猜到了,OAuth 需要 postMessage 才能正常运行。
如果您愿意为了使用该库而放弃 57% 的互联网流量,那么请随意将其添加到您的项目中。
YouTube、HBO Max、Roblox、Discord、Instagram 等网站无法正常访问,且目前尚无明确时间表来发布能支持这些网站的版本。
我们欢迎社区贡献补丁来解决这些问题,但在有人提交拉取请求之前,你将无法从这些网站抓取任何数据。
Cloudflare 提供一项默认在所有账户上启用的免费检测服务。我们的自定义代理服务器将在数秒内被检测到,屏幕上将显示验证码提示。
约 80% 的网站使用 Cloudflare CDN。若请求被验证码拦截,您的爬虫程序可能就此终结。
尽管配置自定义代理很简单,但维护工作将产生巨大的开销,并使您无法专注于业务目标。
您将不得不处理代理实例的运行、配置自动扩展基础设施、应对并发问题以及管理集群。这些工作无穷无尽。
现在,您已在 Heroku 上运行了一个 Web 代理,并对如何配置、部署以及其局限性有了深入了解。如果您计划将其用于业余项目,Node Unblocker 是一个不错的选择。
但这些缺点以及社区支持的匮乏,使得它无法用于任何生产环境中的应用程序。
像 WebScrapingAPI 这样的托管服务则完全没有这些限制,它不仅提供庞大的数据中心、移动和住宅代理池,还支持通过单个参数灵活调整地理位置、修改请求头以及创建 Cookie。

索林·马里卡(Sorin Marica)是 WebScrapingAPI 的全栈及 DevOps 工程师,负责开发产品功能并维护确保平台平稳运行的基础设施。