首页 > 解决方案 > PHP Curl - 是否有可能避开 Cloudflare 块?

问题描述

我们最近在一些我们过去没有遇到过抓取问题的网站上遇到了 CloudFare 阻塞。

它不是一个 IP 块(从多个 IP 尝试),它不与帐户或任何其他类型的身份验证绑定。该网站不显示用户验证码

我们使用包含所有标头的确切请求创建了一个 PHP Curl 请求GET,但我们收到一个403 Forbidden错误并显示:

www.******.com used CloudFlare to restrict access

原谅我的无知,但是 CloudFlare 是如何检测到这一点的呢?不涉及 cookie(作为其初始站点请求),用户代理和其他一切都是相同的。

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://www.******.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);

$headers = array();
$headers[] = 'Host: www.******.com';
$headers[] = 'Connection: keep-alive';
$headers[] = 'Sec-Ch-Ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"';
$headers[] = 'Sec-Ch-Ua-Mobile: ?0';
$headers[] = 'Upgrade-Insecure-Requests: 1';
$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36';
$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';
$headers[] = 'Sec-Fetch-Site: none';
$headers[] = 'Sec-Fetch-Mode: navigate';
$headers[] = 'Sec-Fetch-User: ?1';
$headers[] = 'Sec-Fetch-Dest: document';
$headers[] = 'Accept-Encoding: gzip, deflate, br';
$headers[] = 'Accept-Language: en-US,en;q=0.9';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);

结果

HTTP/1.1 403 Forbidden

任何可能的解决方法?

谢谢

标签: phpcurlcloudflare

解决方案


我认为只有 cloudflare 开发人员才能给你正确的答案。但他们不会那么轻易地公开他们的商业秘密。所有其他信息都是理论和推测。据我所知,作为对站点 cloudflare 的第一个请求的响应,显示带有一些 javascript 的页面以配置浏览器,以证明它是人类使用的堆栈浏览器,而不是 curl。如果浏览器是堆栈一,则 cloudflare 允许后端处理请求。

我认为您可以尝试 selenium,有时它不会触发带有验证码的 cloudflare 阻止程序页面


推荐阅读