PHP远程采集图片详细教程


Posted in PHP onJuly 01, 2014

当我们需要采集网络上的某个网页内容时,如果目标网站上的图片做了防盗链的话,我们直接采集过来的图片在自己网站上是不可用的。那么我们使用程序将目标网站上的图片下载到我们网站服务器上,然后就可调用图片了。

本文将使用PHP实现采集远程图片功能。基本流程:
1、获取目标网站图片地址。
2、读取图片内容。
3、创建要保存图片的路径并命名图片名称。
4、写入图片内容。
5、完成。
我们通过写几个函数来实现这一过程。
函数make_dir()建立目录。判断要保存的图片文件目录是否存在,如果不存在则创建目录,并且将目录设置为可写权限。
 

function make_dir($path){ 

    if(!file_exists($path)){//不存在则建立 

        $mk=@mkdir($path,0777); //权限 

        @chmod($path,0777); 

    } 

    return true; 

}

函数read_filetext()取得图片内容。使用fopen打开图片文件,然后fread读取图片文件内容。
function read_filetext($filepath){ 

    $filepath=trim($filepath); 

    $htmlfp=@fopen($filepath,"r"); 

    //远程 

    if(strstr($filepath,"://")){ 

        while($data=@fread($htmlfp,500000)){ 

            $string.=$data; 

        } 

    } 

    //本地 

    else{ 

        $string=@fread($htmlfp,@filesize($filepath)); 

    } 

    @fclose($htmlfp); 

    return $string; 

}

函数write_filetext()写文件,将图片内容fputs写入文件中,即保存图片文件。
function write_filetext($filepath,$string){ 

    //$string=stripSlashes($string); 

    $fp=@fopen($filepath,"w"); 

    @fputs($fp,$string); 

    @fclose($fp); 

}

函数get_filename()获取图片名称,也可以自定义要保存的文件名。
function get_filename($filepath){ 

    $fr=explode("/",$filepath); 

    $count=count($fr)-1; 

    return $fr[$count]; 

}

然后将几个函数组合,在函数save_pic()中调用,最后返回保存后的图片路径。
function save_pic($url,$savepath=''){ 

    //处理地址 

    $url=trim($url); 

    $url=str_replace(" ","%20",$url); 

    //读文件 

    $string=read_filetext($url); 

    if(empty($string)){ 

        echo '读取不了文件';exit; 

    } 

    //文件名 

    $filename = get_filename($url); 

    //存放目录 

    make_dir($savepath); //建立存放目录 

    //文件地址 

    $filepath = $savepath.$filename; 

    //写文件 

    write_filetext($filepath,$string); 

    return $filepath; 

}

最后一步就是调用save_pic()函数保存图片,我们使用以下代码做测试。
//目标图片地址 

$pic = "http://img0.pconline.com.cn/pconline/1205/06/2776119_end1_thumb.jpg"; 

//保存目录 

$savepath = "images/"; 

echo save_pic($pic,$savepath);

实际应用中,我们可能会采集某个站点的内容,比如产品信息,包括采集防盗链的图片保存到网站上服务器上。这时我们可以使用正则匹配页面内容,将页面中相匹配的图片都找出来,然后分别下载到网站服务器上,完成图片的采集。以下代码仅供测试:
function get_pic($cont,$path){ 

    $pattern_src = '/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/'; 

    $num = preg_match_all($pattern_src, $cont, $match_src); 

    $pic_arr = $match_src[1]; //获得图片数组 

    foreach ($pic_arr as $pic_item) { //循环取出每幅图的地址 

        save_pic($pic_item,$path); //下载并保存图片 

        echo "[OK]..!"; 

    } 

}

然后我们通过分析页面内容,将主体内容找出来,调用get_pic()实现图片的保存。
//我们采集太平洋电脑网上一篇关于手机报道内容页的图片 

$url = "http://gz.pconline.com.cn/321/3215791.html"; 

 

$content = file_get_contents($url);//获取网页内容 

$preg = '#<div class="art_con">(.*)<div class="ivy620 ivy620Ex"></div>#iUs'; 

preg_match_all($preg, $content, $arr); 

$cont = $arr[1][0];  

get_pic($cont,'img/');

以上代码笔者亲测,可以采集图片,但是还有些场景没考虑进去,比如目标网站做了302多次跳转的,目标网站做了多种防采集的,留给喜欢折腾的同学去试试吧。
PHP 相关文章推荐
PHP 魔术函数使用说明
May 14 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
php文件操作实例代码
May 10 PHP
解析argc argv在php中的应用
Jun 24 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
PHP session文件独占锁引起阻塞问题解决方法
May 12 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 #PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 #PHP
PHP生成二维码的两个方法和实例
Jul 01 #PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 #PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 #PHP
2个比较经典的PHP加密解密函数分享
Jul 01 #PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 #PHP
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
详解jquery和vue对比
2019/04/16 jQuery
Node.js+ELK日志规范的实现
2019/05/23 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
python字符串反转的四种方法详解
2019/12/02 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
英国精品买手店:Browns Fashion
2016/09/29 全球购物
自我评价个人范文
2013/12/16 职场文书
绿色环保倡议书
2015/04/28 职场文书
卖车协议书范文
2016/03/23 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android