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调用三种数据库的方法(3)
Oct 09 PHP
Wordpress php 分页代码
Oct 21 PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
Laravel数据库读写分离配置的方法
Oct 13 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
php二维数组排序详解
2013/11/06 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
详细讲解JS节点知识
2010/01/31 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
python搭建微信公众平台
2016/02/09 Python
python中的错误处理
2016/04/10 Python
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
高三自我鉴定
2013/10/23 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
值班管理制度范本
2015/08/06 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
linux目录管理方法介绍
2022/06/01 Servers