Rumah pembangunan bahagian belakang tutorial 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
Salin selepas log masuk

下面介绍一些解决方案:

1. 使用自带的zlib库

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

$data = file_get_contents("compress.zlib://".$url); 
Salin selepas log masuk

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;
}
Salin selepas log masuk

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; 
}
Salin selepas log masuk

使用:

$html=file_get_contents('http://www.bkjia.com/librarys/veda/');
$html=gzdecode($html);
Salin selepas log masuk

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752354.htmlTechArticle有时候用 file_get_contents() 函数抓取网页会发生乱码现象。有两个原因会导致乱码,一个是编码问题,一个是目标页面开了Gzip。 编码问题好...
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menyelesaikan Amaran PHP: file_get_contents(): Nama fail tidak boleh kosong Cara menyelesaikan Amaran PHP: file_get_contents(): Nama fail tidak boleh kosong Aug 18, 2023 pm 07:30 PM

Bagaimana untuk menyelesaikan PHPWarning: file_get_contents(): Filenamecannotbeempty Dalam proses pembangunan PHP, kita sering menghadapi mesej ralat ini: PHPWarning: file_get_contents(): Filenamecannotbeempty. Ralat ini biasanya berlaku apabila menggunakan fungsi file_get_contents

如何解决Amaran PHP: file_get_contents(): gagal membuka strim: Permintaan HTTP gagal 如何解决Amaran PHP: file_get_contents(): gagal membuka strim: Permintaan HTTP gagal Aug 18, 2023 pm 11:34 PM

Bagaimana untuk menyelesaikan PHPWarning:file_get_contents():failedtoopenstream:HTTPrequestfailed Semasa pembangunan PHP, kami sering menghadapi situasi di mana permintaan HTTP dimulakan ke pelayan jauh melalui fungsi file_get_contents. Walau bagaimanapun, kadangkala kami menghadapi mesej ralat biasa: PHPWarning: file_get_c

Penjelasan terperinci tentang fungsi caching fail PHP: kaedah pemprosesan caching fail file_get_contents, file_put_contents, nyahpaut dan fungsi lain Penjelasan terperinci tentang fungsi caching fail PHP: kaedah pemprosesan caching fail file_get_contents, file_put_contents, nyahpaut dan fungsi lain Nov 18, 2023 am 09:37 AM

Penjelasan terperinci tentang fungsi caching fail PHP: kaedah pemprosesan caching fail file_get_contents, file_put_contents, nyahpaut dan fungsi lain, yang memerlukan contoh kod khusus Dalam pembangunan web, kita sering perlu membaca data daripada fail atau menulis data ke fail. Selain itu, dalam beberapa kes, kita perlu menyimpan cache kandungan fail untuk mengelakkan operasi membaca dan menulis fail yang kerap, sekali gus meningkatkan prestasi. Dalam PHP, terdapat beberapa fungsi yang biasa digunakan yang boleh membantu kami melaksanakan caching fail, termasuk

Bagaimana untuk mengkonfigurasi nginx gzip mampatan dinamik dan mampatan statik Bagaimana untuk mengkonfigurasi nginx gzip mampatan dinamik dan mampatan statik May 12, 2023 am 08:25 AM

Mampatan dinamik Mampatan dinamik sebenarnya bermaksud pelayan nginx memampatkan ciptaan yang disusun Anda perlu mendayakan konfigurasi berikut dalam modul http dan https nginx.conf: gzipon #Enable gizo compression gzip_min_length1k, hanya jika fail lebih besar daripada 1k Compression gzip_comp_level6;#Semakin besar nombor tahap mampatan, semakin kecil pemampatan, tetapi lebih banyak penggunaan prestasi bergantung pada situasi sebenar gzip_proxiedany;#Didayakan apabila nginx digunakan sebagai proksi terbalik Untuk butiran, lihat rasmi dokumentasi: http://nginx.org/en/docs /http/ngx_http_gzip

Bagaimana untuk menyediakan pemampatan Gzip untuk pengoptimuman prestasi Nginx Bagaimana untuk menyediakan pemampatan Gzip untuk pengoptimuman prestasi Nginx May 29, 2023 pm 05:40 PM

Nginx menghidupkan fungsi pemampatan Gzip, yang boleh memampatkan fail css, js, xml dan html tapak web semasa penghantaran, meningkatkan kelajuan akses, dan kemudian mengoptimumkan prestasi Imej, video dan fail multimedia lain dan fail besar di laman web Web dimampatkan kerana pemampatan Kesannya tidak baik, jadi tidak perlu menyokong pemampatan untuk imej Jika anda ingin mengoptimumkan, anda boleh menetapkan kitaran hayat imej menjadi lebih lama dan biarkan klien cache ia. Selepas menghidupkan fungsi Gzip, pelayan Nginx akan memampatkan kandungan yang dihantar, seperti css, js, xml, html dan sumber statik lain mengikut dasar yang dikonfigurasikan, supaya saiz kandungan dikurangkan, dan pengguna akan memproses ia sebelum menerima kandungan yang dikembalikan Data yang dimampatkan dipaparkan kepada pelanggan. jadi

Pengenalan fungsi PHP—file_get_contents(): Baca kandungan URL ke dalam rentetan Pengenalan fungsi PHP—file_get_contents(): Baca kandungan URL ke dalam rentetan Jul 24, 2023 pm 02:32 PM

Pengenalan fungsi PHP—file_get_contents(): Baca kandungan URL ke dalam rentetan Dalam pembangunan web, selalunya perlu untuk mendapatkan data daripada pelayan jauh atau membaca fail jauh. PHP menyediakan fungsi yang sangat berkuasa file_get_contents(), yang boleh membaca kandungan URL dan menyimpannya pada rentetan dengan mudah. Artikel ini akan memperkenalkan penggunaan fungsi file_get_contents() dan memberikan beberapa contoh kod untuk membantu pembaca dengan lebih baik

Fungsi file_get_contents() PHP: Cara membaca kandungan daripada fail Fungsi file_get_contents() PHP: Cara membaca kandungan daripada fail Nov 04, 2023 pm 01:43 PM

Fungsi file_get_contents() PHP: Cara membaca kandungan daripada fail, contoh kod khusus Dalam PHP, file_get_contents() ialah fungsi yang sangat berguna yang membolehkan kita membaca kandungan daripada fail. Sama ada membaca fail teks atau membaca kandungan dari URL jauh, fungsi ini boleh menyelesaikan tugas dengan mudah. Sintaks Sintaks asas fungsi ini adalah seperti berikut: stringfile_get_contents(string$f

Pengenalan asas Nginx kepada kaedah konfigurasi gzip Pengenalan asas Nginx kepada kaedah konfigurasi gzip Jun 03, 2023 am 09:52 AM

Prakata gzip (gnu-zip) ialah teknologi pemampatan. Selepas pemampatan gzip, saiz halaman boleh dikurangkan kepada 30% atau lebih kecil daripada saiz asal Dengan cara ini, pengguna akan menyemak imbas halaman dengan lebih pantas. Halaman yang dimampatkan gzip perlu disokong oleh kedua-dua penyemak imbas dan pelayan Ia sebenarnya pemampatan sebelah pelayan Selepas dihantar ke penyemak imbas, penyemak imbas menyahmampat dan menghuraikannya. Kami tidak perlu risau tentang penyemak imbas, kerana kebanyakan penyemak imbas semasa menyokong menghurai halaman gzip. Sama ada ia adalah bahagian hadapan atau bahagian belakang, nginx sering digunakan semasa melaksanakan projek, dan projek kecil sering menggunakan proksi terbalik atau sesuatu. Hari ini saya akan ringkas dan langsung dan bercakap tentang salah satu perkara - gzip. Jika terdapat sebarang kesilapan, sila betulkan saya. Biasanya digunakan pada bahagian pelayan ialah u

See all articles