You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Curl调用目标URL返回Cloudflare验证页,如何获取原始HTML?

解决PHP Curl请求被Cloudflare人机验证拦截的问题

你遇到的是Cloudflare基础反爬机制,它能识别出Curl这类非浏览器请求,所以返回人机验证页面。试试下面这些实用方法:

  • 模拟完整浏览器请求头
    Cloudflare会检查请求中的User-Agent、Accept等标识,把Curl的请求头改成和真实浏览器一致的。示例代码:

    $url = 'http://streetfoodfinder.com/embed/BowzersHotDogStand/calendar/small?d=7&u=BowzersHotDogStand&__cf_chl_rt_tk=M7C3__P7LdOQgsBholCQLZViGZ_C5I3Z5fRz67U0N7g-1735601660-1.0.1.1-fHtNkfe7yezbiI5paU96zDuN5NAuDeaL9_eb22Z0U04';
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    // 设置浏览器请求头
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
        'Accept-Language: en-US,en;q=0.5',
        'Accept-Encoding: gzip, deflate',
        'Connection: keep-alive',
        'Upgrade-Insecure-Requests: 1'
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    echo $response;
    
  • 保存并复用Cookie会话
    Cloudflare会给浏览器下发验证相关Cookie,Curl需要先获取这些Cookie再发起请求。修改代码加入Cookie存储逻辑:

    $cookieFile = tempnam(sys_get_temp_dir(), 'cf_cookie');
    $url = 'http://streetfoodfinder.com/embed/BowzersHotDogStand/calendar/small?d=7&u=BowzersHotDogStand&__cf_chl_rt_tk=M7C3__P7LdOQgsBholCQLZViGZ_C5I3Z5fRz67U0N7g-1735601660-1.0.1.1-fHtNkfe7yezbiI5paU96zDuN5NAuDeaL9_eb22Z0U04';
    
    // 第一次请求获取验证Cookie
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [/* 同上面的浏览器请求头 */]);
    curl_exec($ch);
    curl_close($ch);
    
    // 第二次请求复用Cookie获取目标内容
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [/* 同上面的浏览器请求头 */]);
    $response = curl_exec($ch);
    curl_close($ch);
    
    unlink($cookieFile); // 用完删除临时Cookie文件
    echo $response;
    
  • 用无头浏览器模拟真实访问(更可靠)
    如果上面的方法还是失效,就用无头浏览器(比如Chrome Headless)完全模拟浏览器行为,Cloudflare很难识别。可以用PHP的spatie/browsershot包,步骤如下:
    先安装包:composer require spatie/browsershot
    然后编写代码:

    use Spatie\Browsershot\Browsershot;
    
    $url = 'http://streetfoodfinder.com/embed/BowzersHotDogStand/calendar/small?d=7&u=BowzersHotDogStand&__cf_chl_rt_tk=M7C3__P7LdOQgsBholCQLZViGZ_C5I3Z5fRz67U0N7g-1735601660-1.0.1.1-fHtNkfe7yezbiI5paU96zDuN5NAuDeaL9_eb22Z0U04';
    
    $html = Browsershot::url($url)
        ->userAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0')
        ->waitUntilNetworkIdle()
        ->html();
    
    echo $html;
    

    注意:这个方法需要提前安装Chrome或Chromium,并配置好运行环境。

  • 解析Cloudflare的JS验证(进阶)
    如果页面包含Cloudflare的验证脚本,需要提取其中的cf_clearance等关键参数。可以通过PHP扩展v8js执行JS代码,或者调用Node.js脚本处理验证逻辑,再把生成的Cookie和参数加入Curl请求。这个步骤复杂度较高,适合有JS和PHP基础的开发者。

内容的提问来源于stack exchange,提问作者Shawn Mulligan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:27:21