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

PHP Curl无法正常获取指定URL内容的技术求助

解决Curl抓取目标URL返回无意义字符串的问题

我来帮你排查这个问题——你用Curl抓取指定的BM&F Bovespa文档页面时,返回了无意义的长字符串,但同域名下其他页面能正常抓取,还确认了目标页面不需要JS/Ajax加载,对吧?

核心原因分析

这种情况大概率是目标服务器返回了gzip/deflate压缩后的内容,而你的Curl请求没有开启自动解压的参数,所以拿到的是二进制压缩数据,看起来就像乱码字符串。

修正后的Curl参数设置

你只需要添加两个关键参数,让Curl自动处理压缩内容,同时可以优化下安全和请求模拟的设置:

$url = "https://fnet.bmfbovespa.com.br/fnet/publico/exibirDocumento?id=77212&cvm=true";
$ch = curl_init();
curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/cacert.pem');
// 建议开启SSL验证,关闭验证存在安全风险,你已指定CA证书可正常启用
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 添加以下两个参数处理压缩内容
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
curl_setopt($ch, CURLOPT_ACCEPT_ENCODING, 'gzip, deflate');
// 可选:模拟浏览器请求头,部分网站会校验User-Agent字段
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');

$html = curl_exec($ch);
echo "$url\n\n";
die($html);

参数说明

  1. CURLOPT_ENCODING:告知Curl支持gzip和deflate压缩格式,会自动解压服务器返回的压缩内容
  2. CURLOPT_ACCEPT_ENCODING:在请求头中添加Accept-Encoding字段,主动告诉服务器客户端可以接受压缩后的响应
  3. 恢复CURLOPT_SSL_VERIFYPEER为1:既然已经指定了CA证书路径,开启SSL验证能避免中间人攻击的安全风险

如果添加这些参数后仍有问题,可以尝试添加CURLOPT_REFERER参数模拟跳转来源,但根据你的描述,同域名其他页面正常抓取,大概率就是压缩处理的问题导致的乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:57:36