PHP语言编程实现采集远程图片资源

当我们需要采集网络上的某个网页内容时,如果目标网站上的图片做了防盗链的话,我们直接采集过来的图片在自己网站上是不可用的。那么我们使用程序将目标网站上的图片下载到我们网站服务器上,然后就可调用图片了。
查看演示DEMO
本文将使用PHP实现采集远程图片功能。基本流程:
1、获取目标网站图片地址。
2、读取图片内容。
3、创建要保存图片的路径并命名图片名称。
4、写入图片内容。
5、完成。
我们通过写几个函数来实现这一过程。
函数make_dir()建立目录。判断要保存的图片文件目录是否存在,如果不存在则创建目录,并且将目录设置为可写权限。

1 function make_dir($path){
2 if(!file_exists($path)){//不存在则建立
3 [email protected]($path,0777); //权限
4 @chmod($path,0777);
5 }
6 return true;
7 }
函数read_filetext()取得图片内容。使用fopen打开图片文件,然后fread读取图片文件内容。

01 function read_filetext($filepath){
02 $filepath=trim($filepath);
03 [email protected]($filepath,"r");
04 //远程
05 if(strstr($filepath,"://")){
06 while([email protected]($htmlfp,500000)){
07 $string.=$data;
08 }
09 }
10 //本地
11 else{
12 [email protected]($htmlfp,@filesize($filepath));
13 }
14 @fclose($htmlfp);
15 return $string;
16 }
函数write_filetext()写文件,将图片内容fputs写入文件中,即保存图片文件。

function write_filetext($filepath,$string){
//$string=stripSlashes($string);
[email protected]($filepath,"w");
@fputs($fp,$string);
@fclose($fp);
}
函数get_filename()获取图片名称,也可以自定义要保存的文件名。

1 function get_filename($filepath){
2 $fr=explode("/",$filepath);
3 $count=count($fr)-1;
4 return $fr[$count];
5 }
然后将几个函数组合,在函数save_pic()中调用,最后返回保存后的图片路径。

01 function save_pic($url,$savepath=‘‘){
02 //处理地址
03 $url=trim($url);
04 $url=str_replace(" ","%20",$url);
05 //读文件
06 $string=read_filetext($url);
07 if(empty($string)){
08 echo ‘读取不了文件‘;exit;
09 }
10 //文件名
11 $filename = get_filename($url);
12 //存放目录
13 make_dir($savepath); //建立存放目录
14 //文件地址
15 $filepath = $savepath.$filename;
16 //写文件
17 write_filetext($filepath,$string);
18 return $filepath;
19 }
最后一步就是调用save_pic()函数保存图片,我们使用以下代码做测试。

1 //目标图片地址
2 $pic = "http://img0.pconline.com.cn/pconline/1205/06/2776119_end1_thumb.jpg";
3 //保存目录
4 $savepath = "images/";
5 echo save_pic($pic,$savepath);
实际应用中,我们可能会采集某个站点的内容,比如产品信息,包括采集防盗链的图片保存到网站上服务器上。这时我们可以使用正则匹配页面内容,将页面中相匹配的图片都找出来,然后分别下载到网站服务器上,完成图片的采集。以下代码仅供测试:

1 function get_pic($cont,$path){
2 $pattern_src = ‘/<[img|IMG].*?src=[\‘|\"](.*?(?:[\.gif|\.jpg]))[\‘|\"].*?[\/]?>/‘;
3 $num = preg_match_all($pattern_src, $cont, $match_src);
4 $pic_arr = $match_src[1]; //获得图片数组
5 foreach ($pic_arr as $pic_item) { //循环取出每幅图的地址
6 save_pic($pic_item,$path); //下载并保存图片
7 echo "[OK]..!";
8 }
9 }
然后我们通过分析页面内容,将主体内容找出来,调用get_pic()实现图片的保存。

1 //我们采集太平洋电脑网上一篇关于手机报道内容页的图片
2 $url = "http://www.onesheng.cn";
3
4 $content = file_get_contents($url);//获取网页内容
5 $preg = ‘#<div class="main clearfix">(.*)<div class="art_nav_box">#iUs‘;
6 preg_match_all($preg, $content, $arr);
7 $cont = $arr[1][0];
8 get_pic($cont,‘img/‘);
以上代码笔者亲测,可以采集图片,但是还有些场景没考虑进去,比如目标网站做了302多次跳转的,目标网站做了多种防采集的,留给喜欢折腾的同学去试试吧。

时间: 2024-11-04 11:08:10

PHP语言编程实现采集远程图片资源的相关文章

优就业开发教程-精通Unix下C语言编程与项目实践

当前软件业开发工具日新月异,从C到C++,从Java到.net,新构架.新组件层出不穷,今天刚学习到的知识,也许明天就已经过时了.要想在激烈的竞争中站稳脚跟,在知识大爆炸中跟上时代的步伐,软件开发者一般会有两种应对方式: 1. 疯狂的学习,每天恶补新知识以适应知识发展的需要. 2. 打牢基础,选择一个相对稳定的平台和相对稳定的开发语言,以不变应万变. 在Unix下C语言编程是一种相对稳定的开发平台下的开发语言,掌握了它,就可以轻松完成当前Unix服务器下疯狂增长的各式各样的功能需求. 为什么选择

Go语言编程(旧读书笔记)

Go语言编程 目录 [隐藏] 1 前言 2 初识Go语言 3 顺序编程 4 OOP 5 并发编程 6 网络编程 7 安全编程 8 工程管理 9 开发工具 10 进阶话题 11 附录A [编辑]前言 协程? go run('test') Go强制了{ }的编写风格: if expression { 错误处理: defer?相当于finally?注意这里的作用域,defer之前似乎没有用{ }把整个(try)块括起来? defer相当于说推迟语句的执行,其内部实现会自动管理嵌套作用域的问题? Go允

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己

YL-236 LCD12864汉字显示C语言编程

sfr P0=0x80; sfr P1=0x90; sfr P2=0xa0; sfr P3=0xb0; sbit cs1=P2^0; sbit cs2=P2^1; sbit e=P2^2; sbit rw=P2^3;//可以直接接地 sbit di=P2^4; sbit rst=P2^5;//默认为1,可以直接接电源 extern unsigned char code abc[] ; ys(int ms) { int k,d; for(k=0;k<ms;k++) for(d=0;d<123;d

华为C语言编程规范

DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd.版权所有 侵权必究All rights reserved密级:confidentiality levelDKBA 2826-2011.52011-06-02 华为机密,未经许可不得扩散 Huawei Confidential 第2页,共61页Page 2 , Total61修订声明Revision

ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容

[php]代码库 view sourceprint? <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 200

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

关于C语言编程软件的推荐!

现在有各种各样的C语言编程软件,现在推荐一下codeblocks,codeblocks不仅仅局限于c语言,它适用于多种语言. Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::Blocks是开放源码软件.Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(2.6.2 unicode)版.对于追求完美的C++程序员,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格. 在网络上直接下载

linux下的c语言编程删除文件夹

刚刚在学习开始做新项目的时候,学长布置了一项任务,就是在给定一个目录下,要将这个目录下一个星期之前的目录包括里面的文件全部删除,只保留这一个星期内的.百度了好久的资料,终于完成,记录一下防止忘记.(注:文件夹名称默认为日期格式,如20140716) #include<dirent.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #i