file_get_contents抓取网页乱码的解决_PHP教程
有时候用 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引起的抓取乱码问题了。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











PHPWarning 해결 방법: file_get_contents(): 파일 이름은 비울 수 없습니다. PHP 개발 과정에서 다음과 같은 오류 메시지가 자주 나타납니다. PHPWarning: file_get_contents(): 파일 이름은 비울 수 없습니다. 이 오류는 일반적으로 file_get_contents 함수를 사용할 때 발생합니다.

PHPWarning:file_get_contents():failedtoopenstream:HTTPrequestfailed 해결 방법 PHP 개발 중에 file_get_contents 함수를 통해 HTTP 요청이 원격 서버로 시작되는 상황이 자주 발생합니다. 그러나 때때로 다음과 같은 일반적인 오류 메시지가 표시됩니다: PHPWarning: file_get_c

PHP 파일 캐싱 기능에 대한 자세한 설명: 특정 코드 예제가 필요한 file_get_contents, file_put_contents, unlink 및 기타 기능의 파일 캐싱 처리 방법은 종종 파일에서 데이터를 읽거나 파일에 데이터를 써야 합니다. 또한 어떤 경우에는 빈번한 파일 읽기 및 쓰기 작업을 피하기 위해 파일 내용을 캐시하여 성능을 향상시켜야 합니다. PHP에는 파일 캐싱을 구현하는 데 도움이 되는 일반적으로 사용되는 몇 가지 함수가 있습니다.

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

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

PHP의 file_get_contents() 함수: 파일에서 내용을 읽는 방법, 특정 코드 예 PHP에서 file_get_contents()는 파일에서 내용을 읽을 수 있게 해주는 매우 유용한 함수입니다. 텍스트 파일을 읽든 원격 URL에서 콘텐츠를 읽든 이 기능을 사용하면 작업을 쉽게 완료할 수 있습니다. 구문 이 함수의 기본 구문은 다음과 같습니다. stringfile_get_contents(string$f

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