下午看上到一个博客,全是图片,真的好喜欢,但不能右键,而且手动下载也好麻烦,于是就想用curl把图片爬下来。
思路很简单,先把每页的img地址抓出来,然后通过访问这个地址获取图片。最初我使用的方法:
第一次就成功了,很开心,于是就开始爬了,但是速度极其的慢,有时候几分钟才能存到一张图,非常恼火,等到半个小时的时候,才抓了几十张,找这个速度下去三四个小时也抓不完啊。于是我又想了个办法,用php的cli模式,但是试了好几次,都会莫名其妙的报错,于是作罢,只能想起他办法了。感觉用curl多线程麻烦,于是后面我把这个代码复制到三个文件,分三部分抓取,然后浏览器同时打开,哇,速度快多了。于是开心的抓了,到后面发现,这速度还是不能忍受啊,有时候一分钟抓好几张,有时候却几分钟一张都抓不了。
最后竟然一共花了一个多小时,800张图片,400MB。
于是我在想应该是抓取图片的时候超时了。于是我就这样改了
于是我在上面代码分别加了三次代码,分别是
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch,CURLOPT_TIMEOUT,3);
curl_setopt($ch,CURLOPT_DNS_CACHE_TIMEOUT,3600);
第一次测试的时候发现,哇确实快多了,但是后面发现完全不是这样的,只是网络不稳定而已。
到底是什么原因呢,我又回头看自己的代码,想了半天,妈的,我咋这么傻逼呢
第一次使用curl的时候只是抓取当前页面,而真正花时间的确实后面存图片的时候,而我获取图片到本地却是用的file_get_contents(),所以超时什么的完全没做处理。
于是改了下密码:
然后我试了下,看到速度快极了,800张图片就用了十分钟左右。
唉,由于脑残,浪费了我好多时间
思路很简单,先把每页的img地址抓出来,然后通过访问这个地址获取图片。最初我使用的方法:
set_time_limit(0);
$baseUrl="http://***.com/?page=";
$page=9;
$ch=curl_init();
do{
curl_setopt($ch,CURLOPT_URL,$baseUrl.$page);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec($ch);
header('content-type:text/plain');
// var_dump($result);
$page+=1;
preg_match_all("/ foreach($matches[1] as $k=>$v){
file_put_contents(‘./image/’.basename($v),file_get_contents($v));
}
}while(!empty($result);
?>
第一次就成功了,很开心,于是就开始爬了,但是速度极其的慢,有时候几分钟才能存到一张图,非常恼火,等到半个小时的时候,才抓了几十张,找这个速度下去三四个小时也抓不完啊。于是我又想了个办法,用php的cli模式,但是试了好几次,都会莫名其妙的报错,于是作罢,只能想起他办法了。感觉用curl多线程麻烦,于是后面我把这个代码复制到三个文件,分三部分抓取,然后浏览器同时打开,哇,速度快多了。于是开心的抓了,到后面发现,这速度还是不能忍受啊,有时候一分钟抓好几张,有时候却几分钟一张都抓不了。
最后竟然一共花了一个多小时,800张图片,400MB。
于是我在想应该是抓取图片的时候超时了。于是我就这样改了
于是我在上面代码分别加了三次代码,分别是
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch,CURLOPT_TIMEOUT,3);
curl_setopt($ch,CURLOPT_DNS_CACHE_TIMEOUT,3600);
第一次测试的时候发现,哇确实快多了,但是后面发现完全不是这样的,只是网络不稳定而已。
到底是什么原因呢,我又回头看自己的代码,想了半天,妈的,我咋这么傻逼呢
第一次使用curl的时候只是抓取当前页面,而真正花时间的确实后面存图片的时候,而我获取图片到本地却是用的file_get_contents(),所以超时什么的完全没做处理。
于是改了下密码:
set_time_limit(0);
$time=microtime(true);
$baseUrl="http://***.com/?page=";
$page=1;
do{
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$baseUrl.$page);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec($ch);
curl_close($ch);
$page+=1;
// var_dump($result);
preg_match_all("/ $ch=curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch,CURLOPT_TIMEOUT,3);
curl_setopt($ch,CURLOPT_DNS_CACHE_TIMEOUT,3600);
foreach($matches[1] as $k=>$v){
curl_setopt($ch,CURLOPT_URL,$v);
$picture=curl_exec($ch);
file_put_contents(‘./image1/’.basename($v),$picture);
}
}while(!empty($result));
echo microtime(true)-$time;
?>
然后我试了下,看到速度快极了,800张图片就用了十分钟左右。
唉,由于脑残,浪费了我好多时间