Как создать карту сайта с отношениями страниц


В настоящее время я пытаюсь найти способ написать скрипт (предпочтительно PHP), который будет сканировать сайт и создавать карту сайта. В дополнение к традиционному стандартному списку страниц, я бы хотел, чтобы скрипт отслеживал, какие страницы ссылаются на другие страницы.

Примеры страниц

A
B
C
D

Я хотел бы, чтобы результат дал мне что-то вроде следующего.

Название Страницы: A

Страницы, ссылающиеся на страницу О:

  • B
  • C
  • D

Название Страницы: B

Страницы, ссылающиеся на страницу B:

  • A
  • C

И т. д...

Я наткнулся на несколько стандартных сценариев sitemap, но ничего, что действительно выполняет то, что я ищу.


EDIT Похоже, я дал недостаточно информации. Извините за отсутствие ясности. Вот код, который у меня сейчас есть. Я использовал 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 2

1 ответ:

В принципе, вам нужно два массива для управления потоком здесь. Первый будет отслеживать страницы, которые вам нужно посмотреть, а второй будет отслеживать страницы, которые вы уже посмотрели. Затем вы просто запускаете существующий код на каждой странице, пока его не останется:

<?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;
   }
}

?>