1、如何抓取被访问的那个网页里所有的带get参数的URL地址。如:XXX.PHP?id=21这样的
正则表达式 匹配一下2、如何判断这个页面是否是报错页面。或者说怎么判断此网页是否正常显示了。可以看返回的状态码 ,比如404叶面不存在 500以上就是出错了3、如何遍历此站点下的所有网页?只能像蜘蛛一样,一个连接一个连接的爬
正则表达式 匹配一下2、如何判断这个页面是否是报错页面。或者说怎么判断此网页是否正常显示了。可以看返回的状态码 ,比如404叶面不存在 500以上就是出错了3、如何遍历此站点下的所有网页?只能像蜘蛛一样,一个连接一个连接的爬
$_SERVER['REQUEST_URI']
<script>
document.write(location.href);
</script>
可以看返回的状态码 ,比如404叶面不存在 500以上就是出错了
如果得到状态码?
根据你的需要写相应的正则表达式啊,呵呵关于状态码的问题,如果你用 socket肯定可以得到,其他的php函数不是很了解
SOCKET我可以去查手册
$fp = fsockopen($host, 80);
if (!$fp) {
$res= -1;
} else { fwrite($fp, "GET /".$get." HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 128);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
$res=0;
} else {
$res= substr($res,9,3);
}
}
return $res;
}echo getHttpStatus("5y.nuc.edu.cn","/");
echo getHttpStatus("community.csdn.net","Expert/topic/4758/4758574.xml?temp=.1661646");返回
1 无法连接服务器
0 超时
200 OK (成功返回)
302 Found (找到)
404 没有找到
...
function getAllPage($path="./",$type=array("html","htm")) {
global $p;
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if(is_dir($file) && $file!="." && $file!="..") {
getAllPage($path.$file."/",$type);
} else {
$ex=array_pop(explode(".",$file));
if(in_array(strtolower($ex),$type)) {
array_push($p, $path.$file);
}
}
}
closedir($handle);
}
}$p=array();
getAllPage("./");
echo "<pre>";
print_r($p);
echo "</pre>";?>
3 有点问题,理论上没有问题,就是获取网页文件的 <a href="xx"></a> 里面XX的值,每个网页都要遍历一下,速度很慢,你用PHP做蜘蛛,累死,说不定 Apache 会死掉
但是第一个问题还是没有解决啊。
举例:http://61.183.11.66
http://www.goldadv.com其实都在一台服务器上,只是主机头不同,但是检测出来的都是直接IP的那个站点,这可如何是好
<?php
$str='<a href="http://blog.csdn.net/love01px/archive/2006/05/30/1.asp" Title = "permalink"><a href="http://blog.csdn.net/love01px/archive/2006/05/30/2.php" Title = "permalink"><a href="http://blog.csdn.net/love01px/archive/2006/05/30/3.php" Title = "permalink"><a href="/2006/05/30/4.php" Title = "permalink"><a href="http://blog.csdn.net/love01px/archive/2006/05/30/5.php" Title = "permalink">2006年05月30日 15:13:00</a> | <a href="http://blog.csdn.net/love01px/archive/2006/05/30/6.php?id=1" Title = "comments, pingbacks, trackbacks">评论 (0)</a>';preg_match_all("/href=\"([^\"]*\.*php[^\"]*)\"/si",$str,$m);
//换用下面这个获取所有类型URL
//preg_match_all("/href=\"([^\"]*)\"/si",$str,$m);print_r($m[1]);
?>
感谢
不过我现在第一和第二个问题还没解决,给点意见咧
<?php
$str=file_get_contents("http://www.php.net");
preg_match_all("/href=\"([^\"]*\.*php\?[^\"]*)\"/si",$str,$m);
print_r($m[1]);
?>
/**
* $host 服务器地址
* $get 请求页面
*
*/
function getHttpStatus($host,$get="") {
$fp = fsockopen($host, 80);
if (!$fp) {
$res= -1;
} else { fwrite($fp, "GET /".$get." HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 128);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
$res=0;
} else {
$res= substr($res,9,3);
}
}
return $res;
}$good=array("200","302");
if(in_array(getHttpStatus("5y.nuc.edu.cn","/"),$good)) {
echo "正常";
} else {
echo getHttpStatus("5y.nuc.edu.cn","/");
}if(in_array(getHttpStatus("5y.nuc.edu.cn","/error.php"),$good)) {
echo "正常";
} else {
echo getHttpStatus("5y.nuc.edu.cn","/error.php");
}
?>返回
第一个返回"正常"
第二个不存在返回"404"
我研究了一下你的代码,还是不行。因为不支持虚拟主机。直接访问IP是一个网站,用域名访问是另外一个 ,这可怎么办?
举例:http://61.183.11.66
http://www.goldadv.com其实都在一台服务器上,只是主机头不同,但是检测出来的都是直接用IP访问的那个站点,这可如何是好