Heim Backend-Entwicklung PHP-Tutorial 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
Nach dem Login kopieren

下面介绍一些解决方案:

1. 使用自带的zlib库

如果服务器已经装了zlib库,用下面的代码可以轻易解决乱码问题。

$data = file_get_contents("compress.zlib://".$url); 
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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; 
}
Nach dem Login kopieren

使用:

$html=file_get_contents('http://www.bkjia.com/librarys/veda/');
$html=gzdecode($html);
Nach dem Login kopieren

就介绍这三个方法,应该能解决大部分gzip引起的抓取乱码问题了。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752354.htmlTechArticle有时候用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了Gzip。 编码问题好...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So lösen Sie PHP-Warnung: file_get_contents(): Dateiname darf nicht leer sein So lösen Sie PHP-Warnung: file_get_contents(): Dateiname darf nicht leer sein Aug 18, 2023 pm 07:30 PM

So lösen Sie PHPWarning: file_get_contents(): Filenamecannotbeempty Im Prozess der PHP-Entwicklung stoßen wir häufig auf diese Fehlermeldung: PHPWarning: file_get_contents(): Filenamecannotbeempty. Dieser Fehler tritt normalerweise bei Verwendung der Funktion file_get_contents auf

如何解决PHP-Warnung: file_get_contents(): Fehler beim Öffnen des Streams: HTTP-Anfrage fehlgeschlagen 如何解决PHP-Warnung: file_get_contents(): Fehler beim Öffnen des Streams: HTTP-Anfrage fehlgeschlagen Aug 18, 2023 pm 11:34 PM

So lösen Sie PHPWarning:file_get_contents():failedtoopenstream:HTTPrequestfailed Während der PHP-Entwicklung stoßen wir häufig auf Situationen, in denen HTTP-Anfragen an Remote-Server über die Funktion file_get_contents initiiert werden. Manchmal stoßen wir jedoch auf eine häufige Fehlermeldung: PHPWarning: file_get_c

Detaillierte Erläuterung der PHP-Datei-Caching-Funktionen: Datei-Caching-Verarbeitungsmethoden von file_get_contents, file_put_contents, unlink und anderen Funktionen Detaillierte Erläuterung der PHP-Datei-Caching-Funktionen: Datei-Caching-Verarbeitungsmethoden von file_get_contents, file_put_contents, unlink und anderen Funktionen Nov 18, 2023 am 09:37 AM

Ausführliche Erläuterung der PHP-Datei-Caching-Funktionen: Datei-Caching-Verarbeitungsmethoden von file_get_contents, file_put_contents, unlink und andere Funktionen, die spezifische Codebeispiele erfordern. In der Webentwicklung müssen wir häufig Daten aus Dateien lesen oder Daten in Dateien schreiben. Darüber hinaus müssen wir in einigen Fällen den Inhalt von Dateien zwischenspeichern, um häufige Lese- und Schreibvorgänge für Dateien zu vermeiden und so die Leistung zu verbessern. In PHP gibt es mehrere häufig verwendete Funktionen, die uns bei der Implementierung des Datei-Cachings helfen können, darunter

So konfigurieren Sie die dynamische Komprimierung und statische Komprimierung von nginx gzip So konfigurieren Sie die dynamische Komprimierung und statische Komprimierung von nginx gzip May 12, 2023 am 08:25 AM

Dynamische Komprimierung bedeutet eigentlich, dass der Nginx-Server die kompilierte Erstellung komprimiert. Sie müssen die folgende Konfiguration in den http- und https-Modulen von nginx.conf aktivieren: #Gizo-Komprimierung aktivieren gzip_min_length1k; Datei ist größer als 1 KB Komprimierung gzip_comp_level6;#Je größer die Komprimierungsstufe ist, desto kleiner ist die Komprimierung, aber der Leistungsverbrauch hängt von der tatsächlichen Situation ab. gzip_proxiedany;#Aktiviert, wenn Nginx als Reverse-Proxy verwendet wird. Weitere Informationen finden Sie im offiziellen Dokumentation: http://nginx.org/en/docs /http/ngx_http_gzip

So richten Sie die Gzip-Komprimierung für die Nginx-Leistungsoptimierung ein So richten Sie die Gzip-Komprimierung für die Nginx-Leistungsoptimierung ein May 29, 2023 pm 05:40 PM

Nginx aktiviert die Gzip-Komprimierungsfunktion, die die CSS-, JS-, XML- und HTML-Dateien der Website während der Übertragung komprimieren, die Zugriffsgeschwindigkeit verbessern und dann die Leistung von Nginx-Bildern, Videos und anderen Multimediadateien und großen Dateien optimieren kann Aufgrund der Komprimierung ist der Effekt nicht gut, daher besteht keine Notwendigkeit, die Komprimierung für Bilder zu unterstützen. Wenn Sie eine Optimierung wünschen, können Sie den Lebenszyklus des Bildes länger einstellen und den Client zwischenspeichern lassen Es. Nach dem Einschalten der Gzip-Funktion komprimiert der Nginx-Server den gesendeten Inhalt wie CSS, JS, XML, HTML und andere statische Ressourcen gemäß der konfigurierten Richtlinie, sodass die Größe des Inhalts reduziert wird und der Benutzer ihn verarbeiten kann vor Erhalt der zurückgegebenen Inhalte werden dem Kunden die komprimierten Daten angezeigt. Also

PHPs file_get_contents()-Funktion: So lesen Sie Inhalte aus einer Datei PHPs file_get_contents()-Funktion: So lesen Sie Inhalte aus einer Datei Nov 04, 2023 pm 01:43 PM

PHPs file_get_contents()-Funktion: So lesen Sie Inhalte aus einer Datei, spezifisches Codebeispiel. In PHP ist file_get_contents() eine sehr nützliche Funktion, die es uns ermöglicht, Inhalte aus einer Datei zu lesen. Unabhängig davon, ob Sie eine Textdatei lesen oder Inhalte von einer Remote-URL lesen, kann diese Funktion die Aufgabe problemlos erledigen. Syntax Die grundlegende Syntax dieser Funktion lautet wie folgt: stringfile_get_contents(string$f

Einführung in die PHP-Funktion – file_get_contents(): Liest den Inhalt der URL in einen String Einführung in die PHP-Funktion – file_get_contents(): Liest den Inhalt der URL in einen String Jul 24, 2023 pm 02:32 PM

Einführung in die PHP-Funktion – file_get_contents(): Lesen Sie den Inhalt der URL in einen String. Bei der Webentwicklung ist es häufig erforderlich, Daten von einem Remote-Server abzurufen oder eine Remote-Datei zu lesen. PHP bietet eine sehr leistungsstarke Funktion file_get_contents(), die bequem den Inhalt einer URL lesen und in einem String speichern kann. In diesem Artikel wird die Verwendung der Funktion file_get_contents() vorgestellt und einige Codebeispiele gegeben, um den Lesern eine bessere Hilfe zu bieten

Nginx grundlegende Einführung in die gzip-Konfigurationsmethode Nginx grundlegende Einführung in die gzip-Konfigurationsmethode Jun 03, 2023 am 09:52 AM

Vorwort gzip (gnu-zip) ist eine Komprimierungstechnologie. Nach der GZIP-Komprimierung kann die Seitengröße auf 30 % oder sogar kleiner als die Originalgröße reduziert werden. Auf diese Weise können Benutzer die Seite viel schneller durchsuchen. Die mit gzip komprimierte Seite muss sowohl vom Browser als auch vom Server unterstützt werden. Es handelt sich tatsächlich um eine serverseitige Komprimierung. Nach der Übertragung an den Browser wird sie vom Browser dekomprimiert und analysiert. Um den Browser müssen wir uns keine Sorgen machen, da die meisten aktuellen Browser das Parsen von GZIP-Seiten unterstützen. Unabhängig davon, ob es sich um ein Front-End oder ein Back-End handelt, wird Nginx häufig bei der Bereitstellung von Projekten verwendet, und kleine Projekte verwenden häufig einen Reverse-Proxy oder ähnliches. Heute werde ich einfach und direkt über einen der Punkte sprechen – gzip. Wenn es Fehler gibt, korrigieren Sie mich bitte. Im Allgemeinen wird auf der Serverseite u. a. verwendet

See all articles