php curl函数采集网页出现gzip压缩、编码不同导致的乱码 图文解决方法
方法一:
header("content-type:text/html;charset=utf-8");
$url="http://115.47.116.10/rest/keyword
'";
$content = file_get_contents("compress.zlib://".$url);
$arr=json_decode($content,true);
print_r($arr);
二:
curl乱码有两个方面的原因一个是因为我们采集页面的php页面编码与远程文档编码不致导致的,另一种可能是页面进入了gzip压缩传输导致的,那么我们要如何解决这些问题呢?
gzip压缩传输导致乱码
今天在采集京东的时候发现返回的数据是乱码,网上说可能和压缩有关,看了一下京东的头信息的确进行gzip加密,好吧,那就解压吧
1
|
$return = gzdecode($return); //将return的字符进行解码
|
另一种解决办法
1
|
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
|
页面编码问题
1
|
mb_convert_encoding($str, 'utf-8', 'GBK,UTF-8,ASCII');
|
完整代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// curl 伪造agent抓取页面
function http_get($URL,$key='baidu') {
$agent = Flight::get('flight.spider_agent')[$key];
if( !$agent ){
return false;
}
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_USERAGENT, $agent);
curl_setopt($c, CURLOPT_HTTPHEADER,array('Accept-Encoding: gzip, deflate'));
curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');//这个是解释gzip内容.................
curl_setopt($c, CURLOPT_URL, $URL);
curl_setopt($c, CURLOPT_TIMEOUT,2);
$contents = curl_exec($c);
$contents = mb_convert_encoding($contents, 'utf-8', 'GBK,UTF-8,ASCII');
$httpCode = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
return ['data'=>$contents,'http_code'=>$httpCode];
}
|