欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

图片抓取失败问题

程序员文章站 2022-04-23 14:57:38
...
抓取 图片 最近要抓取智库百科中的词条,但是词条中的图片抓取出现了问题,这是其中一个图片链接。
http://wiki.mbalib.com/w/images/2/22/%E6%B3%9B%E6%88%90%E6%9C%AC%E7%9A%84%E7%89%B9%E5%BE%81.jpg

无论是用file_get_contents,还是ob_start后readfile,还是用curl,还是snoopy,抓取下来的图片都是损坏的,抓下来的数据比原图小,但我看了一下这个站的图片貌似并没有设置防盗链或cookie验证之类的,求解决方法

回复讨论(解决方案)

他传送的图片数据是 gzip 压缩的,需要使用 gzdecode 函数解码(php5>=5.4.0 已添加进 gzip 扩展了

$url = 'http://wiki.mbalib.com/w/images/2/22/%E6%B3%9B%E6%88%90%E6%9C%AC%E7%9A%84%E7%89%B9%E5%BE%81.jpg';$s = file_get_contents($url);echo gzdecode($s);
如果你的 php 版本还没有那么高,可以自己写代码。网上也可以搜索到。
给一个老外的
function gzdecode($data) {   $len = strlen($data);   if ($len  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; }

他传送的图片数据是 gzip 压缩的,需要使用 gzdecode 函数解码(php5>=5.4.0 已添加进 gzip 扩展了

$url = 'http://wiki.mbalib.com/w/images/2/22/%E6%B3%9B%E6%88%90%E6%9C%AC%E7%9A%84%E7%89%B9%E5%BE%81.jpg';$s = file_get_contents($url);echo gzdecode($s);
如果你的 php 版本还没有那么高,可以自己写代码。网上也可以搜索到。
给一个老外的
function gzdecode($data) {   $len = strlen($data);   if ($len  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; }


非常感谢,长知识了