如何在NodeJS中绕过Cloudflare

如何在NodeJS中绕过Cloudflare

Cloudflare 是一种非常流行的反机器人系统,能够检测和阻止机器人,这使我们的抓取工作变得更加困难。
不过,还有希望!在 NodeJS 中绕过 Cloudflare 的最佳方法是使用能够模仿真实用户的经过验证的库。他们是:

让我们讨论这些抓取包的详细信息,并查看每个包的代码示例,以了解它们如何用于 NodeJS Cloudflare 绕过。

什么是 Cloudflare?

Cloudflare 是一家安全公司,提供 Web 防火墙来保护应用程序免受多种安全威胁,例如跨站点脚本 (XSS)、撞库和 DDoS 攻击。默认情况下,它会阻止刮刀。有不同的调整和技巧可以在抓取时绕过 Cloudflare,所以让我们继续使用 NodeJS 中用于此目的的库。

如何在 NodeJS 中绕过 Cloudflare

我们将从具有不同 Cloudflare 安全级别的 3 个网站中抓取 NodeJS 中的数据:

  • Astra是一个安全性较低的网站,具有基本的 Cloudflare 安全性。
  • OpenSea使用先进的 Cloudflare 机器人检测。
  • G2,最难的一个。

让我们继续使用能够绕过 NodeJS 中的 Cloudflare 的库来抓取这些网站。

1.ZenRows

ZenRows是一种一体化网络抓取 API,可以为您处理所有反机器人绕过,例如 Cloudflare 和 reCAPTCHA。它的一些功能包括旋转代理、无头浏览器、自动重试和 JavaScript 渲染。

👍 优点:

  • 业内最好的抗体。
  • 您可以在几分钟内运行您的第一个请求。
  • 它可以抓取 JavaScript 渲染的页面。
  • 它还可以与其他库一起使用。

👎 缺点:

  • 它不提供浏览器扩展。

如何使用 ZenRows 在 NodeJS 中绕过 Cloudflare

转到ZenRows并注册您的免费 API 密钥,您可以在仪表板的上部找到该密钥。

zenrows_dashboard

获得 API 密钥后,切换到代码编辑器并安装axios到项目文件夹中。GET它是一个流行的 HTTP 请求客户端,我们将使用它向目标网站发送请求。

npm install axios

现在,创建一个名为 的 JavaScript 文件index.js,包含axios并添加您的 ZenRows API 密钥。像这样:

// Require axios 
const axios = require("axios"); 
 
// Add your API Key 
const APIKEY = "YOUR_API_KEY";

我们将向 ZenRoes 请求添加一些反机器人参数,发送GET并将结果保存到response对象中。打印response.data并使用该.catch方法捕获错误(如果有)。

axios({ 
    // Add the APIKEY and antobit feature as paramater 
    url: `https://api.zenrows.com/v1/?apikey=${APIKEY}&url=https%3A%2F%2Fwww.getastra.com%2F&antibot=true&premium_proxy=true`, 
    method: "GET", 
}) 
    // Print our result 
    .then(response => console.log(response.data)) 
    // Catch error if any 
    .catch(error => console.log(error));

完整的 NodeJS 网页抓取脚本应如下所示:

// Require axios 
const axios = require("axios"); 
 
// Add your API Key 
const APIKEY = "YOUR_API_KEY"; 
 
axios({ 
    // Add the APIKEY and antobit feature as paramater 
    url: `https://api.zenrows.com/v1/?apikey=${APIKEY}&url=https%3A%2F%2Fwww.getastra.com%2F&antibot=true&premium_proxy=true`, 
    method: "GET", 
}) 
    // Print our result 
    .then(response => console.log(response.data)) 
    // Catch error if any 
    .catch(error => console.log(error));

只需替换目标 URL,这是 Astra 的输出:

zenrows_astra

好的!让我们对其他两个网站做同样的事情。以下是 OpenSea 的脚本输出:

zenrows_opensea

我们在 G2 方面也看到了成功的结果:

zenrows_g2

惊人的!借助 ZenRows,我们能够绕过 NodeJS 中所有级别的 Cloudflare 安全性。

2. Humanoid

Humanoid是一个 Node JS 包,可以解决并绕过 Cloudflare 反机器人挑战。它通过使用 NodeJS 运行时解决 JavaScript 挑战,然后呈现 HTML 来实现这一点,这使得反机器人将抓取工具视为普通的 Web 浏览器。

它用于解决 JavaScript 挑战的一些功能包括随机浏览器用户代理、失败挑战时自动重试以及自定义 cookie 和标头。

👍 优点:

  • 它很容易使用。
  • Humanoid 自动解决 JavaScript 挑战。
  • 它支持异步 JavaScript。

👎 缺点:

  • 已经很久没有更新了。因此,很难从使用它的其他开发人员那里获得对错误的支持或指导。
  • 与其他为 Web 测试和访问元素而开发的无头浏览器不同。Humanoid 不支持这些功能,因此您需要做更多工作才能使用它进行网页抓取。

如何使用 Humanoid 在 NodeJS 中绕过 Cloudflare

要使用 Humanoid 绕过 Node JS Cloudflare,请安装并包含它。然后创建一个新humanoid实例:

// npm install humanoid-js 
const Humanoid = require("humanoid-js"); 
 
// Create a new humanoid instance 
const humanoid = new Humanoid();

下一步是使用humanoid随机创建的用户代理标头向目标网站发送 GET 请求。Cloudflare 绕过功能默认设置为 true,该auto-bypass方法解决了这些挑战并在失败时退出。

// Send Get request to the target website 
humanoid.get("https://www.getastra.com/");

获取脚本响应并打印出res.body包含页面 HTML 的内容。并使用该.catch方法捕获可能的错误。

.then(res => { 
    console.log(res.body); // Print the result 
}) 
// Catch errors if any 
.catch(err => { 
    console.log(err) 
})

继续并在目标网站上运行脚本。这是我们在 Astra 上的输出:success_astra

我们使用 Humanoid 成功避免了 Nodejs 中的 Cloudflare!完整的代码如下:

const Humanoid = require("humanoid-js"); 
 
// Create a new humanoid instance 
const humanoid = new Humanoid(); 
 
// Send Get request to the target website 
humanoid.get("https://www.getastra.com/") 
    .then(res => { 
        console.log(res.body); // Print the result 
    }) 
    // Catch errors if any 
    .catch(err => { 
        console.log(err) 
    })

与我们的其他示例一起使用humanoid,这是我们在 OpenSea 上的输出:

humanoid_opensea

最后,G2.com:

humanoid_g2_error

哎呀,看来我们没有通过!由于 Cloudflare,我们无法建立连接,因此没有收到响应。

3.Cloudflare-scraper

Cloudflare-scraper是一个在 Puppeteer 之上工作的插件,它能够绕过 Cloudflare JavaScript 挑战。它允许用户向请求添加 cookie,以及代理和用户代理标头。

👍优点:

  • 它在 Puppeteer 之上运行。
  • 它可以解决 Cloudflare JavaScript 和 CAPTCHA 挑战。
  • 它能够向请求添加代理。

👎 缺点:

  • 缺乏文档使得配置变得困难。
  • Cloudflare-scraper 对于高级机器人检测无能为力。

如何使用 Cloudflare-scraper 在 NodeJS 中绕过 Cloudflare

要绕过 Node JS Cloudflare 检测,请将cloudflare-scraper​​ 和安装puppeteer到您的项目文件夹中,然后包含cloudflare-scraper. 这边走:

// npm install cloudflare-scraper puppeteer 
 
// Require cloudflare-scraper 
const cloudflareScraper = require("cloudflare-scraper");

下一步是GET向目标网站发送请求。为此,请创建一条try-catch语句,使用该try方法通过 Cloudflare-scraper 发送请求,并使用该catch方法捕获错误。最后,将结果保存response并打印响应。

(async () => { 
    try { 
        // Send Get request to the target website 
        const response = await cloudflareScraper.get("https://www.getastra.com/"); 
 
        // Print out results 
        console.log(response); 
 
        // Handle errors 
    } catch (error) { 
        console.log(error); 
    } 
})();

完整的 cloudflare-scraper 脚本应如下所示:

// Require cloudflare-scraper 
const cloudflareScraper = require("cloudflare-scraper"); 
 
(async () => { 
    try { 
        // Send Get request to the target website 
        const response = await cloudflareScraper.get("https://www.getastra.com/"); 
 
        // Print out results 
        console.log(response); 
 
        // Handle errors 
    } catch (error) { 
        console.log(error); 
    } 
})();

在目标网站上使用脚本,以下是 Astra 的输出:

success_astra

我们在 Astra 上取得了成功,但遗憾的是 OpenSea 返回了状态代码 403。我们被阻止了!

cloudflare-scraper_403_error

G2.com 也不走运:

cloudflare-scraper_403_error

4. Puppeteer

Puppeteer是一个流行的 Node JS 库,它为基于 Chromium 的无头浏览器提供高级 API。它提供真正的浏览器功能,例如访问页面、单击链接和提交表单。

👍 优点:

  • 它可以完全控制无头浏览器。
  • 代理和标头可以添加到 Puppeteer。
  • 它还允许用户通过限制请求并在打开新页面之前等待随机时间来模仿正常用户行为。

👎 缺点:

  • 它很容易被检测到。
  • 调试 Puppeteer 等无头浏览器很困难。

如何使用 Puppeteer 在 NodeJS 中绕过 Cloudflare

为了避免被 Puppeteer 检测到,请安装puppeteer到您的项目文件夹中并包含它:

// npm install puppeteer 
 
// Require puppeteer 
const puppeteer = require("puppeteer");

用于page.setViewport设置无头浏览器的视图比例并await page.goto告知puppeteer转到目标网站。使用 设置 10 秒的等待时间page.waitForTimeout

// Setting page view 
await page.setViewport({ width: 1280, height: 720 }); 
 
// Go to the target website 
await page.goto("https://www.getastra.com/"); 
 
// Wait for security check 
await page.waitForTimeout(1000);

最后一步是获得响应,因此请使用该.screenshot函数截取屏幕截图。然后关闭无头浏览器。

    // Take screenshot 
    await page.screenshot({ path: "image.png" }); 
 
    // Closes the browser and all of its pages 
    await browser.close(); 
})();

完整的代码应如下所示:

// Require puppeteer 
const puppeteer = require("puppeteer"); 
 
(async () => { 
    // Initiate the browser 
    const browser = await puppeteer.launch(); 
 
    // Create a new page with the default browser context 
    const page = await browser.newPage(); 
 
    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 
 
    // Go to the target website 
    await page.goto("https://www.getastra.com/"); 
 
    // Wait for security check 
    await page.waitForTimeout(1000); 
 
    // Take screenshot 
    await page.screenshot({ path: "image.png" }); 
 
    // Closes the browser and all of its pages 
    await browser.close(); 
})();

这是 Astra 的输出:

puppeteer_astra

我们在 NodeJS 中使用 Puppeteer 成功绕过了 Cloudflare!但我们还没有完成。让我们在 OpenSea 和 G2.com 上运行该脚本。以下是 OpenSea 的脚本输出:

puppeteer_opensea_access_denied

嗯,这是一个失败!当定位 G2 时,我们进入了相同的“拒绝访问”屏幕:

puppeteer_g2_access_denied

5. Puppeteer-stealth

Puppeteer-stealth是一个隐形插件,可帮助 Puppeteer 抓取工具绕过反机器人。它使用多种规避技术来使用 NodeJS 绕过 Cloudflare,例如覆盖浏览器中的 JS 对象和更改用户代理标头。

👍 优点:

  • Puppeteer 提到的所有优点。
  • 更难检测。

👎 缺点:

如何使用 Puppeteer-stealth 在 NodeJS 中绕过 Cloudflare

为了避免使用 Puppeteer-stealth 检测 Cloudflare 机器人,请将软件包安装到您的项目文件夹中,然后保存puppeteerexecutablePathpuppeteer-stealth启用puppeteer.use(pluginStealth())

// npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth 
 
const puppeteer = require("puppeteer-extra"); 
 
// Add stealth plugin and use defaults 
const pluginStealth = require("puppeteer-extra-plugin-stealth"); 
const { executablePath } = require("puppeteer"); 
 
// Use stealth 
puppeteer.use(pluginStealth());

下一步是启动新的puppeteer无头浏览器并使用browser.newPage()在浏览器中添加新网页。然后使用 设置无头浏览器的视图比例page.setViewport。最后,使用page.goto()访问目标网站。

// Launch pupputeer-stealth 
puppeteer.launch({ executablePath: executablePath() }).then(async browser => { 
    // Create a new page 
    const page = await browser.newPage(): 
 
    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 
 
    // Go to the website 
    await page.goto("https://www.getastra.com/");

这样,您的抓取工具就准备好了,剩下的就是等待页面加载。截取屏幕截图并关闭浏览器。我们是这样做的:

    // Wait for page to download 
    await page.waitForTimeout(1000) 
 
    // Take screenshot 
    await page.screenshot({ path: "image.png" }) 
 
    // Close the browser 
    await browser.close(); 
});

完整的代码已准备好运行,如下所示:

const puppeteer = require("puppeteer-extra"); 
 
// Add stealth plugin and use defaults 
const pluginStealth = require("puppeteer-extra-plugin-stealth"); 
const { executablePath } = require("puppeteer"); 
 
// Use stealth 
puppeteer.use(pluginStealth()); 
 
// Launch pupputeer-stealth 
puppeteer.launch({ executablePath: executablePath() }).then(async browser => { 
    // Create a new page 
    const page = await browser.newPage(); 
 
    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 
 
    // Go to the website 
    await page.goto("https://www.getastra.com/"); 
 
    // Wait for page to download 
    await page.waitForTimeout(1000); 
 
    // Take screenshot 
    await page.screenshot({ path: "image.png" }); 
 
    // Close the browser 
    await browser.close(); 
});

在 Astra 上运行puppeteer-stealth抓取工具,我们得到:

puppeteer_astra

好消息!它清除了第一个障碍,OpenSea 的输出遵循相同的正方向:

puppeteer-stealth_opensea

但是在 G2.com 上运行抓取工具,我们得到的结果如下:

puppeteer-stealth_g2_captcha

G2 上的高级 Cloudflare 机器人能够检测 Puppeteer 隐形行为并阻止其访问该网站。

结论

学习如何使用 NodeJS 绕过 Cloudflare 对于您的网络抓取项目至关重要,因为它可以检测、阻止甚至限制您的网络爬虫。在本文中,我们讨论了解决此问题的最佳 5 个库。我们使用这些库抓取了 3 个具有不同级别的 Cloudflare 机器人保护的网站,以下是我们得到的结果:

Astra OpenSea G2.com
ZenRows
Humanoid
Cloudflare-scraper
Puppeteer
Puppeteer-stealth

 

尽管 Humanoid、Cloudflare-scraper 和 Puppeteer-stealth 是经常用于 NodeJS Cloudflare 绕过的库,但它们未能绕过 G2.com 上的高级机器人防护。与此同时,ZenRows能够凭借其先进的反机器人绕过功能(例如智能旋转代理和定制的无头浏览器)来抓取数据。它与 NodeJS 集成良好,您可以免费开始使用。

类似文章