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);
参数说明
- CURLOPT_ENCODING:告知Curl支持gzip和deflate压缩格式,会自动解压服务器返回的压缩内容
- CURLOPT_ACCEPT_ENCODING:在请求头中添加
Accept-Encoding字段,主动告诉服务器客户端可以接受压缩后的响应 - 恢复
CURLOPT_SSL_VERIFYPEER为1:既然已经指定了CA证书路径,开启SSL验证能避免中间人攻击的安全风险
如果添加这些参数后仍有问题,可以尝试添加CURLOPT_REFERER参数模拟跳转来源,但根据你的描述,同域名其他页面正常抓取,大概率就是压缩处理的问题导致的乱码。
内容的提问来源于stack exchange,提问作者Tarilonte
相关产品推荐
相关产品推荐

