如何使用cURL绕过Cloudflare

如何使用cURL绕过Cloudflare

五分之一的网站使用某种形式的 Cloudflare 保护,这意味着您在尝试抓取网站时很可能会被阻止。但是有什么解决办法吗?在本教程中,您将学习如何使用 cURL 绕过 Cloudflare。我们将讨论纯 cURL 抓取器的工作原理,以及您可以进行哪些调整来获取所需的数据。

什么是 Cloudflare?

Cloudflare是一家提供一些最受欢迎的 Web 性能和安全服务的公司。对我们来说,问题在于它的 Web 应用程序防火墙 (WAF),默认情况下它会检测并阻止机器人程序以减轻恶意攻击。

Google 和其他搜索引擎在许可名单中,但 cURL 网络抓取工具不在。因此,无论您的意图如何,受 Cloudflare 保护的网站都会将您识别为恶意机器人并将您拒之门外。

如何在 cURL 中绕过 Cloudflare?

cURL 连接具有不同于真实浏览器的独特属性。因此,当您发送此类请求时,系统很容易识别出您并拒绝您访问。

您还可以尝试以下方法:

理想情况下,您需要做的就是模仿合法的浏览器:随机化您的静态 HTTP 标头或复制真实浏览器的标头应该授予您访问权限。然而,在实践中往往需要更多。

您还需要模仿自然的用户行为!这就是它变得棘手的地方,因为从基于请求的工具(如 cURL)定义该行为可能具有挑战性。然而,cURL-impersonate 中有一些特殊的构建可以模仿真实浏览器的 TLS 和 HTTP 握手(TLS 和 HTTP/2 是 Cloudflare 武器库中的两种被动机器人检测技术)。

让我们开始写代码。

方法 #1:基础 cURL

让我们来看一个快速抓取示例。我们将使用 cURL 来定位CoinTracker,这是一个受 Cloudflare 反机器人保护的加密货币跟踪平台。

medium_cointracker1_13abc73fd6

我们首先向我们的目标网站发送请求。

curl https://www.cointracker.io/

不出所料,这没有用。

我们基于 cURL 的抓取器返回原始 HTML 内容,其中包含 Cloudflare 等候室消息:“正在检查站点连接是否安全。”

<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Just a moment...</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="robots" content="noindex,nofollow">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="/cdn-cgi/styles/challenges.css" rel="stylesheet">
 
 
</head>
<body class="no-js">
    <div class="main-wrapper" role="main">
    <div class="main-content">
        <h1 class="zone-name-title h1">
            <img class="heading-favicon" src="/favicon.ico"
                 onerror="this.onerror=null;this.parentNode.removeChild(this)">
            www.cointracker.io
        </h1>
        <h2 class="h2" id="challenge-running">
            Checking if the site connection is secure
        </h2>
        <noscript>
            <div id="challenge-error-title">
                <div class="h2">
                    <span class="icon-wrapper">
                        <div class="heading-icon warning-icon"></div>
                    </span>
                    <span id="challenge-error-text">
                        Enable JavaScript and cookies to continue
                    </span>
                </div>
            </div>
        </noscript>
        <div id="trk_jschal_js" style="display:none;background-image:url('/cdn-cgi/images/trace/managed/nojs/transparent.gif?ray=78a3c8ab2bbb0eac')"></div>
        <div id="challenge-body-text" class="core-msg spacer">
            www.cointracker.io needs to review the security of your connection before proceeding.
        </div>

系统检测到我们是机器人。您可以在我们的Cloudflare 旁路指南中了解有关等候室的更多信息。

接下来让我们尝试使用 HTTP 标头。

方法#2:HTTP 标头

Cloudflare 通过默认的特定于 cURL 的标头将我们的抓取工具识别为机器人。但是,这也可能对我们有利。通过随机化标头,我们可以更接近自然的用户行为。

我们将从查看当前的开始。我们可以通过向httpbin发送请求来实现,httpbin 是一个显示请求和响应标头的网站。

curl http://httpbin.org/headers

结果如下:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.83.1",
    "X-Amzn-Trace-Id": "Root=1-63c80ee4-6374a4877ed23d752c571880"
  }
}

现在,看看我们在浏览器中打开 httpbin 站点时得到的内容:

{
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed- 
     exchange;v=b3;q=0.9",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "en-US,en;q=0.9",
    "Host": "httpbin.org",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "X-Amzn-Trace-Id": "Root=1-63c80f39-673b7c0273142fde3e5eaa06"
  }
}

如您所见,cURL 标头与浏览器标头完全不同。因此,Cloudflare 很容易识别并阻止我们。

让我们尝试在我们的 cURL 请求中使用我们的浏览器标头:

curl 'https://www.cointracker.io/' 
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" 
  -H "Accept-Encoding: gzip, deflate" 
  -H "Accept-Language: en-US,en;q=0.9" 
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" 

结果如下:

<body class="no-js">
    <div class="main-wrapper" role="main">
    <div class="main-content">
        <h1 class="zone-name-title h1">
            <img class="heading-favicon" src="/favicon.ico"
                 onerror="this.onerror=null;this.parentNode.removeChild(this)">
            www.cointracker.io
        </h1>
        <h2 class="h2" id="challenge-running">
            Checking if the site connection is secure
        </h2>
        <!-- ... -->

这证明随机化标头不足以绕过 cURL 中的 Cloudflare。

但是,我们还可以做其他事情。

方法#3:饼干

当浏览器与网站交互时,服务器会将 cookie 发回给它。在稍后的请求中,浏览器将那些包含在其标头中以发送回服务器。这样,他们就认出了对方。

在新的抓取尝试中,我们将在我们的 cURL 请求中强加目标网站的 cookie。请记住,这个想法是模仿自然的用户行为。

在实际浏览器中访问CoinTracker,打开 DevTools 的网络选项卡,然后刷新页面。

medium_cointracker2_318022a85f

在那里,我们可以看到负责我们试图获取的页面的请求。单击 URL 打开标头选项卡,我们可以在其中找到请求标头部分。

medium_cointracker3_6d988c472b

然后,我们必须右键单击并复制 URL 以使我们的请求看起来像这样:

curl 'https://www.cointracker.io/' 
  -H 'Referer: https://www.google.com/' 
  -H 'Upgrade-Insecure-Requests: 1' 
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' 
  -H 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"' 
  -H 'sec-ch-ua-mobile: ?0' 
  -H 'sec-ch-ua-platform: "Windows"' 
<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Just a moment...</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="robots" content="noindex,nofollow">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="/cdn-cgi/styles/challenges.css" rel="stylesheet">
</head>
<body class="no-js">
    <div class="main-wrapper" role="main">
    <div class="main-content">
        <h1 class="zone-name-title h1">
            <img class="heading-favicon" src="/favicon.ico"
                 onerror="this.onerror=null;this.parentNode.removeChild(this)">
            www.cointracker.io
        </h1>
        <h2 class="h2" id="challenge-running">
            Checking if the site connection is secure
        </h2>
        <!-- ... -->

再一次,我们没有成功地使用 cURL 绕过 Cloudflare,而是被带到了等候室。😢

发生这种情况是因为防火墙使用了多种反机器人技术,并且在大多数情况下仅依靠请求 cookie 是不够的。

方法#4:cURL-impersonate 模拟浏览器

这次我们将使用 cURL-impersonate 来模仿真实的浏览器。从下载并安装它开始。

现在,让我们模拟运行 Chrome104 来尝试访问我们的目标网站。在命令行工具上,打开包含包的文件夹。然后,发送以下请求:

curl_chrome104 --url https://www.cointracker.io/

我们的结果?见下文!

<p class="lead text-secondary">
CoinTracker generates your crypto tax forms in minutes with industry-leading accuracy.
</p>
</div>
<div class="d-xl-block d-none">
<p class="lead text-secondary text-left mb-4 w-100 col-10 px-0">
CoinTracker generates your crypto tax forms in minutes with industry-leading accuracy.
</p>
<p class="lead text-secondary text-xl-left">
<img src="https://s3-us-west-1.amazonaws.com/coin-tracker-public/static/images/sprites/check.svg" loading="lazy">
Connect 500+ wallets and exchanges instantly<br>
</p>
<p class="lead text-secondary text-xl-left">
<img src="https://s3-us-west-1.amazonaws.com/coin-tracker-public/static/images/sprites/check.svg" loading="lazy">
Best-in-class security<br>
</p>
<p class="lead text-secondary text-xl-left">
<img src="https://s3-us-west-1.amazonaws.com/coin-tracker-public/static/images/sprites/check.svg" loading="lazy">
One-click sharing with your accountant<br>
</p>
<p class="lead text-secondary text-xl-left">
<img src="https://s3-us-west-1.amazonaws.com/coin-tracker-public/static/images/sprites/check.svg" loading="lazy">
Trusted by 1M+ users<br>
</p>
<!-- ... -->

恭喜,您已经在 cURL 中完成了第一个 Cloudflare 绕过!

但是,如果不想破坏您的幸福,这在许多使用最先进的 Cloudflare 安全级别的网站上是行不通的。因此,cURL-impersonate 不可靠。

让我们用一个例子来证明这一点。我们将尝试使用刚刚看到的步骤访问G2 的产品页面。

medium_G2_f6bfde89fe

您可能会猜到发生了什么:我们被阻止了!

<body class="no-js">
    <div class="main-wrapper" role="main">
    <div class="main-content">
        <h1 class="zone-name-title h1">
            <img class="heading-favicon" src="/favicon.ico"
                 onerror="this.onerror=null;this.parentNode.removeChild(this)">
            www.g2.com
        </h1>
        <h2 class="h2" id="challenge-running">
            Checking if the site connection is secure
        </h2>
        <noscript>
            <div id="challenge-error-title">
                <div class="h2">
                    <span class="icon-wrapper">
                        <div class="heading-icon warning-icon"></div>
                    </span>
                    <span id="challenge-error-text">
                        Enable JavaScript and cookies to continue
                    </span>
                </div>
            </div>
        </noscript>
        <div id="trk_jschal_js" style="display:none;background-image:url('/cdn-cgi/images/trace/managed/nojs/transparent.gif?ray=78beef326be4d424')"></div>
        <div id="challenge-body-text" class="core-msg spacer">
            www.g2.com needs to review the security of your connection before proceeding.
        </div>

当没有任何效果时,从专业人士那里获得一些帮助可能是个好主意。接下来,我们将看到一个解决方案,该解决方案可以绕过任何级别的 Cloudflare 保护,同时 cURL 抓取一块蛋糕。

方法 5:ZenRows 在 cURL 中绕过 Cloudflare

ZenRows 是新一代抓取库,可帮助您从几乎任何网站(是的,包括受 Cloudflare 保护的网站)检索数据。让我们看看它对受到严密保护的 G2 页面的作用。

首先,在 ZenRows 上创建一个帐户以获取免费的 API 密钥并访问 Request Builder 页面。在那里,复制粘贴您的目标网址<https://www.g2.com/products/asana/reviews>

medium_zenrows_builder_curl_d7900a1fb2

你会看到这个命令行:

curl -k "https://www.g2.com/products/asana/reviews" 
    -L -x "http://YOUR_API_KEY:@proxy.zenrows.com:8001" 

要在 cURL 中绕过 Cloudflare,只需选中复选框Premium ProxyAntibot. 这会将&antibot=trueproxy_country参数添加到您的请求中。

此外,我们将添加--output g2page.html以将结果保存在文件中。

curl -k "https://www.g2.com/products/asana/reviews" 
    -L -x "http://YOUR_API_KEY:antibot=true&premium_proxy=true&proxy_country=us@proxy.zenrows.com:8001" 
    --output g2page.html

最后!在 cURL 中执行 Cloudflare 绕过从未如此简单。

结论

绕过 Cloudflare 已成为许多数据提取项目的关键部分,包括那些使用 cURL 的项目。但是仅仅依靠 cURL 是不够的,还有像 HTTP 标头这样的调整,甚至 cURL-impersonate 也不够。

类似文章