我的链接爬虫在某些网页上不起作用

时间:2012-09-04 18:26:27

标签: php web-crawler

我用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;
}

2 个答案:

答案 0 :(得分:1)

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

  1. YouTube阻止了您
  2. 此部分if($depth<4){正在停止push_links执行,因为它可能正在返回FALSE
  3. 另外,请不要使用RegEx。使用类似The DOMDocument class

    的内容

答案 1 :(得分:0)

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

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