首页 后端开发 php教程 file_get_contents抓取网页乱码的解决_PHP教程

file_get_contents抓取网页乱码的解决_PHP教程

Jul 13, 2016 am 10:34 AM
file_get_contents gzip

有时候用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了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.bkjia.com; PHPSESSID=888mj4425p8s0m7s0frre3ovc7; __utmc=225240837; __utmb=225240837.1.10.1335411401
Host	www.bkjia.com
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.bkjia.com/librarys/veda/');
$html=gzdecode($html);
登录后复制

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752354.htmlTechArticle有时候用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了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脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
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)

热门话题

Java教程
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
如何解决PHP Warning: file_get_contents(): Filename cannot be empty 如何解决PHP Warning: file_get_contents(): Filename cannot be empty Aug 18, 2023 pm 07:30 PM

如何解决PHPWarning:file_get_contents():Filenamecannotbeempty在进行PHP开发的过程中,我们经常会遇到这样的错误提示:PHPWarning:file_get_contents():Filenamecannotbeempty。这个错误通常出现在使用file_get_contents函数时

如何解决PHP警告:file_get_contents():无法打开流:HTTP请求失败 如何解决PHP警告:file_get_contents():无法打开流:HTTP请求失败 Aug 18, 2023 pm 11:34 PM

如何解决PHPWarning:file_get_contents():failedtoopenstream:HTTPrequestfailed在进行PHP开发过程中,经常会遇到通过file_get_contents函数向远程服务器发起HTTP请求的情况。然而,有时候我们会遇到一个常见的错误提示:PHPWarning:file_get_c

PHP文件缓存函数详解:file_get_contents、file_put_contents、unlink等函数的文件缓存处理方法 PHP文件缓存函数详解:file_get_contents、file_put_contents、unlink等函数的文件缓存处理方法 Nov 18, 2023 am 09:37 AM

PHP文件缓存函数详解:file_get_contents、file_put_contents、unlink等函数的文件缓存处理方法,需要具体代码示例在Web开发中,我们经常需要从文件中读取数据或将数据写入到文件中。而且,在某些情况下,我们需要缓存文件的内容以避免频繁的文件读写操作,从而提高性能。在PHP中,有几个常用的函数可以帮助我们实现文件缓存,这其中包

nginx gzip动态压缩和静态压缩怎么配置 nginx gzip动态压缩和静态压缩怎么配置 May 12, 2023 am 08:25 AM

动态压缩动态压缩实际上就是由nginx服务器对编译造物进行压缩,需要在nginx.conf的http、https模块中开启下面的配置:gzipon;#开启gizo压缩gzip_min_length1k;#gizp压缩起点,文件大于1k才进行压缩gzip_comp_level6;#压缩级别数字越大压缩得越小但是越耗性能根据实际情况而定gzip_proxiedany;#nginx做为反向代理时启用,详细见官方文档:http://nginx.org/en/docs/http/ngx_http_gzip

Nginx性能优化之Gzip压缩的设置方法 Nginx性能优化之Gzip压缩的设置方法 May 29, 2023 pm 05:40 PM

Nginx开启Gzip压缩功能,可以使网站的css、js、xml、html文件在传输时进行压缩,提高访问速度,进而优化Nginx性能!Web网站上的图片,视频等其它多媒体文件以及大文件,因为压缩效果不好,所以对于图片没有必要支压缩,如果想要优化,可以图片的生命周期设置长一点,让客户端来缓存。开启Gzip功能后,Nginx服务器会根据配置的策略对发送的内容,如css、js、xml、html等静态资源进行压缩,使得这些内容大小减少,在用户接收到返回内容之前对其进行处理,以压缩后的数据展现给客户。这样

PHP的file_get_contents()函数:如何从文件中读取内容 PHP的file_get_contents()函数:如何从文件中读取内容 Nov 04, 2023 pm 01:43 PM

PHP的file_get_contents()函数:如何从文件中读取内容,具体代码示例在PHP中,file_get_contents()是一个非常有用的函数,它允许我们从文件中读取内容。无论是读取文本文件,还是读取远程URL中的内容,该函数都能够轻松地完成任务。语法该函数的基本语法如下:stringfile_get_contents(string$f

Nginx基础入门之gzip配置的方法 Nginx基础入门之gzip配置的方法 Jun 03, 2023 am 09:52 AM

前言gzip(gnu-zip)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析。浏览器那里不需要我们担心,因为目前的巨大多数浏览器都支持解析gzip过的页面。无论是前端还是后端,在部署项目时,时常免不了用到nginx,小项目也时常做个反向代理啥的。今天就简单直接,聊一下其中的一个点——gzip。如有错误,欢迎指正。一般服务器端常用的是u

PHP函数介绍—file_get_contents(): 读取URL的内容到字符串 PHP函数介绍—file_get_contents(): 读取URL的内容到字符串 Jul 24, 2023 pm 02:32 PM

PHP函数介绍—file_get_contents():读取URL的内容到字符串在Web开发中,经常需要从远程服务器获取数据或者读取远程文件。PHP提供了一个非常强大的函数file_get_contents(),它可以方便地读取URL的内容并将其保存到一个字符串中。本文将介绍file_get_contents()函数的用法,并给出一些代码示例来帮助读者更好

See all articles