2

私は現在、サイトをクロールしてサイトマップを作成するスクリプト(できればPHP)を作成する方法を見つけようとしています。従来の標準的なページのリストに加えて、どのページが他のページにリンクしているかをスクリプトで追跡したいと思います。

サンプルページ

A
B
C
D

次のような出力が欲しいのですが。

ページ名: A

ページAにリンクしているページ:

  • B
  • C
  • D

ページ名: B

ページBにリンクしているページ:

  • A
  • C

等...

複数の標準サイトマップスクリプトに出くわしましたが、私が探しているものを実際に達成するものは何もありません。


編集 私は十分な情報を提供しなかったようです。そこに私の明確さの欠如について申し訳ありません。これが私が現在持っているコードです。simple_html_dom.phpを使用して、htmlの解析と検索のタスクを処理しました。

<?php

include("simple_html_dom.php");

url = 'page_url';

$html = new simple_html_dom(); 
$html->load_file($url);

$linkmap = array();

foreach($html->find('a') as $link):
    if(contains("cms/education",$link)):
        if(!in_array($link, $linkmap)):
            $linkmap[$link->href] = array();
        endif;
    endif;
endforeach;

?>

注:私の小さなforeachループは、URLの特定のサブストリングに基づいてフィルタリングするだけです。

だから、私は必要な第1レベルのページを持っています。私が立ち往生しているのは、すでにアクセスしたページを追跡しながら、無期限に実行されないループを作成することです。

4

1 に答える 1

0

基本的に、ここでフローを制御するには2つのアレイが必要です。1つ目は、表示する必要のあるページを追跡し、2つ目は、既に表示したページを追跡します。次に、残りがなくなるまで、各ページで既存のコードを実行します。

<?php

include("simple_html_dom.php");

$urlsToCheck = array();
$urlsToCheck[] = 'page_url';
$urlsChecked = array();

while(count($urlsToCheck) > 0)
{
   $url = array_pop($urlsToCheck);
   if (!in_array($url, $urlsChecked)
   {
      $urlsChecked[] = $url;

      $html = new simple_html_dom(); 
      $html->load_file($url);

      $linkmap = array();

      foreach($html->find('a') as $link):
          if(contains("cms/education",$link)):
              if((!in_array($link, $urlsToCheck)) && (!in_array($link,$urlsChecked)))
                 $urlsToCheck[] = $link;

              if(!in_array($link, $linkmap)):
                  $linkmap[$link->href] = array();
              endif;
          endif;
      endforeach;
   }
}

?>
于 2012-05-10T21:03:21.513 に答える