0

我用 PHP 编写了一个程序来查找和打印网页上的所有链接。它还会进入它找到的任何链接并执行相同的操作。我的问题是,在某些网站(如 Youtube)中,它不会打印链接,也不会在其中跟随。

这是我的主要代码:

function echo_urls($site_address){

    if(check_valid_url($site_address)){
        $site = new site();
        $site->address = $site_address;
        $site->full_address = "<a href=\"$site_address\">$site_address</a>";
        $site->depth = 0;

        $queue = new queue();

        $queue->push($site);
        array_push($queue->seen,$site->address);

        $depth = 0;

        while(($site = $queue->get_first())){
            $depth++;
            echo $site->depth." : ".$site->full_address."<br>";
            $queue = push_links($site->address,$queue,$depth);
        }
    }
    else;
}
function push_links($site_address,$queue,$depth){
if($depth<4){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$site_address);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        $result=curl_exec ($ch);
        curl_close ($ch);

        if( $result ){
            preg_match_all( '/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $result, $list);

            $list = $list[0];

            foreach( $list as $item ) {
                if(!(empty($item)))
                if($result = get_all_string_between($item,"href=\"","\"")){
                    if((array_search($result[0],$queue->seen))==false){
                        $site = new site();
                        $site->address = $result[0];
                        $site->full_address = $item;
                        $site->depth = $depth;
                        $queue->push($site);
                        array_push($queue->seen,$site->address);
                    }
                }
            }
        }
    }

    return $queue;
}
4

2 回答 2

1

通过查看几个函数很难判断,但我的猜测是:

  1. YouTube 阻止了你
  2. 这部分if($depth<4){正在停止push_links执行,因为它可能返回 FALSE

另外,不要为此使用 RegEx。使用类似DOMDocument 类的东西

于 2012-09-04T18:38:49.180 回答
0

我通常使用 PHPQuery 来抓取网站。这很简单

http://code.google.com/p/phpquery/

于 2012-09-04T20:00:57.463 回答