如何抓取POST传递的结果页面 通常来说,如果要抓取的网站关键字事通过GET传递的,比较好办,比如我要在baidu中查找sun这个关键字,那么直接file_get_contents(http://www.baidu.com/?wd=sun)即可,但是如果网站是通过POST传递变量的话,我怎样才能先把变量传过去,然后再抓取处理后的结果页面呢?望各位指教,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 A simple HTTP request class using socket. <?phpclass 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手册 <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> gaochao79应该是个高手,不过我的理解能力较差,可不可以举个例子说明一下怎么使用这个类啊,谢谢了。黑马兄的意思我明白,不过最主要的是怎样才能获取到POST过去后的结果页面,还望解答,谢谢。 可以不用别的组件,直接PHP实现吗 一定要用PHP实现吗?估计比较难,PHP是服务端语言,而接收POST请求的结果页是客户端的事,PHP应该不负责这些东西吧.楼主这个问题很有趣,顶一个. 表单提交 如何找到图片的路径 使用curl post数据问题 如何写一个提取日志文件中的信息并按要求整理的小PHP程序呢? 请问各位高手朋友,phpmysql字符集出现问题!!! 二级域名是如何实现的? 请问上传文件,需要有哪些windows extensions,那么phpinfo()呢 请教一个读出<td></td>间字符的正则表达式! php時間函數問題,急. PHP保存网页为DOC 救命啊,安装ZEND出错了 谁能帮我把这段代PHP码改成ASP的
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手册
<input type="text" name="wd" size="20" value="sun" />
<input type="submit" name="submit" value="提交" />
</form>
黑马兄的意思我明白,不过最主要的是怎样才能获取到POST过去后的结果页面,还望解答,谢谢。
楼主这个问题很有趣,顶一个.