网络代理帮助你在浏览网页时保持你的隐私并绕过各种限制。他们隐藏你的细节,如请求来源或IP地址,并通过额外的软件甚至可以绕过诸如速率限制的东西。
node-unblocker就是这样一个网络代理,它包括一个Node.js库的形式。你可以用它来进行网页爬取和访问地理限制的内容,以及其他功能。
在这篇文章中,你将学习如何实现和使用node-unblocker。
什么是node-unblocker?
node-unblocker宣传自己是一个 “用于逃避互联网审查的网络代理”。它是一个Node.js库,与Express兼容的API,允许你快速启动和运行你的代理。由于它的JS界面,它是高度通用的,可以用在许多方面。
像node-unblocker这样的可编程代理的一个用例是网页爬取。代理网络请求允许你绕过地理限制并隐藏你的IP;通过多个代理实例,你还可以避免速率限制。总的来说,代理极大地限制了你的机器人被封锁的概率。
实施node-unblocker
要设置node-unblocker,确保你的系统已经安装了Node.js和npm。你可以通过遵循Node.js网站的官方指南或使用像nvm这样的版本管理工具来做到这一点。
创建脚本
首先,创建一个新的文件夹,初始化一个npm项目,并安装必要的依赖项。
mkdir proxy cd proxy npm init -y npm install unblocker express
Express将允许你快速创建一个网络服务器,而unblocker则是npm包的名称住房node-unblocker。
安装了必要的软件包后,你可以开始在一个新的index.js文件中实现你的代理。
从require()开始,将你的依赖关系require()
-ing 其中。
const express = require("express"); const Unblocker = require("unblocker");
接下来,创建一个Express应用程序和一个新的Unblocker
实例。
// ... const app = express(); const unblocker = new Unblocker({ prefix: "/proxy/" });
node-unblocker通过它的config对象接受了广泛的选项。你可以配置该库的几乎所有方面,从请求细节到自定义中间件。事实上,由于代理的大部分功能是作为中间件实现的,你也可以根据你的需要有选择地启用其功能。
在上面的片段中,只有前缀
属性被设置。这将在以后表明在什么路径上可以访问代理,在这种情况下 –/proxy/
。
由于Express兼容的API,你需要做的是将代理实例与你的Express服务器连接起来,这就是调用use()
方法。
// ... app.use(unblocker);
最后,使用listen()
方法启动你的Express服务器。
// ... app.listen(process.env.PORT || 8080).on("upgrade", unblocker.onUpgrade); console.log("Proxy is running on port:", process.env.PORT || 8080)
现在,服务器将在由PORT
环境变量设置的端口上运行,而默认为8080
。此外,upgrade
事件处理程序(onUpgrade
方法)已被附加到服务器。当连接协议从已建立的HTTP升级(或改变)到例如WebSocket时,这将通知代理,从而实现对此类连接的正确处理。
这就是你的脚本应该有的样子:
const express = require("express"); const Unblocker = require("unblocker"); const app = express(); const unblocker = new Unblocker({ prefix: "/proxy/" }); app.use(unblocker); app.listen(process.env.PORT || 8080).on("upgrade", unblocker.onUpgrade); console.log("Proxy is running on port:", process.env.PORT || 8080);
测试代理
通过使用Node.js运行该脚本来测试代理的实现:
node index.js
如果一切工作正常,你应该在终端看到console.log()
信息。
为了验证代理是否工作,取一个URL,用localhost:[port]/proxy/
作为前缀,例如:http://localhost:8080/proxy/https://www.dailiservers.com/。在你的DevTools中,你应该看到所有的请求都通过代理。
如果代理出现任何问题,设置DEBUG
环境变量可以看到每个请求的详细信息。
DEBUG=unblocker:* node index.js
部署到Heroku
现在你有了一个有效的代理,你可以把它部署到远程服务器上,如Heroku。
可接受的使用政策
在你将任何网络刮削或代理应用程序部署到远程服务器之前,你应该了解其可接受的使用政策。并非所有的供应商都允许在他们的服务器上托管这种应用程序,许多供应商只在严格的条件下才允许这样做。
就Heroku而言,其政策不允许在不尊重机器人排除标准(如robots.txt
文件)和提供独特的用户代理字符串的情况下,为公共用途或网页爬取提供主机代理。在与Heroku合作的过程中,请记住这一点。
准备剧本
要将你的应用程序部署到Heroku,首先要调整你的package.json
文件。
{ "name": "proxy", "version": "1.0.0", "main": "index.js", "private": true, "engines": { "node": "16.x" }, "dependencies": { "express": "^4.17.1", "unblocker": "^2.3.0" }, "scripts": { "start": "node index.js" } }
添加一个启动
脚本,让Heroku知道如何运行你的应用程序,并添加一个引擎
部分来定义使用什么Node.js版本。在这个例子中,使用Node.js的最新LTS版本(v16)和node index.js
作为启动命令。
使用Heroku CLI进行部署
由于Heroku CLI将Node.js应用部署到Heroku非常简单。创建一个Heroku账户,并在你的系统上安装Heroku CLI。
使用login
命令从CLI上对Heroku进行认证。
heroku login
然后创建一个新的Heroku应用程序:
heroku apps:create
你应该看到你的应用程序的ID、URL和Git URL显示在终端。使用ID为新创建的Git repo设置一个远程源:
git init heroku git:remote -a [APP_ID]
现在你所需要的是提交你的代码并将其部署到Heroku:
git add . git commit -am "Initial commit" git push heroku master [文中代码源自Scrapingbee]
现在你应该能够在你的Heroku应用URL下访问你的代理。通过访问以下或类似的URL来测试它,就像你在本地主机上做的那样:https://[APP_ID].herokuapp.com/proxy/https://www.dailiservers.com/。
祝贺你–你的代理已经启动并运行了你可以把它作为一个单独的服务来使用,也可以把它与Puppeteer这样的无头浏览器库直接结合起来,进行网页爬取。
node-unblocker的局限性
虽然node-unblocker的实施和部署相对简单,但该代理有一系列的限制,即使不是不可能,也很难克服。此外,维护工作和你可能遇到的其他问题使运行一个自我管理的代理成为一件麻烦事。
另一方面,像ScrapingBee这样的服务是全面管理的,得到了很好的支持,并且已经在生产环境中经过了实战检验。
为了让你更好地了解这两者的比较,这里有一些你应该注意的node-unblocker的限制。
OAuth问题
该代理不太可能与使用OAuth表单的网站很好地工作。事实上,这适用于任何使用postMessage()
方法的网站。这个问题并不重要,将来可能会被修复,但目前只有标准的登录表单和大多数AJAX内容可以工作。
复杂网站的问题
受欢迎但复杂的网站,如Discord、Twitter或YouTube(有一半工作的例子)将不能正常工作。内容或部分内容可能不显示,或请求可能不成功,还有其他问题。目前,还没有关于何时(如果有的话)修复这个问题的时间表。
维护工作
像其他复杂的服务一样,代理和网页爬取应用需要大量的努力来运行和维护。你必须遵守云供应商的政策,全面管理你的代理实例,以及其他问题。所有这些因素都造成了很大的开销–特别是在运行大型代理集群时。
总 结
现在你应该对如何实现node-unblocker代理有了很好的理解。虽然它提供了许多好处,但你已经看到它也有一些限制,所以你可以自行权衡是否使用它。