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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment résoudre PHPWarning : file_get_contents() : Filenamecannotbeempty Dans le processus de développement PHP, nous rencontrons souvent ce message d'erreur : PHPWarning : file_get_contents() : Filenamecannotbeempty. Cette erreur se produit généralement lors de l'utilisation de la fonction file_get_contents

Comment résoudre PHPWarning:file_get_contents():failedtoopenstream:HTTPrequestfailed Lors du développement PHP, nous rencontrons souvent des situations où des requêtes HTTP sont initiées vers des serveurs distants via la fonction file_get_contents. Cependant, nous rencontrons parfois un message d'erreur courant : PHPWarning : file_get_c

Explication détaillée des fonctions de mise en cache de fichiers PHP : méthodes de traitement de mise en cache de fichiers de file_get_contents, file_put_contents, unlink et d'autres fonctions, qui nécessitent des exemples de code spécifiques. Dans le développement Web, nous avons souvent besoin de lire des données à partir de fichiers ou d'écrire des données dans des fichiers. De plus, dans certains cas, nous devons mettre en cache le contenu des fichiers pour éviter les opérations fréquentes de lecture et d'écriture de fichiers, améliorant ainsi les performances. En PHP, il existe plusieurs fonctions couramment utilisées qui peuvent nous aider à implémenter la mise en cache des fichiers, notamment

Compression dynamique La compression dynamique signifie en fait que le serveur nginx compresse la création compilée. Vous devez activer la configuration suivante dans les modules http et https de nginx.conf : gzipon; #Enable gizo compression gzip_min_length1k; le fichier est supérieur à 1 Ko Compression gzip_comp_level6;#Plus le numéro de niveau de compression est grand, plus la compression est petite, mais plus la consommation de performances dépend de la situation réelle gzip_proxiedany;#Activé lorsque nginx est utilisé comme proxy inverse Pour plus de détails, consultez le site officiel. documentation : http://nginx.org/en/docs /http/ngx_http_gzip

Nginx active la fonction de compression Gzip, qui peut compresser les fichiers css, js, xml et html du site Web pendant la transmission, améliorer la vitesse d'accès, puis optimiser les performances des images, vidéos et autres fichiers multimédias et fichiers volumineux ! sur le site Web sont compressés en raison de la compression. L'effet n'est pas bon, il n'est donc pas nécessaire de prendre en charge la compression des images. Si vous souhaitez optimiser, vous pouvez définir le cycle de vie de l'image pour qu'il soit plus long et laisser le cache client. il. Après avoir activé la fonction Gzip, le serveur Nginx compressera le contenu envoyé, tel que css, js, xml, html et autres ressources statiques selon la politique configurée, afin que la taille du contenu soit réduite et que l'utilisateur traite avant de recevoir le contenu renvoyé. Les données compressées sont affichées au client. donc

Fonction file_get_contents() de PHP : Comment lire le contenu d'un fichier, exemple de code spécifique En PHP, file_get_contents() est une fonction très utile qui nous permet de lire le contenu d'un fichier. Qu'il s'agisse de lire un fichier texte ou de lire du contenu à partir d'une URL distante, cette fonction peut facilement accomplir la tâche. Syntaxe La syntaxe de base de cette fonction est la suivante : stringfile_get_contents(string$f

Introduction à la fonction PHP — file_get_contents() : Lire le contenu de l'URL dans une chaîne. Dans le développement Web, il est souvent nécessaire d'obtenir des données d'un serveur distant ou de lire un fichier distant. PHP fournit une fonction très puissante file_get_contents(), qui peut facilement lire le contenu d'une URL et l'enregistrer dans une chaîne. Cet article présentera l'utilisation de la fonction file_get_contents() et donnera quelques exemples de code pour mieux aider les lecteurs.

Préface gzip (gnu-zip) est une technologie de compression. Après la compression gzip, la taille de la page peut être réduite à 30 % ou même plus petite que la taille d'origine. De cette façon, les utilisateurs parcourront la page beaucoup plus rapidement. La page compressée gzip doit être prise en charge à la fois par le navigateur et par le serveur. Il s'agit en fait d'une compression côté serveur. Après avoir été transmise au navigateur, le navigateur la décompresse et l'analyse. Nous n'avons pas à nous soucier du navigateur, car la plupart des navigateurs actuels prennent en charge l'analyse des pages gzip. Qu'il s'agisse du front-end ou du back-end, nginx est souvent utilisé lors du déploiement de projets, et les petits projets utilisent souvent un proxy inverse ou autre. Aujourd'hui, je vais être simple et direct et parler de l'un des points : gzip. S'il y a des erreurs, veuillez me corriger. Généralement utilisé côté serveur, c'est u
