如何在NodeJS中绕过Cloudflare
Cloudflare 是一种非常流行的反机器人系统,能够检测和阻止机器人,这使我们的抓取工作变得更加困难。
让我们讨论这些抓取包的详细信息,并查看每个包的代码示例,以了解它们如何用于 NodeJS Cloudflare 绕过。
什么是 Cloudflare?
Cloudflare 是一家安全公司,提供 Web 防火墙来保护应用程序免受多种安全威胁,例如跨站点脚本 (XSS)、撞库和 DDoS 攻击。默认情况下,它会阻止刮刀。有不同的调整和技巧可以在抓取时绕过 Cloudflare,所以让我们继续使用 NodeJS 中用于此目的的库。
如何在 NodeJS 中绕过 Cloudflare
我们将从具有不同 Cloudflare 安全级别的 3 个网站中抓取 NodeJS 中的数据:
让我们继续使用能够绕过 NodeJS 中的 Cloudflare 的库来抓取这些网站。
1.ZenRows
ZenRows是一种一体化网络抓取 API,可以为您处理所有反机器人绕过,例如 Cloudflare 和 reCAPTCHA。它的一些功能包括旋转代理、无头浏览器、自动重试和 JavaScript 渲染。
👍 优点:
- 业内最好的抗体。
- 您可以在几分钟内运行您的第一个请求。
- 它可以抓取 JavaScript 渲染的页面。
- 它还可以与其他库一起使用。
👎 缺点:
- 它不提供浏览器扩展。
如何使用 ZenRows 在 NodeJS 中绕过 Cloudflare
转到ZenRows并注册您的免费 API 密钥,您可以在仪表板的上部找到该密钥。
获得 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 的输出:
好的!让我们对其他两个网站做同样的事情。以下是 OpenSea 的脚本输出:
我们在 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 上的输出:
我们使用 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 上的输出:
最后,G2.com:
哎呀,看来我们没有通过!由于 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 的输出:
我们在 Astra 上取得了成功,但遗憾的是 OpenSea 返回了状态代码 403。我们被阻止了!
G2.com 也不走运:
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 的输出:
我们在 NodeJS 中使用 Puppeteer 成功绕过了 Cloudflare!但我们还没有完成。让我们在 OpenSea 和 G2.com 上运行该脚本。以下是 OpenSea 的脚本输出:
嗯,这是一个失败!当定位 G2 时,我们进入了相同的“拒绝访问”屏幕:
5. Puppeteer-stealth
Puppeteer-stealth是一个隐形插件,可帮助 Puppeteer 抓取工具绕过反机器人。它使用多种规避技术来使用 NodeJS 绕过 Cloudflare,例如覆盖浏览器中的 JS 对象和更改用户代理标头。
👍 优点:
- Puppeteer 提到的所有优点。
- 更难检测。
👎 缺点:
- 它无法避免先进的反机器人。
- 进行大规模网页抓取时会失败。
- 很难调试。
如何使用 Puppeteer-stealth 在 NodeJS 中绕过 Cloudflare
为了避免使用 Puppeteer-stealth 检测 Cloudflare 机器人,请将软件包安装到您的项目文件夹中,然后保存puppeteer
到executablePath
并puppeteer-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
抓取工具,我们得到:
好消息!它清除了第一个障碍,OpenSea 的输出遵循相同的正方向:
但是在 G2.com 上运行抓取工具,我们得到的结果如下:
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 集成良好,您可以免费开始使用。