php file_get_contents抓取Gzip网页乱码的三种解决方法
把抓取到的内容转下编码即可($content=iconv("GBK","UTF-8//IGNORE",$content);),我们这里讨论的是如何抓取开了Gzip的页面。怎么判断呢?获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的。用FireBug看一下就知道页面开了gzip没有。下面是用firebug查看我的博客的头信息,Gzip是开了的。 代码如下: 请求头信息原始头信息 Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encodinggzip,deflate Accept-Languagezh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Connectionkeep-alive Cookie__utma=225240837.787252530.1317310581.1335406161.1335411401.1537; __utmz=225240837.1326850415.887.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=%E4%BB%BB%E4%BD%95%E9%A1%B9%E7%9B%AE%E9%83%BD%E4%B8%8D%E4%BC%9A%E9%82%A3%E4%B9%88%E7%AE%80%E5%8D%95%20site%3Awww.nowamagic.net; PHPSESSID=888mj4425p8s0m7s0frre3ovc7; __utmc=225240837; __utmb=225240837.1.10.1335411401 Hostwww.nowamagic.net User-AgentMozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0 下面介绍一些解决方案: 1. 使用自带的zlib库如果服务器已经装了zlib库,用下面的代码可以轻易解决乱码问题。 代码如下: $data = file_get_contents("compress.zlib://".$url);
2. 使用CURL代替file_get_contents 代码如下: function curl_get($url,$gzip=false){
$curl = curl_init($url); curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10); if($gzip) curl_setopt($curl,CURLOPT_ENCODING,"gzip"); // 关键在这里 $content = curl_exec($curl); curl_close($curl); return $content; } 3. 使用gzip解压函数 代码如下: function gzdecode($data) { $len = strlen($data); if ($len < 18 || strcmp(substr($data,2),"x1fx8b")) { return null; // Not GZIP format (See RFC 1952) } $method = ord(substr($data,2,1)); // Compression method $flags = ord(substr($data,3,1)); // Flags if ($flags & 31 != $flags) { // Reserved bits are set -- NOT ALLOWED by RFC 1952 return null; } // NOTE: $mtime may be negative (PHP integer limitations) $mtime = unpack("V",substr($data,4,4)); $mtime = $mtime[1]; $xfl = substr($data,8,1); $os = substr($data,1); $headerlen = 10; $extralen = 0; $extra = ""; if ($flags & 4) { // 2-byte length prefixed EXTRA data in header if ($len - $headerlen - 2 < 8) { return false; // Invalid format } $extralen = unpack("v",2)); $extralen = $extralen[1]; if ($len - $headerlen - 2 - $extralen < 8) { return false; // Invalid format } $extra = substr($data,10,$extralen); $headerlen += 2 + $extralen; } $filenamelen = 0; $commentlen = 0; $headercrc = ""; // GZIP FOOTER - These be negative due to PHP's limitations // Perform the decompression: // Verifiy decompressed size and CRC32: 使用: 代码如下: $html=file_get_contents('//www.52php.cn/'); $html=gzdecode($html); 就介绍这三个方法,应该能解决大部分gzip引起的抓取乱码问题了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |