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
相关产品推荐
相关产品推荐

