如何使用Puppeteer绕过Cloudflare

如何使用Puppeteer绕过Cloudflare

当像 Cloudflare 这样的反机器人检测并阻止您的抓取程序时,Web 抓取中的麻烦就开始了。避免这种压力的最佳方法之一是使用无头浏览器技术,例如在抓取时使用 Puppeteer 绕过

Cloudflare。借助 Puppeteer,可以使用一些技巧来逃避 Cloudflare 机器人检测,让您的网络爬虫顺利运行。

在本文中,我们将讨论如何使用 Puppeteer 绕过 Cloudflare。让我们开始吧!

什么是Puppeteer

Puppeteer是一个 Node.js 库,它提供了一个高级 API 来通过 DevTools Protocol 控制无头 Chrome 或 Chromium。此 API 远程控制无头 Chromium 实例,并将它们用作访问浏览器 (chrome) 呈现网页及其 JavaScript 元素的能力的门户。Puppeteer 默认无头运行,但您也可以将其配置为以非无头模式(完整的 Chrome 或 Chromium)运行。

当 Puppeteer 网络抓取工具访问网站时,它首先创建一个浏览器实例。这是为了在导航到要抓取的所需数据位置之前呈现网站内容。Cloudflare 的机器人检测可以将此操作识别为由机器人执行,尤其是在无头模式下执行时。但是在完整的 Chrome 模式下运行 Puppeteer (headless = false) 可以授予您访问受 Cloudflare 保护的网站的权限。

但是,Cloudflare 是一个复杂的解决方案,具有经常更新的 Web 应用程序防火墙 (WAF)。现在,无论是否无头,您都可能仍然被阻止。使用 Puppeteer 绕过 Cloudflare 的关键是了解 Cloudflare 如何检测机器人。

什么是 Cloudflare?

Cloudflare 的机器人保护系统使网站能够识别不需要的流量。但是,某些有用的机器人(如 Google 和其他搜索引擎)被授予访问权限以允许进行网络抓取和排名。这是可能的,因为 Cloudflare 为这些机器人维护了一个安全列表,不幸的是,Puppeteer 不在这个列表中。因此,您的无头浏览器抓取工作可能会在受 Cloudflare 保护的网站上遇到障碍。

Cloudflare 如何检测机器人

Cloudflare 使用各种技术来防范恶意威胁和数据入侵。其中一些包括检测僵尸网络、IP 地址信誉、TLS 指纹识别、CAPTCHA、Canvas 指纹识别、HTTP 请求标头、事件跟踪等。要了解更多信息,请查看我们关于如何绕过 Cloudflare 的指南。

Cloudflare 是否检测到 Puppeteer?

是的,Cloudflare Bot Management 能够检测 Puppeteer。当 Puppeteer 网络抓取工具访问受 Cloudflare 保护的网站时,它会使用上述方法进行安全检查。这些检查发生在称为 Cloudflare 等候室的间隙页面中。如果网络抓取工具成功清除了这些挑战,它就会被授予访问权限。否则,它被阻止。

Puppeteer 可以绕过 Cloudflare 吗?

尽管 Puppeteer 可以绕过一些 Cloudflare 的机器人检测技术,因为它与 Chrome 相似,但它不会通过一些更详细的机器人检测检查。headless chrome 的默认navigation.webdriver属性允许 Cloudflare 将其检测为自动浏览器。虽然一些较小的配置可以缓解这种情况,但 Puppeteer 仍然会在其浏览器指纹中留下细微的痕迹,使其可以被检测为非人类。

要查明 Puppeteer 是否绕过 Cloudflare,让我们尝试抓取受 Cloudflare 保护的网站CoinTracker 。您可以通过在实际浏览器中访问该网站并检查网络选项卡来确认这一点。

cointracker我们尝试使用以下脚本访问我们的目标网站并进行截图:

const puppeteer = require('puppeteer'); 
 
(async () => { 
    //instantiate browser 
    const browser = await puppeteer.launch({ headless: true }); 
 
    //launch new page 
    const page = await browser.newPage(); 
 
    //visit target website 
    await page.goto( 
        'https://www.cointracker.io/', { 
            //wait for website to load 
            waitUntil: 'load', 
        }) 
 
    //take page screenshot 
    await page.screenshot({'path': 'cointracker.png'}) 
    await browser.close() 
})();

但这是我们得到的:

cointracker_block所以发生的事情是 CoinTracker 的 Cloudflare 反机器人保护将我们的脚本检测为机器人并将我们锁定在 Cloudflare 的等候室。Puppeteer 本身无法绕过 Cloudflare。

那么我们如何使用 Puppeteer 绕过 Cloudflare 并将我们的爬虫从等候室中解放出来呢?好吧,我们才刚刚到那里。

如何使用 Puppeteer 绕过 Cloudflare

理想情况下,您可以通过屏蔽其自动浏览器属性来执行 Puppeteer Cloudflare 绕过,这将使它看起来像一个实际的浏览器。最流行的方法之一是使用Puppeteer-extra-plugin-stealth

Puppeteer-extra-plugin-stealth 使用与基础 Puppeteer 类似的 API,因此对于已经使用 Puppeteer 的开发人员来说没有学习曲线。该插件消除了将 Puppeteer 与实际浏览器区分开来的细微浏览器指纹痕迹。例如,隐形插件会覆盖该navigator.webdriver = true属性以掩盖自动化并显示为人性化。

让我们看看如何使用 Puppeteer-extra-plugin-stealth 插件绕过 Cloudflare Puppeteer。

先决条件

对于本教程,我们将使用 Node.js,因此您需要安装Node(或nvm)和 npm。有些系统已经预装了它。之后,通过运行 npm install 安装所有必需的库。它将创建一个包含所有依赖项的 package.json 文件。然后安装 Puppeteer。

npm i puppeteer

使用 Puppeteer-extra-plugin-stealth 绕过 Puppeteer Cloudflare

要使用 Puppeteer-extra-plugin-stealth 绕过 Cloudflare 机器人检测,请先安装 Puppeteer extra 和 stealth 插件。

npm install puppeteer-extra puppeteer-extra-plugin-stealth

Puppeteer 核心现在需要可执行路径,因此我们需要将设置配置为executablePath: require('puppeteer').executablePath(). 使用下面的脚本,我们可以绕过 CoinTracker 的 Cloudflare 反机器人检测,并截取我们目标网站的主页。

// puppeteer-extra is a drop-in replacement for puppeteer, 
// it augments the installed puppeteer with plugin functionality 
const puppeteer = require('puppeteer-extra') 
 
// add stealth plugin and use defaults (all evasion techniques) 
const StealthPlugin = require('puppeteer-extra-plugin-stealth') 
puppeteer.use(StealthPlugin()) 
 
const {executablePath} = require('puppeteer') 
 
// puppeteer usage as normal 
puppeteer.launch({ headless: true, executablePath: executablePath() }).then(async browser => { 
    const page = await browser.newPage() 
    await page.goto('https://www.cointracker.io/') 
    await page.waitForTimeout(2000) 
    await page.screenshot({ path: 'cointracker_home.png', fullPage: true }) 
    await browser.close() 
})

这是我们的结果:

cointracker_home

该插件有效,您已成功避免 Puppeteer Cloudflare 检测。如果这是您的情况,您可以庆祝……但如果不是,则意味着您一直受困于高级 Cloudflare 安全性。

Puppeteer-extra-plugin-stealth 限制

一些网站使用比其他网站更高级的 Cloudflare 安全性,例如我们使用的网站,使用隐身插件屏蔽 Puppeteer 的自动化属性不足以通过。例如,我们尝试使用以下代码访问G2.com :

// ... same as above 
puppeteer.launch({ headless: true, executablePath: executablePath() }).then(async browser => { 
    const page = await browser.newPage() 
    await page.goto('https://www.g2.com/products/asana/reviews') 
    await page.waitForTimeout(10000) 
    await page.screenshot({ path: 'g2_block.png', fullPage: true }) 
    await browser.close() 
})

这就是我们得到的:

g2_block很熟悉吧?结果表明,隐形插件已被更复杂的 Cloudflare 反机器人系统检测为机器人。那么如何绕过这个并从复杂的网站中提取数据呢?使用 ZenRows。

使用 ZenRows 绕过 Puppeteer Cloudflare

ZenRows使从任何网站提取数据变得容易,无论其反机器人检测的复杂性如何。它是一种独特的工具,可以通过执行单个 API 调用来扩展网络抓取。

要使用 ZenRows 绕过 Puppeteer Cloudflare 检测,请创建一个免费帐户并安装 ZenRows。

npm i zenrows --save

在 Request Builder 中,输入您要抓取的 URL,选择 Node.js,然后选择 SDK。由于我们正在处理复杂的反机器人检测,因此我们需要激活高级代理和反机器人功能:

zenrows_proxyZenRows 会自动生成一个网页抓取脚本,你可以将这个脚本复制到本地目录。让我们使用项目仪表板中的代码块从 G2 的产品页面检索数据。为此,将代码块复制到本地目录。

备注:这个页面的数据太大了console.log(),所以我们使用fs模块将它保存在一个文件中。

const { ZenRows } = require('zenrows'); 
const fs = require('fs').promises; 
 
(async () => { 
    const client = new ZenRows('cd7344a378b68207c1eeb153eb80cf19e737bab1'); 
    const url = 'https://www.g2.com/products/asana/reviews'; 
 
    try { 
        const { data } = await client.get(url, { 
            'js_render': 'true', 
            'antibot': 'true', 
            'premium_proxy': 'true' 
        }); 
 
        fs.writeFile('data.html', data) 
    } catch (error) { 
        console.error(error); 
    } 
})();

输出如下所示:

result

我们已经成功绕过了复杂的 Cloudflare 检测系统。

结论

正确使用 Puppeteer 进行网页抓取很有趣,尽管像 Cloudflare 这样的反机器人的存在使这个过程有点压力,因为它们能够阻止我们的抓取器。使用 Puppeteer 绕过 Cloudflare 的一种方法是使用 Puppeteer-extra-plugin-stealth,它可以掩盖浏览器的属性以显示为人类。

类似文章