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

    各方法比较
    服务器君一共花费 18.803 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

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

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

    // $url = 'http://www.nowamagic.net';
    $url = 'http://www.nowamagic.net/php/sock.php';
    $html = file_get_contents($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_contents函数,以post方式获取url

    这种方法我们之前点了一下,具体可以参考 stream_context_create()模拟POST/GET 这篇文章。

    $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',
    		'content' => $data
    		//'timeout' => 60 * 60 // 超时时间(单位:s)
    	)
    );
    
    $url = "http://www.nowamagic.net/test2.php";
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    
    echo $result;
    

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

    这种方法在小节前面谈得很多了,这里不厌其烦地再列举一下:

    // $url = 'http://www.nowamagic.net';
    $url = 'http://www.nowamagic.net:80/php/sock.php?site=nowamagic.net';
    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);
    

    程序输出:

    Query:/php/sock.php?site=nowamagic.netHTTP/1.1 200 OK
    Date: Wed, 19 Feb 2014 06:06:25 GMT
    Server: Apache/2.2.3 (CentOS)
    X-Powered-By: PHP/5.3.3
    Vary: Accept-Encoding
    Content-Length: 21
    Connection: close
    Content-Type: text/html; charset=UTF-8
    
    Welcome to NowaMagic 
    
    Query:/php/sock.php?site=nowamagic.net Welcome to NowaMagic
    

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

    // $url = 'http://www.nowamagic.net';
    $url = 'http://www.nowamagic.net:80/php/sock.php?site=nowamagic.net';
    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.nowamagic.net";
    
    	// 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.nowamagic.net', 
    	'name'=>'nowa magic'); 
    	
    $cookie = '';
    $referer = 'http://www.nowamagic.net/';
    	
    echo HTTP_Post($url, $data, $cookie, $referer);
    

    程序输出:

    HTTP/1.1 200 OK
    Date: Wed, 19 Feb 2014 06:15:38 GMT
    Server: Apache/2.2.3 (CentOS)
    X-Powered-By: PHP/5.3.3
    Vary: Accept-Encoding
    Content-Length: 21
    Connection: close
    Content-Type: text/html; charset=UTF-8
    
    Welcome to NowaMagic 
    

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

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

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

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

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android Studio里的Gradle 3 个条目
  2. [移动开发] Android与SQLite数据库 7 个条目
  3. [JavaScript程序设计] jQuery与表单操作 2 个条目
  4. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  5. [数据结构] 散列表(哈希表) 13 个条目
  6. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  7. [PHP程序设计] PHP里的布尔类型 3 个条目
  8. [C语言程序设计] 结构体基本知识 1 个条目
  9. [移动开发] Android加载器Loaders 5 个条目
  10. [PHP程序设计] 命令式编程范式 6 个条目
  11. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
  12. [Python程序设计] Tornado源码解析 23 个条目
窗口 -- [协会]