Автоматическое хождение скрипта по сайту

lemuria

Новичок
Автоматическое хождение скрипта по сайту

Хочу сделать скрипт, который заходит на определенный сайт, сканирует
его на предмет ссылок, затем переходит по каждой ссылке, и там тоже ищет ссылки, и так
пока не пройдет все ссылки на здананом сайте.
На данный момент я смог сделать только так, что скрипт заходит на заданный сайт и ищет там ссылки, но только в пределах одной страницы.
И дальше нникуда не идет :(
Подскажите пожалуйста, буду очень благодарен.
 
Если сейчас он правильно нашел ссылки на первой странице, то пусть берет эти ссылки по порядку и делает с ними то же что и с первой. Где-то результат надо хранить (в базе), адрес страницы, полезные заголовки сервера, время загрузки и возможно сам контент. Таким образом скрипт будет знать что и когда он загрузил. Потом можешь генерировать карту для google или еще что полезное сделать.
 

lemuria

Новичок
Вот что я смог написать на данный момент:
$cont = file_get_contents("http://localhost/45/test.htm");
preg_match_all("!<a.*?href=\"?'?([^ \"'>]+)\"?'?.*?>(.*?)</a>!is", $cont, $out);
$t= count($out[1]);
for($i=0; $i<$t; $i++)
{
$cont1 = file_get_contents($out[1][$i]);
preg_match_all("!<a.*?href=\"?'?([^ \"'>]+)\"?'?.*?>(.*?)</a>!is", $cont1, $out2);

echo $i;
}
?>
Я не могу до конца представить сам процесс: с главной страниы получил список(массив) ссылок, берет из этого списка первую, сканирует ее на предмет других ссылок, находит... А дальше что - я представляю смутно...
 

Фанат

oncle terrible
Команда форума
то же самое он делает. считывает, получает и ходит
ты слышал о таком слове - рекурсия?
 

lemuria

Новичок
Слышал... Это вроде обращение функции к само себе.
Только как это можно применить тут.
 

Фанат

oncle terrible
Команда форума
Включи голову.
Ты прекрасно всё сам понимаешь и можешь сделать.
но не хочешь думать.
Давай, займись, сделай хоть как-нибудь. Начнёшь делсть и сам всё увидишь
 

lemuria

Новичок
Включив голову, я наваял вот такое нечто:
<form action="<? echo $_SERVER['PHP_SELF'];?>" method=post>
<input name=url><br>
<input type=submit>
</form>
<?php
$url = $HTTP_POST_VARS['url'];
function getlinks($url)
{
$cont = file_get_contents($url);
preg_match_all("!<a.*?href=\"?'?([^ \"'>]+)\"?'?.*?>(.*?)</a>!is", $cont, $out);
$t = count($out[1]);
for ($i=0; $i<$t; $i++)
{
getlinks($out[1][$i]);
echo $out[1][$i];
}
}
getlinks($url);
?>
При запуске, ничего кроме замечания о том что не назначена переменная url не выдает, ни ошибок, ни результатов...
В чем же дело?
 

Gorynych

Посетитель PHP-Клуба
lemuria

канонический пример рекурсии - вычисление факториала
Код:
function fact($n) {
    if ( $n < 0 ) return false;

    if ($n == 1 || $n == 0) {
        return 1;
    } else {
        return $n * fact($n-1);
    }

}
echo fact(12);
Включив голову, я наваял вот такое нечто
э... точно включил голову? Ты предполагаешь, что скрипт за время ожидания ответа (условно-стабильно это 30 сек.) успеет обойти все страницы и вычитать все ссылки, начиная с указанного url'а?

ну допустим, сам сам сайт страничек из двух трех...

а теперь "шутка номер 1" представь, что на странице есть ссылка на... счетчик (ух, как неожиданно!) и по ней скрипт переходит (барабанная дробь!) ... на тот же Рамблер. Вот весело будет, да?
 

Gorynych

Посетитель PHP-Клуба
Ром, ты думаешь что у него априори нет внешних ссылок? Или что эта задачка и вправду подходит для того, чтобы скрипт отрабатывал ее за 30 традиционных секунд?

че-то у меня аналогичная программа работала несколько иначе :)
 

Фанат

oncle terrible
Команда форума
я думаю, что у него на локалхосте тестовая страница с максимум двумя ссылками.
и хорошо бы ему сначала разобраться ХОТЯ БЫ с ней, на забивая голову внешими линками и прочей лабудой.

когда у него ДЕЙСТВИТЕЛЬНО заткнётся от недостатка времени, он будет хотя бы уверен, что алгоритм работает.
 

lemuria

Новичок
Да, Вы правы на локалхосте у меня страничка с 5 ссылками. Буду читать ФАК ;)
 

Фанат

oncle terrible
Команда форума
да читать-то там не надо.
надо просто понимать основные принципы отладки, и главное правило - глазами программы не отлаживают. их надо запускать.
 

Gorynych

Посетитель PHP-Клуба
Фанат
угу.

тогда скажем так: при первом обращении к скрипту пременная $url не инициализирована, потому как никаких данных методом POST не было предано.

во-вторых, пошлем человека по ссылкам:

- http://phpfaq.ru/globals
и
- http://www.php.net/manual/ru/language.variables.predefined.php

и будем его умолять попробовать вникнуть в весь этот кошмар с версионной зависимостью имен предопределенных переменных и массивов и проклятым register_globals.

честно говоря, мне упорно кажется, что человеку не пережившему смены нескольких версий понять эту котовасию очень не легко :)

--

но! Я сильно опасаюсь, что все это хорошо для изучения языка, но плохо с точки зрения конечной цели и задачи. Потому что алгоритм применимый в рамках трехстраничного сайта без внешних ссылок - это не решение нужной задачи. И потом человек придет и скажет: "а почему у меня все на локальном сервере работает, а на боевом нет? Где ошибка?"

а куча милых и доброжелательных постоянных посетителей будет над ним тупо ржать и писать идиотские ответы типа "ошибка в ДНК" и т.п.

P.S. ну вот, опять "Остапа понесло" :)
 
Сверху