PHP Curl获取CloudFront保护网站内容不全问题求助
解决CloudFront保护页面的PHP Curl请求不完整问题
针对你用PHP Curl请求受CloudFront保护的页面却拿不到完整内容的问题,可从以下几点调整代码:
- 启用内容解码:你注释了
Accept-Encoding头,服务器返回的压缩内容Curl不会自动解码,导致内容乱码或不完整。恢复该头并开启Curl的编码处理选项。 - 支持Cookie会话:CloudFront会通过Cookie验证会话,需开启Curl的Cookie存储功能,保存并复用请求过程中的Cookie。
- 跟随重定向:CloudFront可能返回3xx重定向,需开启Curl的自动跟随重定向选项。
- 移除多余设置:GET请求无需手动指定
CURLOPT_CUSTOMREQUEST,默认即可,多余设置可能触发反爬机制。
修改后的完整代码:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.tod.tv/en'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 启用gzip/deflate/br自动解码 curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate, br'); // 自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 保存和复用Cookie,确保脚本有cookie.txt的读写权限 curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0', '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, br', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', 'Sec-Fetch-Dest: document', 'Sec-Fetch-Mode: navigate', 'Sec-Fetch-Site: none', 'Sec-Fetch-User: ?1', ]); // 捕获Curl错误,方便排查问题 if(curl_errno($ch)) { echo 'Curl错误: ' . curl_error($ch); } $response = curl_exec($ch); curl_close($ch); echo $response;
如果调整后仍无法获取完整内容,说明CloudFront触发了人机验证(CAPTCHA),这种情况单纯靠Curl无法绕过,需要使用无头浏览器(如Puppeteer、Selenium)模拟真实浏览器交互来解决。
内容的提问来源于stack exchange,提问作者chouaib23
相关产品推荐
相关产品推荐

