一次curl乱弹

来源:互联网 发布:刺客信条2mac中文版 编辑:程序博客网 时间:2024/05/19 01:14
下午看上到一个博客,全是图片,真的好喜欢,但不能右键,而且手动下载也好麻烦,于是就想用curl把图片爬下来。
思路很简单,先把每页的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张图片就用了十分钟左右。
唉,由于脑残,浪费了我好多时间
0 0