专门针对Thinkphp爬虫的网页抓取扩展类

2当家的 发布于 2017/03/08 10:33
阅读 366
收藏 4

教程演示和下载:http://www.erdangjiade.com/php/1154.html

  1. namespace Org\Util;
  2. class Vquery{
  3.   public $htmlContent;
  4.   public $result=array();
  5.   public $flag=false;
  6.   function __construct($args){
  7.     if(is_array($args)){
  8.       $method=strtolower(@$args["method"])=="post"?"post":"get";
  9.       $this->htmlContent=$this->curl_request(@$args["url"],$method,@$args["header"],@$args["data"],@$args["timeout"]);
  10.     }else{
  11.       $this->htmlContent=$args;
  12.     } 
  13.   }
  14.   /**
  15.    * [find description]
  16.    * @param  [type] $str string
  17.    * @return [type]      object
  18.    */
  19.   function find($str){
  20.     if(!$str)return $this;
  21.     $backupResult=$this->result;
  22.     $this->result=array();
  23.     $findArray=explode(",",$str);
  24.     foreach ($findArray as $value) {
  25.         $arr=array();
  26.         if (strstr($value, '$')) {
  27.             $nowValue=explode('$', $value);
  28.             $rz="/\<($nowValue[0])\s?.*?\>.*?\<\/\\1\>/is";
  29.             if(strstr($nowValue[1],"=")){
  30.               $rz="/\<($nowValue[0])\s?[^\<\\1]*?$nowValue[1].*?\>.*?\<\/\\1\>/is";
  31.             }
  32.         }else if(strstr($value, '=')){
  33.             $nowValue=explode(':', $value);
  34.             $rz="/\<([a-zA-Z]+)\s?[^\<\\1]*?$nowValue[0].*?\>.*?\<\/\\1\>/is";
  35.         }else{
  36.             $nowValue=explode(':', $value);
  37.             $rz="/\<($nowValue[0])\s?.*?\>.*?\<\/\\1\>/is";
  38.         }
  39.         if(@$backupResult[0]&&$this->flag){
  40.             foreach ($backupResult as $val) {
  41.                 if (!is_array($val))continue;
  42.                 foreach ($val as $vv) {
  43.                     preg_match_all($rz, $vv, $arr);
  44.                     if(strstr($value,":")){
  45.                         $temp=explode(":", $value);
  46.                         $number=@$temp[1]?@$temp[1]:0;
  47.                         $number=is_numeric($number)?$number:0;
  48.                         $this->result[]=array($arr[0][$number]);
  49.                     }else{
  50.                         $this->result[]=$arr[0];
  51.                     }
  52.             }
  53.             }
  54.         }else{
  55.             preg_match_all($rz, $this->htmlContent, $arr);
  56.             if(strstr($value,":")){
  57.                 $temp=explode(":", $value);
  58.                 $number=@$temp[1]?@$temp[1]:0;
  59.                 $number=is_numeric($number)?$number:0;
  60.                 $this->result[]=array($arr[0][$number]);
  61.             }else{
  62.                 $this->result[]=$arr[0];
  63.             }
  64.         }
  65.        
  66.     }
  67.     $this->flag=true;
  68.     return $this;
  69.   }
  70.   /**
  71.    * [deal description]
  72.    * @return [type] return dealArray
  73.    */
  74.   function deal(){
  75.       $resArray=array();
  76.       foreach ($this->result as $value)@$value[0]&&$temp[]=$value;
  77.       return $resArray[]=$temp;
  78.   }
  79.   /**
  80.    * [attr description]
  81.    * @param  [type]  $attr string
  82.    * @param  boolean $rz   internal call
  83.    * @return [type]        return result
  84.    */
  85.   function attr($attr,$rz=false){
  86.       if(@!$this->result[0])return $this;
  87.       $backupResult=$this->result;
  88.       $this->result=array();
  89.        foreach ($backupResult as $value) {
  90.            if (!is_array($value))continue;
  91.           foreach ($value as $val) {
  92.               !$rz&&$rz="/$attr=(\"|\')(.*?)(\'|\")/is";
  93.               preg_match($rz, $val, $arr);
  94.               @$arr[2]&&$temp[]=$arr[2];
  95.           }
  96.       }
  97.     $this->result[]=array_merge($this->result,$temp);
  98.       return $this->result;
  99.   }
  100.   /**
  101.    * [html description]
  102.    * @return [type] return innerHTML
  103.    */
  104.   function html(){
  105.       $rz="/\<([a-zA-Z]+)\s?[^\<\\1]*?\>(.*?)\<\/\\1\>/is";
  106.       return $this->attr("self",$rz);
  107.   }
  108.   /**
  109.    * [text description]
  110.    * @return [type] return innerText
  111.    */
  112.   function text(){
  113.       $tempArray=$this->html();
  114.       foreach ($tempArray as $key => $value)
  115.       $tempArray[$key]=preg_replace("/\<.*?\>|\<.*?\>/", '', $value);
  116.       return $tempArray;
  117.   }
  118.   /**
  119.    * [attr description]
  120.    * @param  [type]  $url     url
  121.    * @param  [type]  $method  post or get
  122.    * @param  [type]  $data    request data
  123.    * @param  [type]  $header  request header
  124.    * @param  [type]  $timeout timeout
  125.    * @return [type]  return   result
  126.    */
  127.   function curl_request($url,$method,$header,$data,$timeout=0){
  128.     if(!$url)return false;
  129.     $urlInfo=$this->parseUrl($url);
  130.     if($method=="get"){
  131.       $conn= curl_init($url);
  132.       curl_setopt($conn, CURLOPT_HEADER,0);
  133.       curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
  134.       curl_setopt($conn, CURLOPT_CONNECTTIMEOUT, $timeout);
  135.       curl_setopt($conn, CURLOPT_HTTPHEADER, $header);
  136.       $content=curl_exec($conn);
  137.       curl_close($conn);
  138.     }elseif($method=="post"){
  139.       $conn= curl_init($url);
  140.       $data&&$data=$this->formatUrl($data);
  141.       curl_setopt($conn, CURLOPT_HEADER,0);
  142.       curl_setopt($conn, CURLOPT_POST, true);
  143.       curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
  144.       curl_setopt($conn, CURLOPT_CONNECTTIMEOUT, $timeout);
  145.       $data&&curl_setopt($conn, CURLOPT_POSTFIELDS, $data);
  146.       curl_setopt($conn, CURLOPT_HTTPHEADER, $header);
  147.       $content=curl_exec($conn);
  148.       curl_close($conn);
  149.     }
  150.     return $content;
  151.   }
  152.   /**
  153.    * [attr description]
  154.    * @param  [type]  $url url
  155.    * @return [type]  return result(array)
  156.    */
  157.   function parseUrl($url){
  158.     $username="";$password="";$scheme=@explode("//", $url)[0]?explode(":", $url)[0]:"http";
  159.     $port=@preg_match_all("/.*?\:(\d+).*?/", $url, $matches)?$matches[1][0]:"80";
  160.     $path=@preg_match_all("/\/.*?\/.*?\/{1,}.*?/", @explode("//",$url)[1], $pathTmp)?$pathTmp[0][0]:"/";
  161.     $hash=@explode("#", $url)[1]?@explode("#", $url)[1]:"";
  162.     $queryString=@explode("?", $url)[1]?@explode("?", $url)[1]:"";
  163.     $filename=@preg_match_all("/.*?\/([^\/]*?)\?.*?/", @explode("//", $url)[1], $matches)?$matches[1][0]:preg_match("/.*?(\/.*)/", explode("//", $url)[1], $matches)?$matches[1]:"/";
  164.     if (stristr(explode("?", $url)[0], "@")) {
  165.       $username=@explode(":", @explode("//", $url)[1])[0]?@explode(":", @explode("//", $url)[1])[0]:"";
  166.       $password=@explode(":",@explode("@", @explode("//", $url)[1])[0])[1]?@explode(":",@explode("@", @explode("//", $url)[1])[0])[1]:"";
  167.       $host=@explode(":", @explode("/", @explode('@', @explode("?", $url)[0])[1])[0])[0];
  168.     }else $host=explode(":", preg_match("/.*?\/\/([^\/]*+)/", $url, $matches)?$matches[1]:"")[0];
  169.       return array(
  170.           "scheme"=>$scheme,
  171.           "host"=>$host,
  172.           "port"=>$port,
  173.           "username"=>$username,
  174.           "password"=>$password,
  175.           "path"=>$path,
  176.           "filename"=>$filename,
  177.           "queryString"=>$queryString,
  178.           "hash"=>$hash
  179.       );
  180.   }
  181.   /**
  182.    * [attr description]
  183.    * @param  [type]  $ar array or string
  184.    * @return [type]  return result(array or string)
  185.    */
  186.   function formatUrl($arg){
  187.       if(is_array($arg)){
  188.         $str='';
  189.         foreach ($arg as $key => $value)$str.=$key."=".$value."&";
  190.         return rtrim($str,"&");
  191.       }else{
  192.         $array=array();$arg=explode("&", $arg);
  193.         foreach ($arg as $value)$value&&$array=array_merge($array,array(explode("=",$value)[0]=> explode("=",$value)[1]));
  194.         return $array;
  195.       }
  196.   }
  197.   /**
  198.    * [attr description]
  199.    * @param  [type]  $flag default false
  200.    * @return [type]  return htmlcontont or echo htmlcontent
  201.    */
  202.   function getHtmlContent($flag=false){
  203.     if($flag)return $this->htmlContent;
  204.     echo "<pre>";
  205.     echo htmlspecialchars($this->htmlContent);
  206.     echo "</pre>";
  207.   }
  208. }
加载中
返回顶部
顶部