当前位置: 首页 > 后端技术 > PHP

PHP实现远程抓取网站图片并保存在文件中

时间:2023-03-29 13:50:51 PHP

虽然这个功能类是PHP原生的,但值得您学习。递归抓取首页及子页面/***递归下载首页及其子页面抓图方法(递归递归)**@paramString$capture_url抓图地址**/publicfunctionrecursive_download_images($capture_url){if(!in_array($capture_url,self::$a_url_arr))//未捕获{self::$a_url_arr[]=$capture_url;//包含在静态数组中}else//捕获,直接Exitfunction{return;}$this->download_current_page_images($capture_url);//下载当前页面的所有图片//用@屏蔽抓取地址不可读导致的警告错误$content=@file_get_contents($capture_url);//匹配?之前的常规模式在a标签的href属性中$a_pattern="|]+href=['\"]?([^'\"?]+)['\">]|U";preg_match_all($a_pattern,$content,$a_out,PREG_SET_ORDER);$tmp_arr=array();//定义一个数组,用于存放当前循环拍摄的图像的超链接地址foreach($a_outas$k=>$v){/***去除超链接中的空''、'#'、'/'和重复值*1:超链接地址的值不能等于当前抓取页面的url,否则会陷入死循环*2:超链接是''或'#','/'也是本页,所以也会陷入死循环,*3:有时候一个超链接地址会在一个网页中出现多次,如果它没有被删除,一个子页面将被重复下载)*/if($v[1]&&!in_array($v[1],self::$a_url_arr)&&!in_array($v[1],array('#','/',$capture_url))){$tmp_arr[]=$v[1];}}foreach($tmp_arras$k=>$v){//超链接路径地址if(strpos($v,'http://')!==false)//如果url包含http://,你可以直接访问{$a_url=$v;}else//否则证明是相对地址,需要重新组装超链接的访问地址{$domain_url=substr($capture_url,0,strpos($capture_url,'/',8)+1);$a_url=$domain_url.$v;}$this->recursive_download_images($a_url);}}下载当前所有页面/***下载当前网页下的所有图片**@paramString$capture_url抓取图片的URL*@returnArray当前网页所有图片的img标签url地址数组*/publicfunctiondownload_current_page_images($capture_url){$content=@file_get_contents($capture_url);//屏蔽warningError//匹配?之前部分的规律性在img标签src属性中$img_pattern="|]+src=['\"]?([^'\"?]+)['\">]|U";preg_match_all($img_pattern,$内容,$img_out,PREG_SET_ORDER);$photo_num=count($img_出去);//匹配图片数量echo'

'.$capture_url.“总发现”。$photo_num。"图片

";foreach($img_outas$k=>$v){$this->save_one_img($capture_url,$v[1]);}}}SaveImage/***保存单张图片的方法**@paramString$capture_url用于抓取图片的网页的URL*@paramString$img_url要保存的图片的url**/publicfunctionsave_one_img($capture_url,$img_url){//图片路径地址if(strpos($img_url,'http://')!==false){//$img_url=$img_url;}else{$domain_url=substr($capture_url,0,strpos($capture_url,'/',8)+1);$img_url=$domain_url.$img_url;}$pathinfo=pathinfo($img_url);//获取图片路径信息$pic_name=$pathinfo['basename'];//获取图片的名称if(file_exists($this->save_path.$pic_name))//如果图片存在,证明已经抓取,Exitfunction{echo$img_url.'这张照片已被抓拍!
';返回;}//读取图片内容输入字符串$img_data=@file_get_contents($img_url);//屏蔽图片地址不可读导致的警告错误if(strlen($img_data)>$this->img_size)//下载大小大于限制的图片{$img_size=file_put_contents($this->save_path.$pic_name,$img_data);如果($img_size){回显$img_url。'图片保存成功!
';}else{echo$img_url.'图片保存失败!
';}}else{echo$img_url.'图片读取失败!
';}}}//END看一个完整的功能类,直接保存,引用即可//抓图保存地址//抓图大小限制(单位:byte)只抓取大于此限制的图片public$img_size=0;//定义一个静态Array,用于记录已经抓取到的超链接地址,避免重复抓取publicstatic$a_url_arr=array();/***@paramString$save_path拍摄图片保存地址*@paramInt$img_sizecapture获取图片保存地址*/publicfunction__construct($save_path,$img_size){$this->save_path=$save_path;$这个->img_size=$img_size;}/***递归下载首页及其子页面抓图方法(递归递归)**@paramString$capture_url抓图地址**/publicfunctionrecursive_download_images($capture_url){if(!in_array($capture_url,self::$a_url_arr))//未捕获{self::$a_url_arr[]=$capture_url;//包含在静态数组中}else//捕获,直接退出函数{return;}$this->download_current_page_images($capture_url);//下载当前页面的所有图片//用@屏蔽抓取地址不可读导致的警告错误$content=@file_get_contents($capture_url);//匹配?之前的正则部分在a标签的href属性中$a_pattern="|]+href=['\"]?([^'\"?]+)['\">]|U";preg_match_all($a_pattern,$content,$a_out,PREG_SET_ORDER);$tmp_arr=array();//定义一个数组,用于存放当前循环拍摄的图像的超链接地址foreach($a_outas$k=>$v){/***去掉超链接中的空''、'#'、'/'和重复值*1:超链接地址的值不能等于当前抓取页面的url,否则会卡死陷入死循环*2:超链接是''或'#','/'也是本页,所以也会陷入死循环,*3:有时候一个超链接地址会在一个网页中出现多次页面,如果不移除,将重复下载一个子页面)*/if($v[1]&&!in_array($v[1],self::$a_url_arr)&&!in_array($v[1],array('#','/',$capture_url))){$tmp_arr[]=$v[1];}}foreach($tmp_arras$k=>$v){//超链接路径地址if(strpos($v,'http://')!==false)//如果url包含http://,你可以直接访问{$a_url=$v;}else//否则证明是相对地址,需要重新组装超链接的访问地址{$domain_url=substr($capture_url,0,strpos($capture_url,'/',8)+1);$a_url=$domain_url.$v;}$this->recursive_download_images($a_url);}}/***下载当前网页下的所有图片**@paramString$capture_url用于抓取图片网页地址*@returnArray当前网页下所有图片的img标签url地址数组*/公共功能download_current_page_images($capture_url){$content=@file_get_contents($capture_url);//屏蔽警告错误//匹配img标签src之前的部分的规律性?在属性$img_pattern="|]+src=['\"]?([^'\"?]+)['\">]|U";preg_match_all($img_pattern,$content,$img_out,PREG_SET_ORDER);$photo_num=count($img_out);//匹配图片数量回声'

'.$capture_url。“总发现”。$photo_num。"图片

";foreach($img_outas$k=>$v){$this->save_one_img($capture_url,$v[1]);}}}/***单张图片保存方法**@paramString$capture_url用于抓取图片的网页url*@paramString$img_url保存图片的url**/publicfunctionsave_one_img($capture_url,$img_url){//图片路径地址if(strpos($img_url,'http://')!==false){//$img_url=$img_url;}else{$domain_url=substr($capture_url,0,strpos($capture_url,'/',8)+1);$img_url=$domain_url.$img_url;}$pathinfo=pathinfo($img_url);//获取图片路径信息$pic_name=$pathinfo['basename'];//获取图片的名称if(file_exists($this->save_path.$pic_name))//如果图片存在,证明已经抓取,退出函数{echo$img_url.'图片已截取!
';返回;}//将图片内容读入字符串$img_data=@file_get_contents($img_url);//屏蔽图片地址不可读导致的warning错误if(strlen($img_data)>$this->img_size)//下载大小大于限制的图片{$img_size=file_put_contents($this->save_path.$pic_name,$img_data);如果($img_size){echo$img_url.'图片保存成功!
';}else{echo$img_url.'保存图片失败!
';}}else{echo$img_url.'读取图片失败!
';}}}//ENDset_time_limit(120);//根据情况设置脚本最长执行时间$download_img=newdownload_image('E:/images/',0);//实例化下载图片对象$download_img->recursive_download_images('http://www.oschina.net/');//递归图片抓取方法//$download_img->download_current_page_images($_POST['capture_url']);//只抓取当前页面图片方法