如何使用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 反机器人保护的加密货币跟踪平台。
我们首先向我们的目标网站发送请求。
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 的网络选项卡,然后刷新页面。
在那里,我们可以看到负责我们试图获取的页面的请求。单击 URL 打开标头选项卡,我们可以在其中找到请求标头部分。
然后,我们必须右键单击并复制 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 来模仿真实的浏览器。从下载并安装它开始。
- 主项目支持 Linux 和 macOS。
- 补丁cURL-impersonate-win也可以在 Windows 上运行。
现在,让我们模拟运行 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 的产品页面。
您可能会猜到发生了什么:我们被阻止了!
<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>
你会看到这个命令行:
curl -k "https://www.g2.com/products/asana/reviews" -L -x "http://YOUR_API_KEY:@proxy.zenrows.com:8001"
要在 cURL 中绕过 Cloudflare,只需选中复选框Premium Proxy
和Antibot
. 这会将&antibot=true
和proxy_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 也不够。