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

PHP抓取部分URL出现乱码,AJAX站点疑似为诱因

解决Curl抓取网页出现乱码的问题

嘿,我帮你分析下这个问题~你遇到的乱码其实大概率不是AJAX导致的,先看最直接的原因:目标网站返回的内容是Gzip压缩格式,而你的Curl代码没有开启自动解压的选项,所以拿到的是二进制压缩数据,自然显示成一堆乱码啦。

先给你修改后的代码,解决当前的乱码问题:

$url='http://www.varzesh3.com'; 
$ch=curl_init(); 
$timeout=5; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
// 关键:开启自动处理压缩格式(Gzip/Deflate等)
curl_setopt($ch, CURLOPT_ENCODING, '');
// 模拟浏览器请求头,避免被网站识别为爬虫
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');

// 获取URL内容
$lines_string=curl_exec($ch); 
// 检查是否有Curl错误
if(curl_errno($ch)){
    echo 'Curl错误:'.curl_error($ch);
}
// 关闭Curl句柄释放资源
curl_close($ch); 

// 确保编码转换正确(适配网站编码)
$lines_string = mb_convert_encoding($lines_string, 'UTF-8', 'auto');
// 输出内容,也可以保存到服务器本地
echo $lines_string;

我给代码加了两个核心优化点:

  • CURLOPT_ENCODING 设置为空字符串,让Curl自动识别并处理服务器返回的压缩格式,这样就能直接拿到解压后的正常HTML内容了。
  • 加上浏览器UA请求头,很多网站会拒绝非浏览器的请求,模拟UA能降低被拦截的概率。

至于你提到的AJAX站点问题,如果之后发现抓取到的HTML里没有你需要的动态加载内容(比如滚动页面后才出现的信息),那才是AJAX的锅——这类内容是通过JS动态渲染的,普通Curl只能拿到初始静态HTML,这时候你可能需要用支持JS渲染的工具,比如PHP的spatie/browsershot扩展,或者直接用Headless Chrome来抓取完整渲染后的页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:18:12