0

Web ページに存在するすべてのリンクを見つけて印刷するプログラムを 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. この部分はFALSE を返す可能性があるため、実行if($depth<4){を停止していますpush_links

また、これには RegEx を使用しないでください。DOMDocument クラスのようなものを使用します

于 2012-09-04T18:38:49.180 に答える
0

私は通常、サイトのクロールに PHPQuery を使用します。とてもシンプルです

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

于 2012-09-04T20:00:57.463 に答える