四层教学楼效果图:PHP如何获取需要登陆后才能看到的网页HTML代码

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 05:47:09
登陆不需要验证码。
比如一个论坛,要登陆后才能看到的页面。
我要用 PHP 获取这个页面内容(HTML)。

希望给出具体代码。
回答采纳者,追加200分!决不失言!我号上有 2000 多分啊!

我所知道的,似乎要 伪造Cookie 。在服务端写入Cookie 不知道如何实现……

实际上是个模拟登陆的问题,需要写个登陆模块,解决两个问题:
1,请求登陆并刷新的函数部分:

<?php
/*****************函数部分**************************/
/*获取指定网页的内容
$url为网页地址
*/
function getcontent($url){
if($open=file($url)){
$count=count($open);
for($i=0;$i<$count;$i++)
{
$theget.=$open[$i];
}
}else{
die('请求过多,超时,请刷新');
}
return $theget;
}
?>
2,偷取程序部分,也分两部分,
1),PHP与XML不同之处是需要特殊的调用才能支持COOKIE.或者记录SessionID(后面有说明程序)

php代码如下
<?PHP
//登陆并保存COOKIE
$f = fsockopen("www.url.net",80);
$cmd = <<<EOT
GET /test/login.php?name=test&password=test HTTP/1.0

EOT;
fputs($f,$cmd);
$result = '';
$cookie = '';
$location = '';
while($line = fgets($f))
{
$result .= $line;
//取得location跟setCookie头HTTP头信息
$tmp = explode(":",$line);
if($tmp[0]=="Set-Cookie")
$cookie .= $tmp[1];
if($tmp[0]=="Location")
$location = $tmp[1];
}
fclose($f);
2),获取页面
//下面访问你要访问的页面(这部分也可以参考下面的核心例程)
$f = fsockopen("www.url.net",80);l
//下面的cookie就是发送前页保存下的的cookie
$cmd = <<<EOT
GET /test/test.php HTTP/1.0
cookie:$cookie

EOT;
fputs($f,$cmd);
while($line = fgets($f))
{
echo $line;
}
fclose($f);
?>

核心例程就是fsockopen();
不妨再给段代码你瞧瞧:
--------------------------------------------------------------------------------

function posttohost($url, $data)
{
$url = parse_url($url);
if (!$url) return "couldn't parse url";
if (!isset($url['port'])) { $url['port'] = ""; }
if (!isset($url['query'])) { $url['query'] = ""; }
$encoded = "";
while (list($k,$v) = each($data))
{
$encoded .= ($encoded ? "&" : "");
$encoded .= rawurlencode($k)."=".rawurlencode($v);
}
$fp = fsockopen($url['host'], $url['port'] ? $url['port'] : 80);
if (!$fp) return "Failed to open socket to $url[host]";
fputs($fp, sprintf("POST %s%s%s HTTP/1.0", $url['path'], $url['query'] ? "?" : "", $url['query']));
fputs($fp, "Host: $url[host]");
fputs($fp, "Content-type: application/x-www-form-urlencoded");
fputs($fp, "Content-length: " . strlen($encoded) . "");
fputs($fp, "Connection: close");
fputs($fp, "$encoded");
$line = fgets($fp,1024);
if (!eregi("^HTTP/1\\.. 200", $line)) return $line ;
$results = ""; $inheader = 1;
while(!feof($fp))
{
$line = fgets($fp,1024);
if ($inheader && ($line == "" || $line == "\r")) {
$inheader = 0;
}
elseif (!$inheader) {
$results .= $line;
}
}
fclose($fp);
return $results;
}
$data=array();
$data["msg"]="HELLO THIS IS TEST MSG";
$data["Type"]="TEXT";
echo posttohost("http://url/xxx", $data);

应该说明白了吧?
另外登陆部分还有一种简单方法是把SessionID保存下来

源代码:

<?php
/*
* 得到网页内容
* 参数:$host [in] string
* 主机名称(例如: www.url.com.cn
* 参数:$method [in] string
* 提交方法:POST, GET, HEAD ... 并加上相应的参数( 具体语法参见 RFC1945,RFC2068 )
* 参数:$str [in] string
* 提交的内容
* 参数:$sessid [in] string
* PHP的SESSIONID
*
* @返回 网页内容 string
*/
function GetWebContent($host, $method, $str, $sessid = '')
{
$ip = gethostbyname($host);
$fp = fsockopen($ip, 80);
if (!$fp) return;
fputs($fp, "$method\r\n");
fputs($fp, "Host: $host\r\n");
if (!empty($sessid))
{
fputs($fp, "Cookie: PHPSESSID=$sessid; path=/;\r\n");
}
if ( substr(trim($method),0, 4) == "POST")
{
fputs($fp, "Content-Length: ". strlen($str) . "\r\n"); // 别忘了指定长度
}
fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n\r\n");
if ( substr(trim($method),0, 4) == "POST")
{
fputs($fp, $str."\r\n");
}
while(!feof($fp))
{
$response .= fgets($fp, 1024);
}
$hlen = strpos($response,"\r\n\r\n"); // LINUX下是 "\n\n"
$header = substr($response, 0, $hlen);
$entity = substr($response, $hlen + 4);
if ( preg_match('/PHPSESSID=([0-9a-z]+);/i', $header, $matches))
{
$a['sessid'] = $matches[1];
}
if ( preg_match('/Location: ([0-9a-z\_\?\=\&\#\.]+)/i', $header, $matches))
{
$a['location'] = $matches[1];
}
$a['content'] = $entity;
fclose($fp);
return $a;
}

/* 构造用户名,密码字符串 */
$str = ("username=test&password=test");
$response = GetWebContent("localhost","POST /login.php HTTP/1.0", $str);
echo $response['location'].$response['content']."<br>";
echo $response['sessid']."<br>";
if ( preg_match('/error\.php/i',$response['location']))
{
echo "登陆失败<br>";
} else {
echo "登陆成功<br>";
// 不可以访问user.php,因为不带sessid参数
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', '');
echo $response['location']."<br>"; // 结果:error.php?errcode=2

// 可以访问user.php
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', $response['sessid']);
echo $response['location']."<br>"; // 结果:user.php
}
?>

一般这样:
将文件全部读入数组变量中。

语法: array file(string filename);

返回值: 数组

函数种类: 文件存取

内容说明

本函数与 readfile() 类似,不同的地方为本函数将文件全部读出,并输出到数组的变量中,每行都是单独的数组元素。

你试试这个:
<?php
$testVar = file("http://www.baidu.com");
for($i=0;$i<count($testVar);$i++)
{
echo $testVar[$i];
}
?>
如果不行的话,看看这个:

<?php
if (isset($_GET['url'])){
$all = "" ;
$in = fopen("http://so.5eo.com/pr/alexa.asp?domain=".$_GET['url'], "r") ;
while ($chunk = fread($in,4096)) {

login.php
// ** create a form here ,then record the cookie!

check.php
<?php
if($_COOKIE['the name depend on you']=="")echo "fuck you";
else
header('location:default.html');

?>

一般这样:
将文件全部读入数组变量中。

语法: array file(string filename);

返回值: 数组

函数种类: 文件存取

内容说明

本函数与 readfile() 类似,不同的地方为本函数将文件全部读出,并输出到数组的变量中,每行都是单独的数组元素。

你试试这个:
<?php
$testVar = file("http://www.baidu.com");
for($i=0;$i<count($testVar);$i++)
{
echo $testVar[$i];
}
?>
如果不行的话,看看这个:

<?php
if (isset($_GET['url'])){
$all = "" ;
$in = fopen("http://so.5eo.com/pr/alexa.asp?domain=".$_GET['url'], "r") ;
while ($chunk = fread($in,4096)) {
$all .= $chunk;
}
fclose($in);
echo strip_tags($all) ;
}
?>

参考下.

附上:

<!-- generateindex.php -->
<?php
//设置我们将要使用的文件
$srcurl = "http://localhost/index.php";
$tempfilename = "tempindex.html";
$targetfilename = "index.html";
?>
<HTML>
<HEAD>
<TITLE>
Generating <?php echo("$targetfilename"); ?>
</TITLE>
</HEAD>
<BODY>
<P>Generating <?php echo("$targetfilename"); ?>...</P>
<?php
//首先删除上次操作可能遗留下来的临时文件。
//这个过程可能会提示错误,所以我们使用@以防止报错。
@unlink($tempfilename);
//通过一个URL的请求装入动态版本。
//在我们接收到相关内容之前,Web服务器会对PHP进行处理
//(因为本质上我们是在模拟一个Web浏览器),
//所以我们将获得的是一个静态的HTML页面。
//'r'指出我们只要求对这个“文件”进行读操作。
$dynpage = fopen($srcurl, 'r');
//处理错误
if (!$dynpage) {
echo("<P>Unable to load $srcurl. Static page ".
"update aborted!</P>");
exit();
}
//将这个URL的内容读入到一个PHP变量中。
//指定我们将读取1MB的数据(超过这个数据量一般是意味着出错了)。
$htmldata = fread($dynpage, 1024*1024);
//当我们完成工作后,关闭到源“文件”的连接。
fclose($dynpage);
//打开临时文件(同时在这个过程中建立)以用来写入(注意'w'的用法).
$tempfile = fopen($tempfilename, 'w');
//处理错误
if (!$tempfile) {
echo("<P>Unable to open temporary file ".
"($tempfilename) for writing. Static page ".
"update aborted!</P>");
exit();
}
//将静态页面的数据写入到临时文件中
fwrite($tempfile, $htmldata);
//完成写入后,关闭临时文件。
fclose($tempfile);
//如果到了这里,我们应该已经成功地写好了一个临时文件,
//现在我们可以用它来覆盖原来的静态页面了。
$ok = copy($tempfilename, $targetfilename);
//最后删除这个临时文件。
unlink($tempfilename);
?>
<P>Static page successfully updated!</P>
</BODY>
</HTML>

楼主,你要的只是HTML代码,何必那么复杂?你都知道是要登陆后才能看到的页面,那么首先是找到登陆后看到的这个页面的文件名。然后用xmlhttp直接获取就行了。。

网上的新闻小偷程序,书库小偷程序,都是采用这个原理做的。。

不直接回答你的问题
就是想说下

最高只能追加100分,你说追加200,还决不食言,你拿什么来保证绝不食言?