首页 后端开发 php教程 php file_get_contents抓取Gzip网页乱码的三种解决方法

php file_get_contents抓取Gzip网页乱码的三种解决方法

Jun 20, 2016 pm 01:01 PM
网站优化

用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了Gzip,下面说的就是开了Gzip功能如何才能不乱码的方法

把抓取到的内容转下编码即可($content=iconv("GBK", "UTF-8//IGNORE", $content);),我们这里讨论的是如何抓取开了Gzip的页面。怎么判断呢?获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的。用FireBug看一下就知道页面开了gzip没有。下面是用firebug查看我的博客的头信息,Gzip是开了的。
请求头信息原始头信息
 

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-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
Host www.nowamagic.net
User-Agent Mozilla/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,0,2),"\x1f\x8b")) { 
    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,8,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",substr($data,8,2)); 
    $extralen = $extralen[1]; 
    if ($len - $headerlen - 2 - $extralen < 8) { 
      return false;    // Invalid format 
    } 
    $extra = substr($data,10,$extralen); 
    $headerlen += 2 + $extralen; 
  }



  $filenamelen = 0; 
  $filename = ""; 
  if ($flags & 8) { 
    // C-style string file NAME data in header 
    if ($len - $headerlen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $filenamelen = strpos(substr($data,8+$extralen),chr(0)); 
    if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $filename = substr($data,$headerlen,$filenamelen); 
    $headerlen += $filenamelen + 1; 
  }

  $commentlen = 0; 
  $comment = ""; 
  if ($flags & 16) { 
    // C-style string COMMENT data in header 
    if ($len - $headerlen - 1 < 8) { 
      return false;    // Invalid format 
    } 
    $commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0)); 
    if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) { 
      return false;    // Invalid header format 
    } 
    $comment = substr($data,$headerlen,$commentlen); 
    $headerlen += $commentlen + 1; 
  }

  $headercrc = ""; 
  if ($flags & 1) { 
    // 2-bytes (lowest order) of CRC32 on header present 
    if ($len - $headerlen - 2 < 8) { 
      return false;    // Invalid format 
    } 
    $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff; 
    $headercrc = unpack("v", substr($data,$headerlen,2)); 
    $headercrc = $headercrc[1]; 
    if ($headercrc != $calccrc) { 
      return false;    // Bad header CRC 
    } 
    $headerlen += 2; 
  }

  // GZIP FOOTER - These be negative due to PHP's limitations 
  $datacrc = unpack("V",substr($data,-8,4)); 
  $datacrc = $datacrc[1]; 
  $isize = unpack("V",substr($data,-4)); 
  $isize = $isize[1];

  // Perform the decompression: 
  $bodylen = $len-$headerlen-8; 
  if ($bodylen < 1) { 
    // This should never happen - IMPLEMENTATION BUG! 
    return null; 
  } 
  $body = substr($data,$headerlen,$bodylen); 
  $data = ""; 
  if ($bodylen > 0) { 
    switch ($method) { 
      case 8: 
        // Currently the only supported compression method: 
        $data = gzinflate($body); 
        break; 
      default: 
        // Unknown compression method 
        return false; 
    } 
  } else { 
    // I'm not sure if zero-byte body content is allowed. 
    // Allow it for now...  Do nothing... 
  }

  // Verifiy decompressed size and CRC32: 
  // NOTE: This may fail with large data sizes depending on how 
  //       PHP's integer limitations affect strlen() since $isize 
  //       may be negative for large sizes. 
  if ($isize != strlen($data) || crc32($data) != $datacrc) { 
    // Bad format!  Length or CRC doesn't match! 
    return false; 
  } 
  return $data; 
}
登录后复制


使用:

$html=file_get_contents('http://www.jb51.net/');
$html=gzdecode($html);
登录后复制


就介绍这三个方法,应该能解决大部分gzip引起的抓取乱码问题了。


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用PHP开发缓存提高网站的用户体验度 如何使用PHP开发缓存提高网站的用户体验度 Nov 07, 2023 pm 04:18 PM

如何使用PHP开发缓存提高网站的用户体验度摘要:缓存是在网站开发中提高用户体验度的重要手段之一。本文将介绍如何使用PHP开发缓存,以提高网站的响应速度和减轻服务器负载。具体包括页面缓存、数据缓存和静态资源缓存,并给出相应的代码示例。简介随着互联网的快速发展,用户对于网站的要求也越来越高。一个快速响应的网站对于用户体验的提升有着至关重要的作用。而缓存就是实现这

如何使用宝塔面板进行网站优化和SEO 如何使用宝塔面板进行网站优化和SEO Jun 21, 2023 am 09:07 AM

随着互联网的快速发展,网站对于企业和个人的重要性越来越高,为了吸引更多的流量和改善用户体验,网站优化和SEO已经成为了不可或缺的一环。在这方面,宝塔面板是一个非常好用的工具,可以方便地进行网站优化和SEO,下面将详细介绍如何使用宝塔面板进行网站优化和SEO。一、安装宝塔面板如果你还没有安装宝塔面板,可以前往宝塔官网(https://www.bt.cn/)下载

提高网站性能和速度的优化方法 提高网站性能和速度的优化方法 Feb 03, 2024 am 08:22 AM

如何通过优化提升网站的性能和速度随着互联网的快速发展,网站已经成为了企业宣传、产品销售和信息交流的重要渠道。然而,由于用户的期望越来越高,网站性能和速度成为了用户体验的重要指标。一个拥有良好性能和快速加载速度的网站能够提高用户满意度、增加转化率和提升搜索引擎排名。下面我们将详细探讨如何通过优化来提升网站的性能和速度。压缩和优化图像:图像通常占据网页加载时间的

HTTP状态码301的重要性在网站优化中的深入研究 HTTP状态码301的重要性在网站优化中的深入研究 Feb 19, 2024 pm 08:01 PM

深入探究HTTP状态码301:为何在网站优化中至关重要在互联网的世界中,网站的性能和用户体验至关重要。作为网站优化的一部分,了解HTTP状态码的作用至关重要。其中一个最重要的状态码是301,也被称为永久重定向。本文将探究HTTP状态码301的含义,并解释为什么在网站优化中至关重要。HTTP状态码是由服务器返回给客户端的一种数字化代码。这些代码向客户端传达了与

Nginx负载均衡算法配置,高效优化网站服务分发 Nginx负载均衡算法配置,高效优化网站服务分发 Jul 04, 2023 pm 08:10 PM

Nginx负载均衡算法配置,高效优化网站服务分发概述:在大规模Web应用中,为了增加系统的容错性和可伸缩性,通常会采用负载均衡来分发网络请求。Nginx作为一款高性能的反向代理服务器,具备强大的负载均衡功能,可以根据不同的算法策略来进行请求的分发。本文将介绍Nginx的负载均衡算法配置,并给出相应的代码示例。一、负载均衡算法介绍Nginx提供了多种负载均衡算

优化你的网站,消除 JavaScript 错误 优化你的网站,消除 JavaScript 错误 Apr 09, 2024 pm 03:09 PM

JavaScript错误会影响网站性能。为了修复这些错误,请:使用Web开发工具查看错误。检查错误跟踪以获取详细错误信息。检查代码中的变量是否已初始化或存在值。使用静态分析查找语法和逻辑问题。启用错误处理以提供友好的错误消息。监控网站以检测持续存在的错误。

优化网站性能的关键要素揭秘:如何利用指标分析改善用户体验? 优化网站性能的关键要素揭秘:如何利用指标分析改善用户体验? Feb 02, 2024 pm 06:36 PM

优化网站性能的关键指标详解:如何通过指标分析提升你的网站用户体验?随着互联网的快速发展,网站成为企业展示品牌形象和提供产品与服务的重要渠道。然而,随着用户对于在线体验的要求不断提高,网站性能的重要性也日益凸显。优化网站性能不仅可以提升用户体验,还可以增加用户的黏性和转化率。本文将详细介绍优化网站性能的关键指标,并阐述如何通过指标分析来提升你的网站用户体验。一

PHP缓存技术在网站优化中的重要性 PHP缓存技术在网站优化中的重要性 Jun 19, 2023 pm 06:46 PM

作为一款非常流行的编程语言,PHP在网站开发中得到了广泛应用。然而,由于PHP本身的缺陷,导致其在性能方面存在一定的不足。例如,PHP需要解析和编译每次请求,这会导致网站响应速度较慢,影响用户体验。因此,为了解决这个问题,PHP缓存技术应运而生。PHP缓存技术是针对PHP解释器中的解析和编译过程进行的优化,它的本质就是将已经解析和编译好的PHP脚本缓存起来,

See all articles