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引起的抓取乱码问题了。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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

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

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

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

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, 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(): 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

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
