php file_get_contents抓取Gzip网页乱码的三种解决方法
用 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引起的抓取乱码问题了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何使用PHP開發快取提高網站的使用者體驗度摘要:快取是在網站開發中提高使用者體驗度的重要手段之一。本文將介紹如何使用PHP開發緩存,以提高網站的回應速度和減輕伺服器負載。具體包括頁面快取、資料快取和靜態資源緩存,並給出相應的程式碼範例。簡介隨著網路的快速發展,使用者對於網站的要求也越來越高。一個快速反應的網站對於使用者體驗的提升有著至關重要的作用。而快取就是實現這

隨著網路的快速發展,網站對於企業和個人的重要性越來越高,為了吸引更多的流量和改善用戶體驗,網站優化和SEO已經成為了不可或缺的一環。在這方面,寶塔面板是一個非常好用的工具,可以輕鬆地進行網站優化和SEO,以下將詳細介紹如何使用寶塔面板進行網站優化和SEO。一、安裝寶塔面板如果你還沒安裝寶塔面板,可以前往寶塔官網(https://www.bt.cn/)下載

深入探討HTTP狀態碼301:為何在網站優化中至關重要在網路的世界中,網站的效能和使用者體驗至關重要。作為網站優化的一部分,了解HTTP狀態碼的作用至關重要。其中一個最重要的狀態碼是301,也被稱為永久重定向。本文將探討HTTP狀態碼301的意義,並解釋為何在網站最佳化中至關重要。 HTTP狀態碼是由伺服器傳回給客戶端的一種數位化程式碼。這些代碼向客戶端傳達了與

Nginx負載平衡演算法配置,高效優化網站服務分發概述:在大規模Web應用中,為了增加系統的容錯性和可擴展性,通常會採用負載平衡來分發網路請求。 Nginx作為高效能的反向代理伺服器,具有強大的負載平衡功能,可以根據不同的演算法策略來進行請求的分發。本文將介紹Nginx的負載平衡演算法配置,並給出對應的程式碼範例。一、負載平衡演算法介紹Nginx提供了多種負載平衡算

JavaScript錯誤會影響網站效能。為了修復這些錯誤,請:使用Web開發工具查看錯誤。檢查錯誤追蹤以獲取詳細錯誤訊息。檢查程式碼中的變數是否已初始化或存在值。使用靜態分析來尋找語法和邏輯問題。啟用錯誤處理以提供友善的錯誤訊息。監控網站以檢測持續存在的錯誤。

優化網站效能的關鍵指標詳解:如何透過指標分析提升你的網站使用者體驗?隨著網路的快速發展,網站成為企業展示品牌形象和提供產品與服務的重要管道。然而,隨著用戶對於線上體驗的要求不斷提高,網站效能的重要性也日益凸顯。優化網站效能不僅可以提升使用者體驗,還可以增加使用者的黏性和轉換率。本文將詳細介紹優化網站效能的關鍵指標,並闡述如何透過指標分析來提升你的網站使用者體驗。一

如何透過優化提升網站的效能和速度隨著網路的快速發展,網站成為了企業宣傳、產品銷售和資訊交流的重要管道。然而,由於用戶的期望越來越高,網站效能和速度成為了用戶體驗的重要指標。一個擁有良好效能和快速載入速度的網站能夠提高用戶滿意度、增加轉換率和提升搜尋引擎排名。以下我們將詳細探討如何透過優化來提升網站的效能和速度。壓縮和優化圖片:圖像通常佔據網頁載入時間的

作為一種非常流行的程式語言,PHP在網站開發中得到了廣泛應用。然而,由於PHP本身的缺陷,導致其在性能方面存在一定的不足。例如,PHP需要解析和編譯每次請求,這會導致網站回應速度較慢,影響使用者體驗。因此,為了解決這個問題,PHP快取技術應運而生。 PHP快取技術是針對PHP解譯器中的解析和編譯過程進行的最佳化,它的本質就是將已經解析、編譯好的PHP腳本快取起來,
