设为首页 收藏本站
查看: 913|回复: 0

[经验分享] PHP采集类

[复制链接]
累计签到:5 天
连续签到:1 天
发表于 2015-8-24 13:28:56 | 显示全部楼层 |阅读模式
PHP代码

  • <?php   
  •     class Thief{
  •       // 需要得到数据的网址
  •      var $URL;
  •      // 需要分析的开始标记
  •      var $startFlag;
  •      //需要分析的结束标记
  •      var $endFlag;
  •      //存储图片的路径
  •      var $saveImagePath;
  •      //访问图片的路径
  •      var $imageURL;
  •      // 列表内容
  •      var $ListContent;
  •      //需要获得的图片路径
  •      var $ImageList;
  •      //存储的图片名称
  •      var $FileName;
  •      /**
  •      * 得到页面内容
  •      * @return String 列表页面内容
  •      */
  •      function getPageContent ()
  •      {                  
  •       $pageContent = @file_get_contents( $this->URL );
  •       return $pageContent;
  •      }   
  •      /**
  •      * 根据标记得到列表段
  •      * @param $content  页面源数据
  •      * @return String   列表段内容
  •      */
  •      function getContentPiece ( $content )
  •      {   
  •       $content = $this->getContent( $content, $this->startFlag, $this->endFlag );
  •                                                         if(!$content)  $content=$this->cut ($content, $this->startFlag, $this->endFlag );
  •       return $content;
  •      }   
  •      /**
  •      * 得到一个字符串中的某一部分
  •      * @param $sourceStr 源数据
  •      * @param $startStr 分离部分的开始标记
  •      * @param $endStart 分离部分的结束标记
  •      * @return boolean  操作成功返回true
  •      */
  •      function getContent ( $sourceStr, $startStr, $endStart )
  •      {   
  •       $s = preg_quote( decode( $startStr ) );
  •       $e = preg_quote( decode( $endStart ) );
  •       $s = str_replace( " ", "[[:space:]]", $s );
  •       $e = str_replace( " ", "[[:space:]]", $e );
  •       $s = str_replace( "\r\n", "[[:cntrl:]]", $s );
  •       $e = str_replace( "\r\n", "[[:cntrl:]]", $e );
  •        preg_match_all( "@" . $s . "(.*?)". $e ."@is", $sourceStr, $tpl );
  •        $content = $tpl[1];
  •       $content = implode( "", $content );
  •       return $content;
  •      }   
  •      function cut ( $sourceStr, $startStr, $endStr )
  •      {   
  •                                                    return  cut( $sourceStr ,decode( $startStr )  ,decode( $endStr) );
  •                                        }   

  • /**
  •      * 得到只含有连接和内容的列表数组
  •      * @param $sList  页面列表源数据
  •      * @return array  列表段内容
  •      */
  •      function getSourceList ( $sList )
  •      {   
  •       preg_match_all( "/<a[[:space:]](.*?)<\/a>/i", $sList, $list );
  •        $list = $list[0];
  •    //foreach($list as $l) echo $l;
  •                                                         if(!$list || !is_array($list)){
  •                                                                       return $this->getSourceListExtend($sList);
  •                                                         }else{
  •                                       return $this->getList ( $list );
  •                                                         }   
  •      }
  •                                       function getSourceListExtend($sList)
  •                                       {   
  •                                                      $content=explode("</a>",$sList);
  •                                                      for($i=0;$i<count($content)-1;$i++)
  •                                                      {   
  •                                                               $lists=explode("<a",$content[$i]);
  •                                                               $list[]=$lists[1];
  •                                                      }   
  •                                                                return $this->GetListExtend( $list );
  •                                       }   

  • /**
  •      * 得到列表内容
  •      * @param $list  列表段内容
  •      * @return array  含有标题和连接的数组
  •      */
  •      function getList ( $list )
  •      {   
  •       for ( $i = 0; $i < count( $list ); $i++ )
  •       {                  
  •        //title
  •        preg_match_all( "/>(.*?)<\/a>/i", $list[$i], $templ );
  •         //content
  •        preg_match_all( "/href=(\"|'|)(.*?)(\"|'|)/i", $list[$i], $tempc );
  •        //获取的数据正确
  •        if( !emptyempty( $templ[1][0] ) && !emptyempty( $tempc[2][0] ) )
  •        {   
  •         if( 0 == strpos( $tempc[2][0], "/" ) )
  •         {   
  •          preg_match( "@http://(.*?)/@i", $this->URL, $url );
  •          $tempc[2][0] = substr( $url[0], 0, strlen( $url[0] ) - 1 ) . $tempc[2][0];
  •         }   
  •         $listContent[$i][0] = $templ[1][0];
  •          $listContent[$i][1] = $tempc[2][0];
  •        }   
  •                                                         }
  •                                                         if(!$listContent || !is_array($listContent)){
  •                                                                   return $this->GetListExtend ( $list );
  •                                                         }else{
  •                 return $listContent;
  •                                                         }   
  •      }
  • function GetListExtend ( $list )
  •      {                     
  •                                                         $list=str_replace("\"","",$list);
  •                                                         $list=str_replace("'","",$list);
  •                                                         $list=str_replace("=","",$list);
  •       for ( $i = 0; $i <count( $list ); $i++ )
  •       {   
  •        //content
  •        $temp_link=$this->cut($list[$i],"href"," ");
  •                                                                           echo $temp_link."<br>";
  •        //title  
  •        if(eregi(">",$list[$i])){
  •          $temp_title=substr(strrchr($list[$i], ">"), 1 );
  •          $temp_title=preg_replace( "@\<(.*?)\>@is","",$temp_title);
  •          $temp_title=str_replace( ">","",$temp_title);
  •          $temp_title=str_replace( "<","",$temp_title);
  •          if(!$temp_title)   $temp_title=$list[$i] ;
  •           $temp_title=preg_replace( "@\<(.*?)\>@is","",$temp_title);
  •           $temp_title=str_replace( ">","",$temp_title);
  •           $temp_title=str_replace( "<","",$temp_title);
  •            echo $temp_title."<br>";
  •                                                                           }else{
  •         $temp_title=$list[$i];
  •         $temp_title=preg_replace( "@\<(.*?)\>@is","",$temp_title);
  •          $temp_title=str_replace( ">","",$temp_title);
  •          $temp_title=str_replace( "<","",$temp_title);
  •          echo $temp_title."<br>";
  •                                                                           }   

  • //获取的数据正确
  •        if( !emptyempty( $temp_link ) && !emptyempty( $temp_title) )
  •        {   
  •         if( 0 == strpos( $tempc[2][0], "/" ) )
  •         {   
  •          preg_match( "@http://(.*?)/@i", $this->URL, $url );
  •          $temp_link = substr( $url[0], 0, strlen( $url[0] ) - 1 ) . $temp_link;
  •         }   
  •         $listContent[$i][0] = trim($temp_title);
  •         $listContent[$i][1] = $temp_link;
  •        }   
  •                                                         }
  •       return $listContent;
  •                                        }   
  • /**
  •      * 得到正文中的图片路径信息
  •      * @param $content 正文信息
  •      * @return array  信息中图片路径的数组
  •      */
  •      function getImageList ( $content )
  •      {   
  •       preg_match_all( "/src=(\"|')(.*?)(\"|')/i", $content, $temp );
  •       $imageList = $temp[2];
  •       return array_unique($imageList);
  •      }   
  •      /**
  •      * 下载图片时将页面中的路径替换成新的路径
  •      * @param $content  需要替换路径的页面内容
  •      * @return String   替换后的页面内容
  •      */
  •      function replaceImageParh ( $content )
  •      {   
  •       for ( $i = 0; $i < count( $this->ImageList ); $i++ )
  •       {   
  •                                                                          if($this->FileName[$i]){
  •                      $content = str_replace( $this->ImageList[$i], $this->imageURL.$this->FileName[$i], $content );
  •                                                                          }else{
  •                //$s=" /src=(\\\"|')".preg_quote($this->ImageList[$i])."(\\\"|')/i";
  •                      $content = str_replace($this->ImageList[$i], $GLOBALS[SET][webpath]."images/nopic.gif", $content );
  •                                                                          }   
  •       }
  •       return $content;
  •      }   
  •      /**
  •      * 下载图片时读取图片文件后存储在相应路径
  •      * @param $imageURL 需要读取的图片文件
  •      * @return boolean  操作成功返回true
  •      */
  •      function saveImage ( $imageURL )
  •      {   
  •       for ( $i = 0; $i < count( $imageURL ); $i++ )
  •       {   
  •        $fName = $this->saveFile( $imageURL[$i] );
  •        if( !emptyempty( $fName ) )
  •        {                  
  •         $filename[$i] = $fName;
  •        }   
  •       }
  •       return $filename;
  •      }   
  •      function saveFile( $fileName )
  •      {   
  •       $s_filename = basename( $fileName );
  •       $ext_name = strtolower( strrchr( $s_filename, "." ) );
  •       if( ( ".jpg" && ".gif" && ".swf" ) != strtolower( $ext_name ) )
  •       {   
  •        return "";
  •       }   
  •       if( 0 == strpos( $fileName, "/" ) )
  •       {   
  •        preg_match( "@http://(.*?)/@i", $this->URL, $url );
  •        $url = $url[0];
  •       }   
  •       if( 0 == strpos( $fileName, "." ) )
  •       {   
  •        $url = substr( $this->URL, 0, strrpos( $fileName, "/" ) );
  •       }   
  •       $contents = @file_get_contents( $url . $fileName );
  •        $s_filename = time(). rand( 1000, 9999 ) . $ext_name;
  •       //file_put_contents( $this->saveImagePath.$s_filename, $contents );
  •       $handle = @fopen ( $this->saveImagePath.$s_filename, "w" );
  •       @fwrite( $handle, $contents );
  •       @fclose($handle);
  •       if(filesize($this->saveImagePath.$s_filename)>3072){
  •                 return $s_filename;
  •                                                         }else{
  •                                                                   @unlink($this->saveImagePath.$s_filename);
  •                 return "";
  •                                                        }   
  •      }
  •         
  • /**
  •      * 不下载图片则格式化其路径为绝对路径
  •                                       * 不能格式化变态路径 Eg: ./../  or /./../ 一类的  不过不影响结果
  •      * @param $imageURL 需要读取的图片文件
  •      * @return $filename  返回格式化的图片路径
  •      */
  •                                       function  ToPath($imageURL)
  •                                       {   
  •                                                         $PathArray=parse_url($this->URL);
  •                                                         $webpath=$PathArray[scheme]."://".$PathArray[host] ;
  •                                                         $filepath=$PathArray[path] ;
  •                                               for ( $i = 0; $i < count( $imageURL ); $i++ )
  •       {   
  •                                                                    if( substr( $imageURL[$i] ,0,1 )== '/' ){
  •         $filename[$i] =$webpath.$imageURL[$i];
  •                                                                    }elseif( substr( $imageURL[$i] ,0,2 )== './' ){
  •         $filename[$i] =$webpath.$filepath.substr( $imageURL[$i] ,1, strlen( $imageURL[$i]) );
  •                                                                    }elseif( substr( $imageURL[$i] ,0,3 )== '../' ){
  •         $index=strrchr($filepath,"/");
  •         $filename[$i] =$webpath.substr($filepath,0,$index).substr($imageURL[$i] ,2, strlen( $imageURL[$i]));
  •                                                                    }elseif(substr( $imageURL[$i] ,0,4)== 'http'){
  •         $filename[$i] =$imageURL[$i] ;
  •                                                                    }else{
  •                                                                    }   
  •       }
  •       return $filename;
  •                                        }   
  • /**
  •      * 不下载图片时将页面中的路径替换成新的路径
  •      * @param $content  需要替换路径的页面内容
  •      * @return String   替换后的页面内容
  •      */
  •                                      function ImgPathReplace( $content )
  •                                      {   
  •       for ( $i = 0; $i < count( $this->ImageList ); $i++ )
  •       {   
  •        $content = str_replace( $this->ImageList[$i], $this->FileName[$i], $content );
  •       }   
  •       return $content;
  •                                      }      
  •      function setURL ( $u )
  •      {   
  •       $this->URL = $u;
  •       return true;
  •      }   
  •      function setStartFlag ( $s )
  •      {   
  •       $this->startFlag = $s;
  •       return true;
  •      }   
  •      function setEndFlag ( $e )
  •      {   
  •       $this->endFlag = $e;
  •       return true;
  •      }   
  •      function setSaveImagePath ( $p )
  •      {   
  •       $this->saveImagePath = $p;
  •       return true;
  •      }   
  •      function setImageURL ( $i )
  •      {   
  •       $this->imageURL = $i;
  •       return true;
  •      }   
  •     }
  •     ?>  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103531-1-1.html 上篇帖子: PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据 下篇帖子: PHP – 架構設計 Data Access Layer 篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表