1、如何抓取被访问的那个网页里所有的带get参数的URL地址。如:XXX.PHP?id=21这样的
   
正则表达式  匹配一下2、如何判断这个页面是否是报错页面。或者说怎么判断此网页是否正常显示了。可以看返回的状态码  ,比如404叶面不存在 500以上就是出错了3、如何遍历此站点下的所有网页?只能像蜘蛛一样,一个连接一个连接的爬

解决方案 »

  1.   

    补充:1
    $_SERVER['REQUEST_URI']
    <script>
    document.write(location.href);
    </script>
      

  2.   

    匹配一下:什么样的正则?
    可以看返回的状态码  ,比如404叶面不存在 500以上就是出错了
    如果得到状态码?
    根据你的需要写相应的正则表达式啊,呵呵关于状态码的问题,如果你用 socket肯定可以得到,其他的php函数不是很了解
      

  3.   

    正则的举个例子咧
    SOCKET我可以去查手册
      

  4.   

    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;
    }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 没有找到
    ...
      

  5.   

    遍历所有网页 ($type指定类型)<?php
    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>";?>
      

  6.   

    1.2都好实现
    3 有点问题,理论上没有问题,就是获取网页文件的 <a href="xx"></a> 里面XX的值,每个网页都要遍历一下,速度很慢,你用PHP做蜘蛛,累死,说不定 Apache 会死掉
      

  7.   

    (JAVA CUP) 的代码不错,可以研究一下。
    但是第一个问题还是没有解决啊。
      

  8.   

    不过我研究了一下,还是不行。因为不支持虚拟主机。直接访问IP是一个网站,用域名访问是另外一个 ,这可怎么办?
    举例:http://61.183.11.66
    http://www.goldadv.com其实都在一台服务器上,只是主机头不同,但是检测出来的都是直接IP的那个站点,这可如何是好
      

  9.   

    你不会是想用php做蜘蛛吧~??
      

  10.   


    <?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]);
    ?>
      

  11.   

    JAVA CUP。你的代码是第三个问题吧
    感谢
    不过我现在第一和第二个问题还没解决,给点意见咧
      

  12.   

    包含在链接里带get参数的地址
    <?php
    $str=file_get_contents("http://www.php.net");
    preg_match_all("/href=\"([^\"]*\.*php\?[^\"]*)\"/si",$str,$m);
    print_r($m[1]);
    ?>
      

  13.   

    2:判断这个页面是否是报错页面<?php
    /**
      * $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"
      

  14.   

    JAVA CUP,送佛送西天咧
    我研究了一下你的代码,还是不行。因为不支持虚拟主机。直接访问IP是一个网站,用域名访问是另外一个 ,这可怎么办?
    举例:http://61.183.11.66
    http://www.goldadv.com其实都在一台服务器上,只是主机头不同,但是检测出来的都是直接用IP访问的那个站点,这可如何是好
      

  15.   

    http://blog.csdn.net/heiyeshuwu/archive/2006/05/31/764790.aspx至于想深入研究抓取,嗯,建议去阅读专业书籍,呵呵。蜘蛛抓取,大致是个图的遍历的过程,深度遍历,广度遍历,文件存储,效率等等。