php网页图片采集

 

PHP代码
  1. <?php  
  2. header('Content-Type:text/html;charset=utf-8');  
  3.   
  4. /** 
  5.  * 一个用于抓去图片的类 
  6.  * @author tangpan <tang0pan@qq.com> 
  7.  */  
  8. class download_image {  
  9.     public $_save_path = NULL; //图片保存路劲  
  10.     public $_limit_size = NULL; //图片限制大小  
  11.     public static $_img_url_old = array();  //存储已抓取过的图片链接地址  
  12.     public static $_a_page_url = array();    //存储抓取过的页面  
  13.     public function __construct( $_save_path$_limit_size) {  
  14.         $this->_save_path = $_save_path;  
  15.         $this->_limit_size = $_limit_size;  
  16.     }  
  17.       
  18.     public function get_all_page_image( $site_url ) {  
  19.         if ( $site_url == '' ) {  
  20.             return false;  
  21.         }  
  22.         if ( ! in_array( $site_url, self::$_a_page_url ) ) {  //判断当前页面是否抓取过  
  23.             self::$_a_page_url[] = $site_url;   //将超链接存入静态数组中  
  24.         } else {  
  25.             return;     //若抓取过则跳出  
  26.         }  
  27.         $this->download_the_page_image( $site_url );  
  28.         $content = @file_get_contents($site_url);  
  29.         $a_page_url = "|<a[^>]+href=['\" ]?([^ '\"?]+)['\" >]|U";  
  30.         $all_url = array();  
  31.         preg_match_all( $a_page_url$content$all_url, PREG_SET_ORDER );  
  32.         if ( $all_url != NULL ) {  
  33.             foreach$all_url as $key => $val ) {  
  34.                 /** 
  35.                  * 静态化超链接,防止进入死循环 
  36.                  * 出去当前页面链接表示方式('','#','/') 
  37.                  */  
  38.                 if ( trim($val[1]) != '' && ! in_array( $val[1], self::$_a_page_url ) && ! in_array( $val[1], array('#','/',$site_url) ) ) { 
  39.                     self::$_a_page_url[] = $val[1];   //将符合要求的超链接写入静态数组中 
  40.                 }  
  41.             } 
  42.         } 
  43.         if ( self::$_a_page_url != NULL ) { 
  44.             foreach( self::$_a_page_url as $keys => $vals ) { 
  45.                 if ( strpos( $vals, 'http://' ) === false ) { //超链接不包含http://时,不能直接访问  
  46.                     // 当图片链接地址为相对地址是重新拼凑地址  
  47.                     $a_domain_url = substr$site_url, 0, strpos$site_url, '/',8 ) + 1 ); 
  48.                     $a_img_url = $a_domain_url.$vals;  
  49.                 } 
  50.                 //递归调用,访问每一个超链接页面 
  51.                 $this->get_all_page_image( $a_img_url ); 
  52.             } 
  53.         } 
  54.     } 
  55.      
  56.     /** 
  57.      * 下载当前页面下的所有图片链接 
  58.      * @param $site_url   <页面地址> 
  59.      */ 
  60.     public function download_the_page_image( $site_url ) { 
  61.         // 获取当前链接地址页面的所有内容 
  62.         $img_pattern = NULL; 
  63.         $content = @file_get_contents( $site_url ); 
  64.         $img_pattern = "|<img[^>]+src=['\" ]?([^ '\"?]+)['\" >]|U";  
  65.         //全局匹配所有的<img >中的图片链接  
  66.         $img_out = array();  
  67.         preg_match_all( $img_pattern$content$img_out, PREG_SET_ORDER );  
  68.         echo '<h1>'$site_url . '共找到' . count($img_out) . '张图片</h1>';  
  69.         //print_r($img_out[1]);  
  70.         foreach$img_out as $key => $val ) {  
  71.             //echo htmlspecialchars($val[1]).'<br />';  
  72.             $this->save_one_image( $site_url$val[1]);  
  73.         }  
  74.           
  75.     }  
  76.       
  77.     public function save_one_image( $site_url$img_url ) {  
  78.         if ( strpos$img_url'http://' ) === false ) {  
  79.             // 当图片链接地址为相对地址是重新拼凑地址  
  80.             $domain_url = substr$site_url, 0, strpos$site_url'/',8 ) + 1 );  
  81.             $img_url = $domain_url.$img_url;   
  82.         }  
  83.         $pic_name = basename$img_url ); //获取图片名称  
  84.           
  85.         if ( in_array( $img_url, self::$_img_url_old ) ) {  
  86.             echo $img_url .'<span style="color:red;margin-left:50px">该图片已经抓取过!</span><br/>';  
  87.             return;  
  88.         }  
  89.         //获取图片内容,并写入一个字符串  
  90.         $img_data = @file_get_contents$img_url );  
  91.         if ( strlen($img_data) < $this->_limit_size ) { //图片大小在限制范围内  
  92.             $img_boo = @file_put_contents$this->_save_path.md5(microtime()).$pic_name$img_data );  
  93.             if ( $img_boo ) {  
  94.                 echo $img_url .'<span style="color:green;margin-left:50px;">图片保存成功!</span><br/>';  
  95.                 self::$_img_url_old[] = $img_url;  
  96.             } else {  
  97.                 echo $img_url .'<span style="color:red;margin-left:50px;">图片保存失败!</span><br />';  
  98.             }  
  99.         } else {  
  100.             echo $img_url .'<span style="color:red;margin-left:50px;">图片大小在限制范围之外!</span><br />';  
  101.         }  
  102.     }  
  103. }  
  104. set_time_limit(0);  
  105. $download_images = new download_image('surces_Img/',1024*1024*100);  
  106. $download_images->get_all_page_image('http://www.22mm.cc/');  
  107. ?>  

 



上一篇: PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
下一篇: PHP SMTP邮件发送类,支持SSL连接
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1749
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑