在本网络抓取教程中,我们将了解 NodeJS 的Node-Unblocker——一种用 NodeJS 编写的可破解代理工具,可用于避免网络抓取阻塞。
此外,nodeunblocker 可以充当方便的请求/响应中间件服务,可以修改我们的网络抓取工具堆栈中的传出请求和传入响应。
在本文中,我们将了解 node-unblocker 设置、网络抓取中的使用以及一些一般提示和技巧,让我们深入了解吧!
什么是Node-Unblocker?
Node-Unblocker是一个 nodeJS 代理服务器库,以能够轻松启动和快速运行自定义代理而闻名。它提供了一个原生的 NodeJS API,这意味着它可以轻松地与基于 NodeJS 的网络抓取工具集成。
最初,nodeunblocker 是为逃避互联网审查和访问受地理限制的内容而创建的,尽管它是一个通用代理服务器,可用于许多与代理相关的任务,如网络抓取。
node-unblocker 和经典的 HTTP/SOCKS5 代理之间的主要区别在于我们可以将它用作 REST API:
$ curl https://localhost:8080/proxy/htttps://www.httpbin.org/ip
使代理在任何网络抓取环境中都易于使用。
Web 抓取中的代理对于避免阻塞和地理限制至关重要,这使得 node-unblocker 成为基于 NodeJS 的 Web 抓取堆栈的非常有用的补充。
Node-Unblocker 还提供了一些高级功能,例如允许修改传出请求和传入响应的请求和响应中间件。我们将在本文后面详细介绍此功能。
设置
要设置 node-unblocker 代理服务器,我们需要将其与 API 服务器(例如Express)结合使用。我们可以通过命令来实现npm
:
$ npm install node-unblocker express
然后我们可以创建我们的服务器文件app.js
:
"use strict"; const express = require("express"); const Unblocker = require("unblocker"); const app = express(); const unblocker = Unblocker({ // config options here... }); app.use(unblocker); // We can apply custom proxy rules: app.get("/", (req, res) => res.redirect("/proxy/https://en.wikipedia.org/wiki/Main_Page") ); // start the server and allow unblocker to proxy websockets: const port = process.env.PORT || 8080; app.listen(port).on("upgrade", unblocker.onUpgrade); console.log(`unblocker app live at http://localhost:${port}/`);
现在,我们可以通过这个服务器代理任何 url:
# run the server $ node app.js unblocker app live at http://localhost:8080/ # in other terminal window or browser we can test it: $ curl https://localhost:8080/proxy/https://www.httpbin.org/ip
Web 抓取中的节点解锁器
使用 node-unblocker 我们可以创建我们自己的代理池,我们可以使用它来避免网络抓取阻塞或地理限制。
例如,通过在美国服务器上部署 node-unblocker,我们可以使用它的代理来访问仅限于美国地区的网站:
let USAonlyUrl = "https://www.example.com" fetch(`https://localhost:8080/proxy/${USAonlyUrl}`)
我们还可以部署多个节点解锁服务器并在我们的网络抓取程序中实施旋转代理逻辑,以通过多个 IP 地址分配我们的网络抓取连接:
let proxyPool = [ "https://111.222.22.33:8080", "https://111.222.22.34:8080", "https://111.222.22.35:8080", ] let proxy = proxyPool[Math.floor(Math.random()*proxyPool.length)]; url = "https://www.example.com" fetch(`${proxy}/proxy/${USAonlyUrl}`)
这种代理的另一个更高级的用途是通过请求和响应中间件注入额外的逻辑,让我们来看看。
使用Middlewares
节点解锁代理最有趣的功能之一是请求和响应中间件,它允许修改传出请求和传入响应。
在网络抓取时,我们可以使用自定义中间件作为抽象层。例如,我们可以自动将身份验证标头应用于所有传出请求:
// app.js function attachAuth(data) { if (data.url.match(/^https?:\/\/instagram.com\//)) { data.headers["x-instagram-token"] = "123"; } } var config = { requestMiddleware: [ attachAuth ] }
现在,代理服务器将为x-instagram-token
每个传出请求附加标头。这个习语在网络抓取中的常见用法是将连接细节抽象到代理服务器。换句话说,如果我们有 5 个网络抓取器抓取同一个目标,我们只需要在我们的代理中有令牌解析逻辑,而不是所有 5 个抓取器。
与响应中间件相同 – 例如,我们可以自动删除不需要的 cookie,使其不再到达我们的网络抓取工具:
// app.js function dropCookies(data) { if (data.url.match(/^https?:\/\/instagram.com\//)) { var cookies = setCookie.parse(data, { decodeValues: false }); if (cookies.length) { debug("filtering set-cookie headers"); data.headers["set-cookie"] = cookies.filter(function (cookie) { if (cookie.name.includes("bad_cookie"){ return false; } return true; }); } } } var config = { responseMiddleware: [ dropCookies ] }
使用 node-unblocker 中间件,我们可以轻松地将抓取逻辑分布到多个抓取器中,使其成为一个很好的网络抓取扩展工具。
更多使用参见node-unblocker官方示例目录
使用 Docker 部署
由于我们将 node-unblocker 与 Express Web 服务器框架一起使用,我们可以轻松地使用 docker 部署它。使用它Dockerfile
我们可以构建一个 docker 镜像并将其部署到任何基于 docker 的托管服务提供商:
FROM node:16 # Create app directory WORKDIR /usr/src/app # Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm ci --only=production # Bundle app source COPY . . EXPOSE 8080 CMD [ "node", "app.js" ]
有关部署 node-unblocker 项目的更多信息,请参阅关于Dockerizing a Node.js web app的官方文档