Maison développement back-end tutoriel 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
Copier après la connexion

下面介绍一些解决方案:

1. 使用自带的zlib库

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

$data = file_get_contents("compress.zlib://".$url); 
Copier après la connexion

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;
}
Copier après la connexion

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; 
}
Copier après la connexion

使用:

$html=file_get_contents('http://www.bkjia.com/librarys/veda/');
$html=gzdecode($html);
Copier après la connexion

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752354.htmlTechArticle有时候用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了Gzip。 编码问题好...
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment résoudre PHP Avertissement : file_get_contents() : le nom du fichier ne peut pas être vide Comment résoudre PHP Avertissement : file_get_contents() : le nom du fichier ne peut pas être vide Aug 18, 2023 pm 07:30 PM

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

Avertissement PHP : file_get_contents() : échec de l'ouverture du flux : échec de la requête HTTP Avertissement PHP : file_get_contents() : échec de l'ouverture du flux : échec de la requête HTTP Aug 18, 2023 pm 11:34 PM

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 autres fonctions 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 autres fonctions Nov 18, 2023 am 09:37 AM

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

Comment configurer la compression dynamique et la compression statique nginx gzip Comment configurer la compression dynamique et la compression statique nginx gzip May 12, 2023 am 08:25 AM

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

Comment configurer la compression Gzip pour l'optimisation des performances Nginx Comment configurer la compression Gzip pour l'optimisation des performances Nginx May 29, 2023 pm 05:40 PM

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 Fonction file_get_contents() de PHP : Comment lire le contenu d'un fichier Nov 04, 2023 pm 01:43 PM

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() : lit le contenu de l'URL dans une chaîne Introduction à la fonction PHP — file_get_contents() : lit le contenu de l'URL dans une chaîne Jul 24, 2023 pm 02:32 PM

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.

Introduction de base de Nginx à la méthode de configuration gzip Introduction de base de Nginx à la méthode de configuration gzip Jun 03, 2023 am 09:52 AM

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

See all articles