Как последовательно обойти все страницы сайта

Тема в разделе "PHP", создана пользователем verfaa, 19 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Привет. Есть сайт с большим количеством страниц - ок. 1000
    Необходимо зайти скриптом на каждую страничку сайта и совершить какое-то действие, например спарсить кусок контента регуляркой.
    Т.е.:

    Подключаемся к сайту.
    Заходим на страницу.
    Парсим и сохраняем контент в переменную
    Переходим на другую страницу.
    Парсим и сохраняем контент в переменную

    и так все страницы. Также необходимо обеспечить, чтобы одна и таже страничка не обрабатывалась дважды.
    Буду благодарен за примеры кода с комментариями.
     
  2. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Надо составлять дерево сайта. То есть, зашли на главную страницу, добавили главную страницу в вершину деревва, далее ищем все ссылки на странице, которые ведут на этот же сайт, и которых еще нет в дереве, от этой вершины строим дочерние ветви - наши новые ссылки. Потом переходим по очереди на какждую ссылку (ветвь дерева) и повторям алгоритм.

    P.S. если на сайте есть карта ресурса, то можно схитрить, и просто спарсить все ссылки с нее.
     
  3. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Нет, карты на сайте нет. Вот составить дерево сайта для меня и составляет трудность. Что-то не могу понять, как можно составить дерево сайта средствами пхп. Прошу помочь с кодом.
    А если бы у меня был бы список всех страниц сайта, то я бы циклом каждую страничку обошёл сделал то что мне нужно было бы.
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    Алгоритм примерно таков:
    Я бы создал 2 массива
    в один, назовем его link, все линки(ссылки), во второй (http_request) код ответа сервера или статус загруженности линка.
    PHP:
    $link[0]="http://site.ru";
    $i 0//- текущая ссылка
    Потом через
    PHP:
    while (count($link) > $i ) {
    загрузить страницу с link[$i], присвоить статус http_request[$i], парсить ссылки, приводить их к виду http://site.ru/***, проверять на принадлежность данному сайту и если ссылки еще нет в массиве link добавить её к массиву.
    В конце можно пробежатся по http_request и еще раз попробовать загрузить то что не загрузилось из-за багов сервера (503 и иже с ним)
     
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    например скачать с wget весь сайт
    PHP:
    $p shell_exec('wget --wait=20 --limit-rate=20K -r -b -P/home/sitedump -U Mozilla https://www.nulled.cc');
    http://ru.wikipedia.org/wiki/Wget

    и потом распарсить все файлы
     
  7. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Самый простой способ это использовать прогу для создания карты сайта или онлайн сервис. Так получишь все линки, далее думаю понятно. Скармливаешь линк скрипту и он делает все нужные тебе действия
     
  8. propovednik

    propovednik Постоялец

    Регистр.:
    16 май 2008
    Сообщения:
    104
    Симпатии:
    21
    Если сайт индексируется и страниц меньше 500, то можно доверится например гуглу - site:sitename.com - и получить список ссылок с него, которые затем скормить твоему скрипту
     
  9. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Бредовый вариант. Для этого нужно знать что гугл проиндексировал все страницы, или тогда с уверенностью что ты изменяешь все нужные тебе файлы можно попрощаться
     
  10. Google.com

    Google.com Читатель

    Заблокирован
    Регистр.:
    16 фев 2010
    Сообщения:
    250
    Симпатии:
    295
Статус темы:
Закрыта.