백엔드 개발 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 경고 해결 방법: file_get_contents(): 파일 이름은 비워둘 수 없습니다. PHP 경고 해결 방법: file_get_contents(): 파일 이름은 비워둘 수 없습니다. Aug 18, 2023 pm 07:30 PM

PHPWarning 해결 방법: file_get_contents(): 파일 이름은 비울 수 없습니다. PHP 개발 과정에서 다음과 같은 오류 메시지가 자주 나타납니다. PHPWarning: file_get_contents(): 파일 이름은 비울 수 없습니다. 이 오류는 일반적으로 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 및 기타 기능의 파일 캐싱 처리 방법은 종종 파일에서 데이터를 읽거나 파일에 데이터를 써야 합니다. 또한 어떤 경우에는 빈번한 파일 읽기 및 쓰기 작업을 피하기 위해 파일 내용을 캐시하여 성능을 향상시켜야 합니다. PHP에는 파일 캐싱을 구현하는 데 도움이 되는 일반적으로 사용되는 몇 가지 함수가 있습니다.

nginx gzip 동적 압축 및 정적 압축을 구성하는 방법 nginx gzip 동적 압축 및 정적 압축을 구성하는 방법 May 12, 2023 am 08:25 AM

동적 압축 동적 압축은 실제로 nginx 서버가 nginx.conf의 http 및 https 모듈에서 다음 구성을 활성화해야 함을 의미합니다. #Enable gizo 압축 gzip_min_length1k; 파일이 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는 전송 중에 웹사이트의 CSS, js, xml 및 html 파일을 압축할 수 있는 Gzip 압축 기능을 활성화하여 액세스 속도를 향상시킨 다음 Nginx! 이미지, 비디오 및 기타 멀티미디어 파일과 대용량 파일의 성능을 최적화합니다. 웹사이트의 경우 압축으로 인해 압축되므로 효과가 좋지 않으므로 이미지에 대한 압축을 지원할 필요가 없습니다. 최적화하려면 이미지의 수명 주기를 더 길게 설정하고 클라이언트가 캐시하도록 할 수 있습니다. 그것. Gzip 기능을 활성화한 후 Nginx 서버는 구성된 정책에 따라 CSS, js, xml, html 및 기타 정적 리소스와 같은 전송된 콘텐츠를 압축하여 콘텐츠 크기를 줄이고 사용자는 이를 처리합니다. 반환된 콘텐츠를 받기 전에 압축된 데이터가 고객에게 표시됩니다. 그래서

PHP 함수 소개—file_get_contents(): URL 내용을 문자열로 읽어옵니다. PHP 함수 소개—file_get_contents(): URL 내용을 문자열로 읽어옵니다. Jul 24, 2023 pm 02:32 PM

PHP 함수 소개—file_get_contents(): URL의 내용을 문자열로 읽어옵니다. 웹 개발에서는 원격 서버에서 데이터를 얻거나 원격 파일을 읽어야 하는 경우가 많습니다. PHP는 URL의 내용을 편리하게 읽고 문자열로 저장할 수 있는 매우 강력한 함수 file_get_contents()를 제공합니다. 이 기사에서는 file_get_contents() 함수의 사용법을 소개하고 독자가 더 잘 이해할 수 있도록 몇 가지 코드 예제를 제공합니다.

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

gzip 구성 방법에 대한 Nginx 기본 소개 gzip 구성 방법에 대한 Nginx 기본 소개 Jun 03, 2023 am 09:52 AM

서문 gzip(gnu-zip)은 압축 기술입니다. gzip 압축 후 페이지 크기는 원래 크기보다 30% 또는 더 작게 줄어들 수 있으므로 사용자는 페이지를 훨씬 빠르게 탐색할 수 있습니다. gzip으로 압축된 페이지는 브라우저와 서버 모두에서 지원되어야 합니다. 실제로는 브라우저로 전송된 후 브라우저가 압축을 풀고 구문 분석합니다. 대부분의 최신 브라우저는 gzip 페이지 구문 분석을 지원하므로 브라우저에 대해 걱정할 필요가 없습니다. 프론트엔드든 백엔드든 프로젝트를 배포할 때 nginx를 자주 사용하고, 소규모 프로젝트에서는 리버스 프록시 등을 사용하는 경우가 많습니다. 오늘은 간단하고 직접적으로 요점 중 하나인 gzip에 대해 이야기하겠습니다. 오류가 있으면 정정해 주세요. 일반적으로 서버 측에서 사용되는 것은 u입니다.

See all articles