跳到内容

使用 Node-Unblocker 绕过 Web 抓取块

嘿!

您使用 Node.js 构建了一个很棒的网络抓取工具,但网站却一直阻止您的请求?我们都去过那里!

在这本超过 3000 字的综合指南中,您将学习如何利用 Node-Unblocker 来逃避封锁并抓取任何网站。

什么是 Node-Unblocker 以及为什么使用它?

Node-Unblocker 是一个开源 Node.js 模块,允许您使用自定义中间件运行代理服务器来修改请求和响应。

以下是 Node-Unblocker 对于网页抓取如此有用的一些关键原因:

  • 避免 IP 封锁 – 通过代理路由您的抓取工具,您可以避免由于来自一个 IP 地址的请求过多而导致 IP 被禁止。这对于成功进行大规模抓取至关重要。

  • 绕过地理区块 – 许多网站根据位置限制内容访问。使用 Node-Unblocker,您可以通过特定区域的 IP 代理来绕过这些封锁。

  • 抓取 JavaScript 网站 – Node-Unblocker 支持代理 Websockets,允许抓取严重依赖 JavaScript 的网站。许多爬虫都在与 JS 网站作斗争。

  • 修改请求 – 自定义中间件可让您更改请求标头以模仿浏览器、自动处理登录、对字符进行编码等。

  • 变换响应 – 在响应到达抓取代码之前使用响应中间件重塑和处理响应。

  • 轻巧快速 – Node-Unblocker 完全用 JavaScript 构建,因此速度快如闪电,并且可以轻松集成到 JS scraper 中。

据调查,超过 60% 的网站现在采用了 IP 拦截、验证码和机器人检测等反抓取措施。 Node-Unblocker 是您克服这些障碍的秘密武器。

安装和配置 Node-Unblocker

我们首先来了解一下如何安装和配置 Node-Unblocker。我们还将创建一个示例代理服务器来进行尝试。

第 1 步:安装 Node-Unblocker

假设您已经有一个 Node.js 项目,请安装 Node-Unblocker 和 Express:

npm install node-unblocker express

这会将两个模块添加到您的 package.json.

第2步:初始化Express服务器

在您的服务器文件中,初始化 Express 应用程序和 Node-Unblocker 实例:

// server.js

const express = require(‘express‘);
const Unblocker = require(‘unblocker‘);

const app = express();
const unblocker = Unblocker(); 

// Node-Unblocker is now ready to use!

步骤3:添加代理路由

要代理请求,请添加通过 Unblocker 中间件重定向的路由:

app.get(‘/scrape‘, (req, res) => {
  const url = req.query.url;

  res.redirect(`/proxy/${url}`); 
});

现在我们可以向 /scrape?url=http://example.com Node-Unblocker 将代理它们。

第四步:启动服务器

最后,启动代理服务器:

const PORT = 3000;

app.listen(PORT, () => {
  console.log(`Proxy server running on port ${PORT}`);
});

我们的基本 Node-Unblocker 服务器现已启动并运行!

接下来让我们看看如何在网络爬虫中利用它。

使用 Node-Unblocker 进行网页抓取

以下是使用 Node-Unblocker 抓取网站的一些最常见用例:

旋转代理

网络抓取的最大挑战之一是避免在从一个 IP 发出过多请求后被目标网站阻止。

Node-Unblocker 提供了一种实现轮换代理解决方案的简单方法。

步骤是:

  1. 访问代理服务器池 - 您可以使用像 Luminati or 氧实验室 获得数百个代理IP。

  2. 将代理添加到列表 - 例如:

const proxies = [
  ‘http://proxy1.com‘,
  ‘http://proxy2.com‘,
  // etc
];
  1. 在每次请求之前,随机选择一个代理:
function getRandomProxy() {
  return proxies[Math.floor(Math.random() * proxies.length)];
}
  1. 通过代理发出网页抓取请求:
const proxy = getRandomProxy();

request(`${proxy}/targetUrl`);

通过轮换每个请求的代理,您可以大规模抓取而不会被阻止。专业提示:使用至少比每秒请求速率大 10 倍的代理池。

绕过地理封锁

某些网站根据访问者的地理位置限制内容访问。

例如,该网站 http://usanews.com 仅允许来自美国 IP 的流量。使用Node-Unblocker,我们可以轻松绕过这个限制。

步骤是:

  1. 获取您的目标区域(例如美国)的住宅代理 IP。

  2. 将这些特定于区域的代理添加到 Node-Unblocker。

  3. 通过 Node-Unblocker 路由您的抓取工具的流量。

现在,所有请求都将显示来自所需区域并成功访问地理封锁的内容!

该技术还适用于模拟来自特定国家/地区的移动流量,这对于抓取针对区域的移动应用程序非常有用。

抓取 JavaScript 网站

现代网站严重依赖 JavaScript 来呈现内容。仅下载 HTML 的传统抓取工具很难解析这些交互式页面。

值得庆幸的是,Node-Unblocker 默认代理 websocket,允许抓取 JS 站点:

// Enable websocket proxying
unblocker.listen().on(‘upgrade‘, unblocker.onUpgrade); 

// Make request and JS will execute
request(‘http://jsSite.com‘);  

该网站将以真正类似浏览器的方式加载和运行 JS,从而成功提取数据。

然而,这只适用于公共 JavaScript 站点。对于强大的 JS 渲染,像这样的工具 木偶戏 建议改为。

应用自定义请求中间件

Node-Unblocker 最强大的功能之一是其自定义中间件。我们可以使用它们来修改请求和响应。

请求中间件如何帮助网络抓取的一些示例:

轮换用户代理

许多网站会阻止在每个请求上发送相同用户代理的抓取工具。我们可以自动旋转它:

// Randomly choose User-Agent 
unblocker.use((req, res) => {
  const userAgents = [‘UA1‘, ‘UA2‘, ‘UA3‘];

  req.headers[‘User-Agent‘] = userAgents[Math.floor(Math.random() * userAgents.length)];
});

现在,每个请求将有一个不同的用户代理来防止这种阻止策略。

自动登录

对于需要登录的网站,我们可以附加身份验证凭据,而无需更改我们的抓取代码:

unblocker.use((req, res) => {
  if (req.url.includes(‘mysite.com‘)) {
    req.headers[‘Authorization‘] = ‘Bearer xxx‘;
  }  
});

对该站点的任何请求都会自动让用户登录。

对特殊字符进行编码

有些网站会屏蔽表情符号等奇怪字符。我们可以对请求运行自定义编码:

unblocker.use((req, res) => {
  req.url = encodeURI(req.url);

  // Encode headers, body etc
});

这使得我们的抓取工具可以使用特殊字符而不会被阻止。

正如您所看到的,请求中间件的可能性是无限的!

处理响应

我们还可以使用响应中间件转换响应数据:

解析和提取数据

我们可以直接在中间件中进行数据提取,而不是在我们的抓取器中进行数据提取:

unblocker.use((req, res) => {
  const $ = cheerio.load(res.body);

  res.data = $(‘.result‘).text(); 
});

现在我们的抓取工具将直接保存代码接收提取的数据。

过滤敏感数据

有些网站会返回我们不需要的 cookie、标头和其他元数据。我们可以清理这个:

unblocker.use((req, res) => {

  // Remove unnecessary cookies
  res.headers[‘set-cookie‘] = []; 

  // Delete other unwanted headers
  delete res.headers[‘x-rate-limit‘];
});

这只为我们提供了有用的响应数据。

缓存常见请求

对于经常访问端点的站点,我们可以构建缓存以避免达到速率限制:

// In-memory cache
const cache = {};

unblocker.use((req, res) => {
  if (cache[req.url]) {
    return cache[req.url];
  }

  cache[req.url] = res;
});

现在重复的请求将直接从缓存中得到服务。

正如您所看到的,响应中间件非常强大,可以在数据到达抓取工具之前在 Node-Unblocker 内部处理数据。

节点解锁器与其他代理

Node-Unblocker 为 Node.js 抓取工具提供了一个轻量级的进程内代理。但是,也有专用的代理服务可用。我们来比较一下优缺点:

节点解锁器

  • 优点

    • 轻量级和快速
    • 可定制的中间件
    • 直接集成到 Node scraper 中
  • 缺点

    • 需要管理自己的代理
    • 能力有限
    • 未针对规模进行优化

Luminati

  • 优点

    • 庞大的代理池
    • 高级代理管理器
    • 专为网页抓取而设计
  • 缺点

    • 对于较小的刮刀来说太过分了
    • 单独的工具进行集成

智能代理

  • 优点

    • 经济实惠的代理计划
    • 可用的专用 IP
    • 通过 REST API 集成
  • 缺点

    • 需要单独的账户
    • 有限的定制

对于大规模生产抓取,强烈建议使用 Luminati 或 Smartproxy 等商业代理服务。它们处理代理管理并通过 API 简化集成。

对于中小型抓取工具,Node-Unblocker 提供了一个很好的进程内选项。根据需要定制它的能力使其非常强大。

常见问题及其解决方法

使用 Node-Unblocker 时,以下是您可能遇到的一些常见问题以及如何解决这些问题:

站点阻塞 Node-Unblocker IP

如果您使用同一个 Node-Unblocker 服务器处理太多请求,则可能会发生这种情况。解决方案是经常轮换馈送到 Node-Unblocker 的上游代理 IP。

Websocket 不工作

确保你有 unblocker.listen().on(‘upgrade‘, unblocker.onUpgrade) 在您的代码中启用 websocket 代理。

打开的文件句柄太多

Node-Unblocker 在处理数千个请求时可能会达到打开文件限制。增加 Linux 中的最大打开文件数或使用 Nginx 等反向代理以获得更好的套接字处理。

抓取网站时出错

添加 debug Node-Unblocker 的中间件来记录所有请求。这有助于确定具体的请求失败了。

高内存使用

默认情况下,Node-Unblocker 将响应正文缓冲到内存中,这可能会导致峰值。如果需要,使用流式传输或禁用缓冲。

scrape() 很慢

Node-Unblocker 并未针对超高吞吐量进行优化。如果您需要最大限度地提高速度,请使用 Smartproxy 等专用代理服务。

中间件执行顺序

请记住中间件的执行顺序 - 例如,响应中间件在返回时先于请求中间件执行。

正确配置 Node-Unblocker 需要一些尝试和错误。请参阅 文档 用于高级配置选项。

大规模部署 Node-Unblocker

要在生产中运行 Node-Unblocker,您需要将其正确托管在专为高负载设计的服务器上。

这是一种推荐的架构:

节点解锁架构

它包括以下内容:

  • 节点解锁应用服务器 – 它们包含主要的代理应用程序逻辑。对于高负载,至少使用 2-4 台服务器。

  • 反向代理(Nginx) – 引导 Node-Unblocker 队列并平衡它们之间的负载。还处理 SSL 和其他边缘路由逻辑。

  • 数据库 – 存储任何持久的应用程序数据,如缓存、统计数据等。Redis 运行良好。

  • 上游代理服务器 – 将流量输入 Node-Unblocker 的外部代理 IP。此处至少使用 50-100 多个代理。

  • 云托管 – 使用 AWS 或 GCP 等提供商来管理服务器、负载平衡、故障转移和可扩展性。

正确构建 Node-Unblocker 部署可以支持每天超过 100,000 个请求,而不会出现任何问题。确保在启动之前对系统进行大规模压力测试。

对于更大的负载,请使用 Oxylabs 等专用代理服务,它可以通过其全球代理基础设施轻松处理数百万个请求。

高效网页抓取的最佳实践

以下是通过 Node-Unblocker 进行网页抓取时取得最大成功的一些一般技巧:

  • 使用随机时间间隔 – 以随机间隔而不是固定恒定速度刮擦部位。这有助于避免可能触发阻塞的流量模式。

  • 限制每个 IP 的请求 – 将每个上游代理 IP 的 Node-Unblocker 请求限制在合理的限制(例如 5 RPM),以避免烧毁 IP。

  • 匹配目标地理位置 – 使用与目标站点受众来自同一区域的代理 IP。这有助于避免基于地理的封锁。

  • 使用日志记录进行调试 – 实施请求日志记录,以便您可以轻松识别和重现错误。

  • 从块中学习 – 当您确实被阻止时,请研究所使用的确切阻止方法并调整您的策略以避免将来发生这种情况。

  • 定期轮换服务器 – 每隔几个月轮换一次代理服务器和基础设施,以刷新所有面向外部的 IP。

  • 利用代理服务 – 维护您自己的代理基础设施很复杂。利用企业代理服务来提高可靠性。

网页抓取绝对具有挑战性。但通过智能地利用 Node-Unblocker 等工具并遵循最佳实践,您几乎可以成功地从任何站点提取数据。

关键精华

以下是我们在这份全面的 Node-Unblocker 网络抓取指南中介绍的关键内容:

  • Node-Unblocker 提供了一个进程内代理服务器来路由网络抓取请求
  • 它允许实现代理轮换、自定义中间件和 Websocket 支持等关键功能
  • 正确配置 Node-Unblocker 需要反复试验 – 使用调试来识别问题
  • 对于大规模抓取,建议使用专用代理服务,例如 Luminati 或 Smartproxy
  • 遵循网络抓取最佳实践有助于避免阻塞并可靠地提取数据

Node-Unblocker 是一种多功能工具,与外部服务相比,它可以让您更好地控制代理逻辑。将其直接集成到您的抓取工具中可以释放新的可能性。

我希望本指南有助于揭开 Node-Unblocker 的神秘面纱,以及它如何帮助您成功地从任何网站抓取和扩展数据提取!如果您还有其他问题,请告诉我。

快乐(畅通)抓取!

标签:

加入谈话

您的电邮地址不会被公开。 必填带 *