通常来说,如果要抓取的网站关键字事通过GET传递的,比较好办,比如我要在baidu中查找sun这个关键字,那么直接file_get_contents(http://www.baidu.com/?wd=sun)即可,但是如果网站是通过POST传递变量的话,我怎样才能先把变量传过去,然后再抓取处理后的结果页面呢?望各位指教,谢谢!

解决方案 »

  1.   

    A simple HTTP request class using socket. <?php
    class HttpRequest
    {
       var $sHostAdd;
       var $sUri;
       var $iPort;
       
       var $sRequestHeader;
       
       var $sResponse;
       
       function HttpRequest($sUrl)
       {
           $sPatternUrlPart = '/http:\/\/([a-z-\.0-9]+)(:(\d+)){0,1}(.*)/i';
           $arMatchUrlPart = array();
           preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
           
           $this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
           if (empty($arMatchUrlPart[4]))
           {
               $this->sUri = '/';
           }
           else
           {
               $this->sUri = $arMatchUrlPart[4];
           }
           if (empty($arMatchUrlPart[3]))
           {
               $this->iPort = 80;
           }
           else
           {
               $this->iPort = $arMatchUrlPart[3];
           }
           
           $this->addRequestHeader('Host: '.$arMatchUrlPart[1]);
           $this->addRequestHeader('Connection: Close');
       }
       
       function addRequestHeader($sHeader)
       {
           $this->sRequestHeader .= trim($sHeader)."\r\n";
       }
       
       function sendRequest($sMethod = 'GET', $sPostData = '')
       {
           $sRequest = $sMethod." ".$this->sUri." HTTP/1.1\r\n";
           $sRequest .= $this->sRequestHeader;
           if ($sMethod == 'POST')
           {
               $sRequest .= "Content-Type: application/x-www-form-urlencoded\r\n";
               $sRequest .= "Content-Length: ".strlen($sPostData)."\r\n";
               $sRequest .= "\r\n";
               $sRequest .= $sPostData."\r\n";
           }
           $sRequest .= "\r\n";
           
           $sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
           if (!$sockHttp)
           {
               die('socket_create() failed!');
           }
           
           $resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);
           if (!$resSockHttp)
           {
               die('socket_connect() failed!');
           }
           
           socket_write($sockHttp, $sRequest, strlen($sRequest));
           
           $this->sResponse = '';
           while ($sRead = socket_read($sockHttp, 4096))
           {
               $this->sResponse .= $sRead;
           }
           
           socket_close($sockHttp);
       }
       
       function getResponse()
       {
           return $this->sResponse;
       }
       
       function getResponseBody()
       {
           $sPatternSeperate = '/\r\n\r\n/';
           $arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
           return $arMatchResponsePart[1];
       }
    }
    ?> 
    //--------------------------------------------
    //以上摘自php手册
      

  2.   

    <form name="form" method="post" action="http://www.baidu.com/">
    <input type="text" name="wd" size="20" value="sun" />
    <input type="submit" name="submit" value="提交" />
    </form>
      

  3.   

    gaochao79应该是个高手,不过我的理解能力较差,可不可以举个例子说明一下怎么使用这个类啊,谢谢了。
    黑马兄的意思我明白,不过最主要的是怎样才能获取到POST过去后的结果页面,还望解答,谢谢。
      

  4.   

    可以不用别的组件,直接PHP实现吗
      

  5.   

    一定要用PHP实现吗?估计比较难,PHP是服务端语言,而接收POST请求的结果页是客户端的事,PHP应该不负责这些东西吧.
    楼主这个问题很有趣,顶一个.