Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Теория написания парсера всего сайта
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Всем привет!
Собственно есть задача написать свой парсер всего сайта с 0. Готовые библиотеки не подходят. Собственно для практики, в хоте работы выложу на форум код.
Изначально ставим такую задачу, бот должен обойти весь сайт, все страницы (любой вложенности, кроме внешних ссылок) и убедиться что они все работают. (Тоесть такая страница есть и она работает без ошибки,например 404).
К примеру во всех рабочих страницах у нас будет <div id="content">(*)</div>
Тоесть если на странице у нас есть <div id="content">(*)</div>, то мы должны присвоить ей статус OK
Теперь варианты, собственно:
Вариант 1.
Переходим на указанный урл (например site.ru), проверяем есть ли контент, есть ок, ставим статус OK, далее ищем первую внутреннюю ссылку(например site.ru/new/), проверяем ее тп. Тут вижу проблему рекурсии, тоесть если на главной странице 2 или более ссылок, мы попадаем на 1 и уходим в глубь сайта, как можно вернуться назад ?
Вариант 2
Чуть более затратный по времени.
Функция 1, парсит урл site.ru, находит все ссылки которые есть на странице и помещает их в массив. Далее берем 1 ссылку из массива, переходи на нее, и добавляем в массив все ссылки, которые есть на странице 2 (все ссылки кроме уже существующих).
В результате чего на выходе получаем весь массив ссылок сайта. И уже в цикле быстренько прогоняемся по ним.
Собственно подскажите пожалуйста лучший вариант или может есть еще 3 ?
делаем что нам нужно записываем в массив, далее из этого массива идем
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
большое спасибо, однако по условию я не могу использовать чужой код.
Нужна только идея как пройтись по всем ссылкам любой вложенности, например:
главная
- новости
--1 новость
--- автор Вася
---- мама Васи
- контакты
-- карта проезда
--- офис
---- этаж офиса
----- туалет на этаже офиса
------ сливной бачек в туалете
------- вода сливного бочка в туалете
- реклама
-- прайс лист
тоесть нужно пройтись по всем ссылкам сайта любой вложенности. Как я понял у Вас тут парсится главная и 2 вложенность
armancho7777777
Отправлено: 18 Октября, 2013 - 13:59:26
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Но все равно код реализации Вашей задачи, nepster, будет выполняться долго.
Если только ajax'ом обращаться к каждому из адресов, параллельно по 10 запросов. (Добавление)
nepster пишет:
я не могу использовать чужой код.
Он мой.
Используйте на здоровье. (Добавление)
nepster пишет:
Нужна только идея как пройтись по всем ссылкам любой вложенности
Рекурсивно используя функцию, которую я написал.
Но это будет долго.
Реализуйте это в купе с ajax'ом. (Добавление)
+ записывайте в массив уже отработанные адреса. (Добавление)
nepster пишет:
Как я понял у Вас тут парсится главная и 2 вложенность
У меня ?
Только главная.
DelphinPRO
Отправлено: 18 Октября, 2013 - 14:08:28
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
armancho7777777
ваш код учитывает перекрестные ссылки между страницами? Когда первая ссылается на вторую, вторая на третью, третья на первую. Здесь есть потенциальная опастность зацикливания.
Я решил проблему "в лоб" - глобальный массив с посещенными ссылками. (Добавление)
nepster пишет:
я не могу использовать чужой код.
так и не используйте черпайте идеи оттуда.
----- Чем больше узнаю, тем больше я не знаю.
armancho7777777
Отправлено: 18 Октября, 2013 - 14:15:25
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
DelphinPRO пишет:
ваш код учитывает перекрестные ссылки между страницами?
Мой код ни делает ничеого.
Я написал только функцию получения внутренних ссылок.
А ниже, небольшой пример.
Дальше ТС сам догонит что делать. (Добавление)
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
в принципе скорость выполнения на данном этапе не очень важна.
Имеется введу я не могу использовать Ваш код, так как это тестовое задание.
Тогда я пожертвую скоростью:
я сделаю реализацию в 2 этапа.
1) я соберу массив всех внутренних ссылок сайта. Буду помещать их в массив с проверкой на уникальность, тоесть ссылки которые уже есть в массиве не продублируются.
2) второй этап уже буду парсить каждую ссылку из того массива на собственные нужды.
Я потеряю скорость, но все же будет красиво все работать. Как вам такой вариант ?
armancho7777777
Отправлено: 18 Октября, 2013 - 14:56:39
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Реализовал вот так вот. Собственно на данном этапе пока все работает, но еще суховато. Оцените первоначальный этап пожалуйста
armancho7777777
Отправлено: 19 Октября, 2013 - 01:11:24
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Я не проверял ничего.
В глаза попалось объявление свойств через "var".
Этот синтаксис устарел.
Используйте модификаторы доступа: public, protected, private. (Добавление)
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
спасибо, я как то забыл про var.
Я доделаю еще пару моментов и сброшу в файлах ля простого просмотра. Так же если кому понадобится можно будет браться. Пока по скорости не впечатляет, 322 ссылки более 30 секунд.
nepster
Отправлено: 19 Октября, 2013 - 23:14:53
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Если что то забыл, для удобства выкладываю все в архиве.
Теперь мы умеем идти на сайт, собирать кол-во ссылок с сайта, считать изображения, обпередлять код страницы и все это записывать в файл.
Снова жду ваших комментариев и продолжаю работать над обходом всего сайта
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.