图片抓取失败问题
最近要抓取智库百科中的词条,但是词条中的图片抓取出现了问题,这是其中一个图片链接。
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 ------解决方案--------------------
strcmp(substr($data,0,2),\x1f\x8b)) {
return $data; // 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 data;
}
// 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 return false; // invalid format
}
$extralen = unpack(v,substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen 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 return false; // invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false
------解决方案--------------------
$len - $headerlen - $filenamelen - 1 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 return false; // invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false
------解决方案--------------------
$len - $headerlen - $commentlen - 1 return false; // invalid header format