![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| DimaSiK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 390 Регистрация: 20.8.2006 Репутация: нет Всего: нет |
Есть задача: написать парсер нескольких сайтов.Загвоздка состоит в том, что можно и нужно придумать для того, чтобы парсер не зациклился на ссылках одной страницы, тоесть знал когда ему нужно прикратить парсить данный сайт и переходить на другой?. Может ввести лимиты на найденные ссылки, или же проверять новую ссылку на предмет того, что она уже была найдена?
-------------------- Мы не стараемся быть первыми, мы стараемся быть лучшими. |
|||
|
||||
| Alex13 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 280 Регистрация: 30.12.2005 Где: Новосибирск Репутация: нет Всего: 1 |
DimaSiK, вы сами назвали выходы, причем, ИМХО, последний - самый разумный. В чем же проблема?
-------------------- Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий. Антисоциальный блог. |
|||
|
||||
| DimaSiK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 390 Регистрация: 20.8.2006 Репутация: нет Всего: нет |
Я понимаю что они верные, но помоему последняя кажется мне очень трудоемкой для скрипта, постоянно делать прохождение по найденным, это же сколько вермени необходимо будет
-------------------- Мы не стараемся быть первыми, мы стараемся быть лучшими. |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Вот что первое приходит на ум:
1. Заходишь на главную страницу (находишь все ссылки в html-коде), кладешь ссылки во временную таблицу БД или файл куда удобнее с пометкой что они не прочитаны. 2. Парсишь эту страницу(главную), читаешь текст, ну и делаешь что ты задумал с контентом. Помечаешь страницу во временном хранилище как прочитанную. 3. Далее заходишь на непрочитанные страницы из временного хранилища, и выполняешь пункт 1 затем пункт 2. Единственное что: 1. Аккуратно распознавай ссылки (т.е. не забудь преобразовывать url-ы к единому стилю), я имею ввиду относительные ссылки и абсолютные. 2. Лучше сделать проверку на максимально возможное кол-во страниц, т.к. написать нормальное распознование сходства довольно сложно, а на некоторых сайта генерируются различные адреса ссылок на одну и туже страницу. 3. Я считаю самое существенное, данный скрипт написанный на php вполне может отвалиться из-за ограничения времени на выполнения скрипта. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| DimaSiK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 390 Регистрация: 20.8.2006 Репутация: нет Всего: нет |
Про ограничение было понятно сразу, но это пока меня не волнует, главное сделать задание. Как думаешь орагнизовать логику лучше будет с БД или же просто хранить в переменных все данные?. Еще вопрос, лучше сразу все ссылки собрать, а потом начать парсить или собирать и парсить?
-------------------- Мы не стараемся быть первыми, мы стараемся быть лучшими. |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
1. Я думаю лучше будет собирать и парсить
2. Думаю лучше будет с БД организовать, чтобы можно было разделять индексацию сайта на этапы. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| -=Ustas=- |
|
||||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Лучше в БД, потому что если сайт будет достаточно большим, то твой скрипт вывалится на memory_limit.
Я писал себе такого паука, просто set_time_limit( 0 ) ставим и все. Он у меня сайт с более 50-ти тыс. страниц обрабатывал часа за полтора-два. Правда он у меня работает как консольное приложение. Могу подкинуть ;) -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
||||
|
|||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Было бы интересно посмотреть Если как консольное приложение, то это нормально... А если даже через крон запускать, то довольно запарно будет... -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| DimaSiK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 390 Регистрация: 20.8.2006 Репутация: нет Всего: нет |
можешь и мне кинуть на [email protected] Это сообщение отредактировал(а) DimaSiK - 31.1.2007, 18:30 -------------------- Мы не стараемся быть первыми, мы стараемся быть лучшими. |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Вот освободился, как и обещал, выложу свого паука. Опишу его запуск.
1. Создаем следующие таблицы:
Далее создаем файлик, например sidx.robot.class.php, запихиваем в него данный класс: Это сообщение отредактировал(а) -=Ustas=- - 2.2.2007, 22:01 -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Далее создаем файлик sidx.robot.class.php, запихиваем в него данный класс:
Первая часть класса (в одном посте не позволяет выложить весь) :
Это сообщение отредактировал(а) -=Ustas=- - 3.2.2007, 12:57 -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Вторая чать класса (соединить в первой, опять не пропускает):
-------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
И последняя часть ( присоединить ко второй ):
Это сообщение отредактировал(а) -=Ustas=- - 2.2.2007, 22:36 -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| -=Ustas=- |
|
||||||||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Затем, создаем файлик run.robot.php, у которого содежание примерно следующее:
Надо обязательно взять вызовы экземпляра объекта в try {} catch {} , т.е. класс при фатальных ошибках выкидывает исключения. далее настойка идет через очень простой и понятный интерфейс:
Можно его полностью запусти в интерактивном режиме ;)
Результатом дружественного интерфейса будет примерно следующее:
Короче код я снабдил оч. понятными комментами, так что если хотите, то разберетесь Это сообщение отредактировал(а) -=Ustas=- - 2.2.2007, 22:40 -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
||||||||
|
|||||||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
В общем, смотрите. Формат запуска: php -f run.robot.php
-------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |