0

私はこの単純な PHP Web クローラーを作成しました。この Web クローラーは、開始 body タグの後にページからソースを取得し、他の HTML タグを取り除き、コンテンツをエコーし​​ます。

.htmlで終わるページを指定して開始すると機能しますが、Googleからの一連の結果へのURLのようなURLを指定すると、それらのリンクをたどらず、コンテンツを取得してコンテンツをエコーし​​ます。

Google 検索結果の URL をたどり、その中のリンクをたどってそのコンテンツをエコーするようにするにはどうすればよいですか?

クローラーのコードは次のとおりです。

error_reporting( E_ERROR );

define( "CRAWL_LIMIT_PER_DOMAIN", 50 );

$domains = array();

$urls = array();

$dom = new DOMDocument();

$matches = array();

function crawl( $domObject, $url, $matchList )
{
    global $domains, $urls;
    $parse = parse_url( $url );
    $domains[ $parse['host'] ]++;
    $urls[] = $url;

    $content = file_get_contents( $url );
    if ( $content === FALSE ){
         return;
}

    $content = stristr($content, "<body>");
    $domObject->loadHTML($content);
    $anchors = $domObject->getElementsByTagName('a');
    foreach($anchors as $anchor){
         if(preg_match('/(?:https?:\/\/|www)[^\'\" ]*/i', (string)($anchor->getAttribute('href')))){
             array_push($matchList, (string)($anchor->getAttribute('href')));
         }
         else{
             preg_match('/(?:https?:\/\/|www)[^\/]+(?:\S*?\/)*/i', $url, $beginings);
             $urlPrefix = $beginings[0];
             $absolute = (string)(((string)$urlPrefix).((string)$anchor->getAttribute('href')));
             array_push($matchList, $absolute);
         }
     }
     echo  strip_tags($content) . "<br /><br /><br />";

     foreach( $matchList as $crawled_url ) {
         $parse = parse_url( $crawled_url );
         if ( count( $domains[ $parse['host'] ] ) < CRAWL_LIMIT_PER_DOMAIN && !in_array( $crawled_url, $urls ) ) {
            sleep( 1 );
            crawl( $domObject, $crawled_url, $matchList );
         }
      }
 }

 crawl($dom, 'http://www.google.com/search?q=google', $matches);
4

1 に答える 1

3

URL のダウンロードに何を使用しているのかわかりません。

これを使用することをお勧めします:

http://semlabs.co.uk/journal/object-directional-curl-class-with-multi-threading

Google が検索結果のリンクから 301 または 302 リダイレクトを使用していることは確かです。そのため、クローラーがリダイレクトをたどる必要があります。これが問題だと思います。

そのクラスを使用するには、オプションを使用する必要があります: CURLOPT_FOLLOWLOCATION

参照: http://php.net/manual/en/function.curl-setopt.php

さらに、Google を廃棄することを計画している場合は、多くの睡眠、またはいくつかの優れたプロキシが必要になります。Google は自動化されたクエリをブロックします。これを回避する方法は、Google Custom Search を介して Google XML の結果に $100 を支払うことです。

于 2013-05-17T02:46:25.930 に答える