PHP采集远程图片


 

    1. <?php 
    2. /*使用PHP实现采集远程图片功能。基本流程: 
    3.  
    4. 1、获取目标网站图片地址。 
    5.  
    6. 2、读取图片内容。 
    7.  
    8. 3、创建要保存图片的路径并命名图片名称。 
    9.  
    10. 4、写入图片内容。 
    11.  
    12. 5、完成。 
    13.  
    14. 我们通过写几个函数来实现这一过程。*/ 
    15.  
    16. //函数make_dir()建立目录。判断要保存的图片文件目录是否存在,如果不存在则创建目录,并且将目录设置为可写权限。 
    17. function make_dir($path){  
    18.     if(!file_exists($path)){//不存在则建立  
    19.         $mk=@mkdir($path,0777); //权限  
    20.         @chmod($path,0777);  
    21.     }  
    22.     return true;  
    23. }  
    24.  
    25. //函数read_filetext()取得图片内容。使用fopen打开图片文件,然后fread读取图片文件内容。 
    26. function read_filetext($filepath){  
    27.     $filepath=trim($filepath);  
    28.     $htmlfp=@fopen($filepath,"r");  
    29.     //远程  
    30.     if(strstr($filepath,"://")){  
    31.         while($data=@fread($htmlfp,500000)){  
    32.             $string.=$data;  
    33.         }  
    34.     }  
    35.     //本地  
    36.     else{  
    37.         $string=@fread($htmlfp,@filesize($filepath));  
    38.     }  
    39.     @fclose($htmlfp);  
    40.     return $string;  
    41. }  
    42.  
    43.  
    44. //函数write_filetext()写文件,将图片内容fputs写入文件中,即保存图片文件。 
    45. function write_filetext($filepath,$string){  
    46.     //$string=stripSlashes($string);  
    47.     $fp=@fopen($filepath,"w");  
    48.     @fputs($fp,$string);  
    49.     @fclose($fp);  
    50. }  
    51.  
    52.  
    53. //函数get_filename()获取图片名称,也可以自定义要保存的文件名。 
    54. function get_filename($filepath){  
    55.     $fr=explode("/",$filepath);  
    56.     $count=count($fr)-1;  
    57.     return $fr[$count];  
    58. }  
    59.  
    60.  
    61. //然后将几个函数组合,在函数save_pic()中调用,最后返回保存后的图片路径。 
    62. function save_pic($url,$savepath=''){  
    63.     //处理地址  
    64.     $url=trim($url);  
    65.     $url=str_replace(" ","%20",$url);  
    66.     //读文件  
    67.     $string=read_filetext($url);  
    68.     if(emptyempty($string)){  
    69.         echo '读取不了文件';exit;  
    70.     }  
    71.     //文件名  
    72.     $filename = get_filename($url);  
    73.     //存放目录  
    74.     make_dir($savepath); //建立存放目录  
    75.     //文件地址  
    76.     $filepath = $savepath.$filename;  
    77.     //写文件  
    78.     write_filetext($filepath,$string);  
    79.     return $filepath;  
    80. }  
    81.  
    82.  
    83. //最后一步就是调用save_pic()函数保存图片,我们使用以下代码做测试。 
    84. //目标图片地址  
    85. //$pic = "http://img0.pconline.com.cn/pconline/1205/06/2776119_end1_thumb.jpg";  
    86. // for($i=100; $i<=204; $i++) 
    87. // { 
    88.     // $pic = 'http://cache.soso.com/img/img/e'.$i.'.gif'; 
    89. ////保存目录  
    90. // $savepath = "images/";  
    91. // echo save_pic($pic,$savepath)."<br />";  
    92. // } 
    93.  
    94.  
    95. /* 
    96. 实际应用中,我们可能会采集某个站点的内容,比如产品信息,包括采集防盗链的图片保存到网站上服务器上。这时我们可以使用正则匹配页面内容,将页面中相匹配的图片都找出来,然后分别下载到网站服务器上,完成图片的采集。以下代码仅供测试: 
    97. */ 
    98. function get_pic($cont,$path){  
    99.     $pattern_src = '/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/';  
    100.     $num = preg_match_all($pattern_src, $cont, $match_src);  
    101.     $pic_arr = $match_src[1]; //获得图片数组  
    102.     foreach ($pic_arr as $pic_item) { //循环取出每幅图的地址  
    103.         save_pic($pic_item,$path); //下载并保存图片  
    104.         echo "[OK]..!<br />";  
    105.     }  
    106. }  
    107.  
    108. //然后我们通过分析页面内容,将主体内容找出来,调用get_pic()实现图片的保存。 
    109.   
    110. //我们采集太平洋电脑网上一篇关于手机报道内容页的图片  php100.com
    111. $url = "http://gz.pconline.com.cn/321/3215791.html";  
    112.   
    113. $content = file_get_contents($url);//获取网页内容  
    114. $preg = '#<div class="art_con">(.*)<div class="ivy620 ivy620Ex"></div>#iUs';  
    115. preg_match_all($preg, $content, $arr);  
    116. $cont = $arr[1][0];   
    117. get_pic($cont,'img/');  
    118.  
    119. /* 
    120. 以上代码笔者亲测,可以采集图片,但是还有些场景没考虑进去,比如目标网站做了302多次跳转的,目标网站做了多种防采集的,留给喜欢折腾的同学去试试吧。 
    121. */ 
    122. ?>
posted @ 2013-05-07 10:09  BeacherGong  阅读(923)  评论(0编辑  收藏  举报