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

编程入门 行业动态 更新时间:2024-10-08 02:20:42

PHP远程抓取网站图片<a href=https://www.elefans.com/category/jswz/34/1764793.html style=并保存在本地文件中"/>

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

<?php/*** 抓取图片* Class download_image* Time: 2019/1/31 13:49* Author 江南极客*/
class download_image
{public $save_path;         //抓取图片的保存地址//抓取图片的大小限制(单位:字节) 只抓比size比这个限制大的图片public $img_size=0;//定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取public static $a_url_arr=array();//是否是来自微信public $is_from_wx = false;/*** @param String $save_path  抓取图片的保存地址* @param Int  $img_size   抓取图片的保存地址*/public function __construct($save_path,$img_size){$this->save_path=$save_path;$this->img_size=$img_size;}/*** 递归下载抓取首页及其子页面图片的方法 ( recursive 递归)** @param  String $capture_url 用于抓取图片的网址**/public function recursive_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); //下载当前页面的所有图片//用@屏蔽掉因为抓取地址无法读取导致的warning错误$content=@file_get_contents($capture_url);//匹配a标签href属性中?之前部分的正则$a_pattern = "|<a[^>]+href=['\" ]?([^ '\"?]+)['\" >]|U";preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER);$tmp_arr=array(); //定义一个数组,用于存放当前循环下抓取图片的超链接地址foreach ($a_out as $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_arr as $k => $v){//超链接路径地址if ( strpos($v, 'http://')!==false || strpos($v, 'https://')!==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);}}/*** 下载当前网页下的所有图片** @param  String $capture_url 用于抓取图片的网页地址* @return Array  当前网页上所有图片img标签url地址的一个数组*/public function download_current_page_images($capture_url){if(strpos($capture_url, 'mp.weixin.qq')){$this->is_from_wx = true;}$content=@file_get_contents($capture_url);  //屏蔽warning错误//匹配img标签src属性中?之前部分的正则$img_pattern = "|<img[^>]+src=['\" ]?([^ '\"?]+)['\" >]|U";if($this->is_from_wx){//抓取微信公众号图片(公众号图片地址 在 data-src属性中)$img_pattern = "/<[img|IMG].*?data-src=[\'|\"](.*?)[\'|\"].*?[\/]?>/";}preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER);$photo_num = count($img_out);//匹配到的图片数量echo '<h1>'.$capture_url . "共找到 " . $photo_num . " 张图片</h1>";foreach ($img_out as $k => $v){$this->save_one_img($capture_url,$v[1]);}}/*** 保存单个图片的方法** @param String $capture_url  用于抓取图片的网页地址* @param String $img_url    需要保存的图片的url**/public function save_one_img($capture_url,$img_url){//图片路径地址if ( strpos($img_url, 'http://')!==false || strpos($img_url, 'https://')!==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($this->is_from_wx){//=png//图片后缀$file_ext = strrchr($pic_name,'=');$img_ext = ltrim($file_ext,'=');//图片名字$dir_name = $pathinfo['dirname'];$img_name = substr(strrchr($dir_name, "/"), 1);$pic_name = $img_name.'.'.$img_ext;}if (file_exists($this->save_path.$pic_name)) //如果图片存在,证明已经被抓取过,退出函数{echo $img_url . '<span style="color:red;margin-left:80px">该图片已经抓取过!</span><br/>';return;}//将图片内容读入一个字符串$img_data = @file_get_contents($img_url);  //屏蔽掉因为图片地址无法读取导致的warning错误if ( strlen($img_data) > $this->img_size )  //下载size比限制大的图片{$img_size = file_put_contents($this->save_path . $pic_name, $img_data);if ($img_size){echo $img_url . '<span style="color:green;margin-left:80px">图片保存成功!</span><br/>';} else{echo $img_url . '<span style="color:red;margin-left:80px">图片保存失败!</span><br/>';}} else{echo $img_url . '<span style="color:red;margin-left:80px">图片读取失败!</span><br/>';}}
} // ENDset_time_limit(120);   //设置脚本的最大执行时间 根据情况设置$save_path = __DIR__.'/downimg/';       //图片本地保存路径
$capture_url = '/';    //要抓取的网址
$capture_url = ''; //公众号文章
$download_img = new download_image($save_path,0);  //实例化下载图片对象
//$download_img->recursive_download_images($capture_url);   //递归抓取图片方法
$download_img->download_current_page_images($capture_url);   //只抓取当前页面图片方法

特殊处理过的网站,需要特殊处理并抓取,比如微信公众号文章.

更多推荐

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

本文发布于:2024-02-27 23:13:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767005.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:并保存   本地文件   图片   网站   PHP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!