首頁 後端開發 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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 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/)下載

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

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

提高網站效能和速度的優化方法 提高網站效能和速度的優化方法 Feb 03, 2024 am 08:22 AM

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

PHP快取技術在網站最佳化的重要性 PHP快取技術在網站最佳化的重要性 Jun 19, 2023 pm 06:46 PM

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

See all articles