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代替JS玩转DOM的思路及示例代码
Jun 15 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP中把对象转换为关联数组代码分享
Apr 09 PHP
php链表用法实例分析
Jul 09 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
如何解决PHP获取不到SESSION信息之一般情况
Oct 10 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
php 判断字符串中是否包含html标签
2014/02/17 PHP
php的常量和变量实例详解
2017/06/27 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
django的autoreload机制实现
2020/06/03 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
授权委托书样本
2014/04/03 职场文书
家长对学生的评语
2014/04/18 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
赢在执行观后感
2015/06/16 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
使用Java去实现超市会员管理系统
2022/03/18 Java/Android