介绍
今天就跟大家聊聊有关使用PHP怎么实现远程抓取网站图片并保存功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
具体如下:
& lt; PHP ?/* * ,*一个用于抓取图片的类 ,* ,* @package 违约 ,* @author WuJunwei ,*/class download_image { public 才能;save_path美元;,,,,,,,,,//抓取图片的保存地址//抓才能取图片的大小限制(单位:字节),只抓比大小比这个限制大的图片 public 才能;img_size美元=0;//才能定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取 public 才能;static 数组$ a_url_arr=(); ,/* * ,,*,@param String save_path 美元;,抓取图片的保存地址 ,,*,@param Int , img_size 美元;,,抓取图片的保存地址 ,,*/public 才能;function  __construct (save_path, img_size美元) {才能 ,,,这个→美元save_path=$ save_path; ,,,这个→美元img_size=$ img_size; ,,} ,/* * ,,*,递归下载抓取首页及其子页面图片的方法,(,recursive 递归) ,,* ,,*,@param , String capture_url 美元;用于抓取图片的网址 ,,* ,,*/public 才能;function  recursive_download_images (capture_url美元) {才能 ,,,if (! in_array (capture_url美元,自我:a_url_arr美元)),,//没抓取过 ,,,{ ,,,,,self:: $ a_url_arr []=$ capture_url;,,//计入静态数组 ,,,},else ,//抓取过,直接退出函数 ,,,{ ,,,,,返回; ,,,} ,,,这个→美元download_current_page_images ($ capture_url);,//下载当前页面的所有图片 ,,,//用@屏蔽掉因为抓取地址无法读取导致的警告错误 ,,,内容=@file_get_contents美元($ capture_url); ,,,//匹配一个标签href属性中?之前部分的正则 ,,,a_pattern 美元;=,“| & lt;[^祝辞]+ href=https://www.yisu.com/zixun/(“/? ?([^ \”?]+)[' \ ">]| U”; preg_match_all (a_pattern,内容,美元a_out美元,PREG_SET_ORDER); 数组$ tmp_arr=();//定义一个数组,用于存放当前循环下抓取图片的超链接地址 foreach (a_out k美元=> v)美元 {/* * *去除超链接中的空”、“#”、“/焙椭馗粗? * 1:超链接地址的值不能等于当前抓取页面的url,否则会陷入死循环 * 2:超链接为”或“#”,“/币彩潜疽趁?这样也会陷入死循环, * 3:有时一个超连接地址在一个网页中会重复出现多次,如果不去除,会对一个子页面进行重复下载) */如果(v美元[1]& & ! in_array (v[1],美元自我:a_url_arr美元)& & ! in_array (v[1],美元数组(‘#’,‘/?capture_url美元))) { 美元tmp_arr []=$ v [1]; } } foreach (tmp_arr k美元=> v)美元 {//超链接路径地址 如果(大小写敏感(v美元,“http://? !url==false)//如果包含http://,可以直接访问 { a_url=v美元; }//否其他则证明是相对地址,需要重新拼凑超链接的访问地址 { 美元$ domain_url=substr (capture_url 0大小写敏感(capture_url美元,'/',8)+ 1); a_url=domain_url美元。v美元; } $ this -> recursive_download_images ($ a_url); } }/* * *下载当前网页下的所有图片 * * @param字符串$ capture_url用于抓取图片的网页地址 * @return数组当前网页上所有图片img标签url地址的一个数组 */公共函数download_current_page_images (capture_url美元) { (内容=@file_get_contents美元capture_url);//屏蔽警告错误//匹配img标签src属性中?之前部分的正则 $ img_pattern=" | ] + [\”) ?([^ \”?]+)[' \ ">]| U”; preg_match_all (img_pattern,内容,美元img_out美元,PREG_SET_ORDER); $ photo_num=count ($ img_out);//匹配到的图片数量 回声“”。capture_url美元。“共找到。”photo_num美元。“张图片
”; foreach (img_out k美元=> v)美元 { $ this -> save_one_img (capture_url, v美元[1]); } }/* * *保存单个图片的方法 * * @param字符串$ capture_url用于抓取图片的网页地址 * @param字符串$ img_url需要保存的图片的url * */公共函数save_one_img (capture_url, img_url美元) {//图片路径地址 如果(大小写敏感(img_url美元,“http://? !==false) {//img_url=img_url美元; 其他} { 美元$ domain_url=substr (capture_url 0大小写敏感(capture_url美元,'/',8)+ 1); img_url=domain_url美元。img_url美元; } (pathinfo=pathinfo美元img_url);//获取图片路径信息 pic_name=pathinfo美元(“:”);//获取图片的名字 如果(file_exists ($ this -> save_path。pic_name美元))//如果图片存在,证明已经被抓取过,退出函数 { 回声img_url美元。'使用PHP怎么实现远程抓取网站图片并保存功能