PHP抓取网络数据的6种常见方法10 9.30

PHP 来源:用户投稿 收藏

本小节的名称为 fsockopen,curl与file_get_courses,具体是探讨这三种方式进行网络数据输入输出的一些汇总。关于 fsockopen 前面已经谈了不少,下面开始转入其它。这里先简单罗列一下一些常见的抓取网络数据的一些方法。

1. 用 file_get_courses 以 get 方式获取内容:

// $url = 'http://www.xiaoerhu.com';    
$url = 'http://www.xiaoerhu.com/php/sock.php';    
$html = file_get_courses($url);    
echo $html;

2. 用fopen打开url,以get方式获取内容

// $url = 'http://www.nowamagic.net';    
$url = 'http://www.nowamagic.net/php/sock.php';    
$fp = fopen($url, 'r');    
stream_get_meta_data($fp);    
$result = '';    
while(!feof($fp))    
{    
$result .= fgets($fp, 1024);    
}    
echo "url body: $result";    
fclose($fp);

3. 用file_get_courses函数,以post方式获取url

$data = array(    
    'foo'=>'bar',    
    'baz'=>'boom',    
    'site'=>'www.nowamagic.net',    
    'name'=>'nowa magic');    
  
$data = http_build_query($data);    

//$postdata = http_build_query($data);    
$options = array(    
     'http' => array(    
        'method' => 'POST',    
        'header' => 'Content-type:application/x-www-form-urlencoded',    
        'course' => $data    
        //'timeout' => 60 * 60 // 超时时间(单位:s)    
     )    
);    
  
$url = "http://www.nowamagic.net/test2.php";    
$context = stream_context_create($options);    
$result = file_get_courses($url, false, $context);    
  
echo $result;

4. 用 fsockopen 函数打开url,以get方式获取完整的数据,包括header和body

// $url = 'http://www.xiaoerhu.com';    
$url = 'http://www.xiaoerhu.com:80/php/sock.php?site=xiaoerhu.com';    
function get_url($url,$cookie=false)    
{    
     $url = parse_url($url);    
     $query = $url['path']."?".$url['query'];    
     echo "Query:".$query;    
     $fp = fsockopen( $url['host'], $url['port']?$url['port']:80 , $errno, $errstr, 30);    
     if (!$fp)    
     {    
         return false;    
     }    
     else {    
         $request = "GET $query HTTP/1.1\r\n";    
         $request .= "Host: $url[host]\r\n";    
         $request .= "Connection: Close\r\n";    
         if($cookie) $request.="Cookie:   $cookie\n";    
         $request.="\r\n";    
         fwrite($fp,$request);    
         $result = '';    
         while(!feof($fp))    
         {    
             $result .= @fgets($fp, 1024);    
         }    
         fclose($fp);    
         return $result;    
     }    
 }    
  //获取url的html部分,去掉header    
  function GetUrlHTML($url,$cookie=false)    
  {    
     $rowdata = get_url($url,$cookie);    
     if($rowdata)    
     {    
         $body= stristr($rowdata,"\r\n\r\n");    
         $body=substr($body,4,strlen($body));    
          return $body;    
      }    
 
     return false;    
  }    
   
  echo get_url($url);    
  
  echo GetUrlHTML($url);

5. 用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body

// $url = 'http://www.xiaoerhu.com';    
$url = 'http://www.xiaoerhu.com:80/php/sock.php?site=xiaoerhu.com';    
function HTTP_Post($URL,$data,$cookie, $referer="")    
{    

   // parsing the given URL    
   $URL_Info=parse_url($URL);    

   // Building referrer    
   if($referer=="") // if not given use this script as referrer    
      $referer="www.xiaoerhu.com";    
 
   // making string from $data    
    foreach($data as $key=> $value)    
    $values[]="$key=".urlencode($value);    
     $data_string=implode("&",$values);    
 
     // Find out which port is needed - if not given use standard (=80)    
     if(!isset($URL_Info["port"]))    
         $URL_Info["port"]=80;    

      $request = '';    
     // building POST-request:    
     $request.="POST ".$URL_Info["path"]." HTTP/1.1\n";    
     $request.="Host: ".$URL_Info["host"]."\n";    
      $request.="Referer: $referer\n";    
      $request.="Content-type: application/x-www-form-urlencoded\n";    
     $request.="Content-length: ".strlen($data_string)."\n";    
     $request.="Connection: close\n";    
 
     $request.="Cookie:   $cookie\n";    
 
     $request.="\n";    
     $request.=$data_string."\n";    
 
     $fp = fsockopen($URL_Info["host"],$URL_Info["port"]);    
     fputs($fp, $request);    
     $result = '';    
      while(!feof($fp))    
     {    
         $result .= fgets($fp, 1024);    
     }    
     fclose($fp);    
 
     return $result;    
 }    
 
$data = array(    
     'foo'=>'bar',    
     'baz'=>'boom',    
      'site'=>'www.xiaoerhu.com',    
     'name'=>'nowa magic');    
  
$cookie = '';    
$referer = 'http://www.xiaoerhu.com';    
  
echo HTTP_Post($url, $data, $cookie, $referer);

6. 使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展。

使用 curl 代码比较简洁,代码也比较规范,容易理解:

// $url = 'http://www.xiaoerhu.com';    
$url = 'http://www.xiaoerhu.com:80/php/sock.php?site=xiaoerhu.com';    
$ch = curl_init();    
$timeout = 5;    
curl_setopt ($ch, CURLOPT_URL, $url);    
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);    
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);    
$file_courses = curl_exec($ch);    
curl_close($ch);    
 
echo $file_courses;

这里就大概列举这么 6 种抓取网络数据的方式,也是比较常见的,让大家先有个总体的理解,还有各方法的比较。



免责声明:1.凡本站注明“来源:XXX(非小二胡工作室)”的作品,均转载自其它媒体,所载的文章、图片、音频视频文件等资料的版权归版权所有人所有,如有侵权,请联系xiaoerhu#88.com处理;2.凡本站转载内容仅代表作者本人观点,与小二胡工作室无关。
0 条评论

网友留言