首頁 後端開發 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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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 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

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()函數的用法,並給出一些程式碼範例來幫助讀者更好

Nginx基礎入門之gzip設定的方法 Nginx基礎入門之gzip設定的方法 Jun 03, 2023 am 09:52 AM

前言gzip(gnu-zip)是一種壓縮技術。經過gzip壓縮後頁面大小可以變成原來的30%甚至更小,這樣,使用者瀏覽頁面的時候速度會塊得多。 gzip的壓縮頁面需要瀏覽器和伺服器雙方都支持,實際上就是伺服器端壓縮,傳到瀏覽器後瀏覽器解壓縮並解析。瀏覽器那裡不需要我們擔心,因為目前的巨大多數瀏覽器都支援解析gzip過的頁面。無論是前端或後端,部署專案時,常常免不了用到nginx,小專案也常做個反向代理啥的。今天就簡單直接,聊聊其中的一個點-gzip。如有錯誤,歡迎指正。一般伺服器端常用的是u

See all articles