![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
Итак - изрядно мучаясь родил - пока голову
![]() По завершении это будет поисковик с построением индекса и всякого такого для решения узкого круга задач. На данный момент есть только сборщик контента с сайта (нескольких) изначально от рекурсии пришлось отказаться - из-за того что скрипт отваливается на больших ресурсах. В процессе парсинг и индекс. Прошу указать на ошибки и недостатки в указанном ниже коде. А также советы и т.д. приму с благодарностью. код с некоторыми комментами.
|
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
trigger, построение поисковика, вполне незаурядная вещь, и решать ее возможно прийдется долго...
А вот специфичные сборщики контента меня сейчас сильно интересуют... но у Вас очень не оптимально это организовано ![]() Первое, в одном модуле не должно быть и функций работы с начальными урлами и функций бота... Как правило это разные сущности и даще разные программы... Поиск производиться демоном который крутит бота по всем линкам... А интерфейс с командами, и для управления поисковой машиной надо вынести... в другую подсистему. Потом не рационально считаю заносить весь контент сайта сразу в базу... надо сначала пропарсить и извлечь ключевые слова и понятия... и возможно избавиться от рекламного мусора и других не значащих тегов, иначе объем будет неоправданно велик... Парсить можно внешним модулем, который и должен уже заносить проиндексированные данные в базу... Эти вопросы бота не должны волновать, он должен быть параллельным и корректно отрабатывать ответы LWP, к примеру если сайт временно недоступен, не помечать его как пройденный, а отложить на потом... И заметтьте ожидание ответ по таймауту сжирают больше всего времени, поэтому распараллеливать нужно в обязательном порядке. Для этого думаю лучше всего подойдет POE. Ну а насчет запросов в базу данных, то у меня есть уровень абстрагирования от хранилища данных, и это правильно я уже забыл когда составлял запросы, все работает очень прозрачно ![]() Теперь по поводу поиска....есть много хороших поисковых машин которые ищут прям по базам, но это тоже не бязательно... не знаю зачем вам своя понадобилась... Поисковую я у себя думаю заюзать swish-e или какую другую, а для сбора контента вот бот мне и нужен... Я конечно описал свое виденье этого процесса, и вы вправе со мной не согласиться, но разделить ваш модуль на подзадачи считаю необходимо, чтобы позже абстрагироваться от конкретного парсера, или переписать сам бот, а парсеры контента не трогать.. это удобно и проще в сопровождении... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Я выскажусь по конкретной реализации. Долго писал, так что сообщение Nab`а ещё не читал.
К сожалению, не всего знаю (LWP::UserAgent, в частности), но что-то попытаюсь посоветовать. Замечания по get_links. Строка 119 - зачем foreach? Цикл ведь выполнится только один раз, переменную цикла ($_) не используем? Кстати, каково назначение этого цикла? Сформировать полный URL, если он был относительным? Я в замешательстве - зачем сверять с $url/, добавлять http в конец? Предлагается (о шаблоне подробнее ниже)
Теперь, что касается регвыров. Зачем нам мучать машину регвыров, если текст ссылки нам безразличен - нам нужен только открывающий тег, даже просто атрибут HREF. Поэтому, по частям,- m{ <\s* #Странно, я не видел тегов с пробелом после "<". Ну пусть будет. Квантификатор жадный - пробельные символы не съедят А - нечего бояться. Может, быстрее будет A [^>]*? #Здесь ленивая *, надо найти HREF HREF\s*=\s* ["']?([^>'"\s]+) #Собственно ссылка. Её не всегда заключают в кавычки (!). Квантификатор обязательно жадный (не то получатся ссылки вида "h" вместо "http://where.ru/") }sigx #Зачем модификатор m? Позиционированием ^ и $ мы не пользуемся. x - потому что с комментами ![]() Что касается того, что не нужны файлы вроде .avi, так их нужно привязывать к концу строки или к "?". Насчёт http://www.microsoft.com, если ссылку запишут буквально так, будет плохо. Так что вариант
То же к parse_for_links. Зараз ещё посмотрю, может, ещё попридираюсь ![]() |
||||
|
|||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Ну, стандарт не предусматривает теги с пробелом после "<", если, конечно, не создан свой како-то не стандартный парсер.
А, вообще, думаю, Perl для нормального поисковика не сгодится. Пиши, хотя бы, на Ц. |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
Спасибо за проявленое внимание - прочитаю вникну и чуток позже аргументирую некоторые действия
|
|||
|
||||
JAPH |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Не до конца разобрался с ролью БД. Конечная цель скрипта на данной стадии какая?
Если не трудно, можно показать структуру таблиц? Например, просто привести запрос, создающий нужные таблицы (всё равно он пригодится). А для чего sleep 20 в самом конце? Косметическая придирка: строки 58 и 59 - $row можно объявить в цикле:
Да, и ещё: строка 81 - зачем лишний раз $mark = 1? Он не меняется, пока управление не перейдёт к ветке else, то есть пока мы всё не обработаем. Вижу, очень часто встречаются строки типа 60ой. Может, глянуть в сторону bind_columns?
Да, кстати. А как будет себя вести этот скрипт, если встретятся циклические ссылки? Это сообщение отредактировал(а) JAPH - 18.1.2007, 23:41 |
||||||||||
|
|||||||||||
trigger |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
итак структура таблицы и щас объясню основную мысль в продолжении
по поводу POE - что это ? пару слов плз продолжение: задача - отслеживать появление новых документов в которых встречается интересующая тематика или чтото еще (одним словом событие). Также важна роль уникальности документа (политика и т.д.). А также настройка производится под чтото конкретное - ![]() ![]() Логика выбирается урл который нужно проверять (допустим пока 1) коннектимся - берем первую страницу 64-66 my $content = $resp->content(); и вытягиваем новые ссылки get_links() (в основном же на первой странице появляются новые ссылки) если есть они заносятся в базу (можно конечно и дать какоето колво ссылок для более уверенного сбора контента) далее по каждой ссылке забирается контент - опять get_content () заносим его в базу - замечания по использованию базы я принимаю ![]() parse_for_links() используется немного подругому чем get_links(). Задача parse_for_links() 1- экономия трафика 2- выбор техже самых ссылок из базы - там где статус=2 3- занести все найденные ссылки в таблицу со статусом=1 - откуда get_content () берет ссылку для забора контента. выбор url для забора контента и выбор контента с помошью parse_for_links() из базы производится по одному - что снижает нагрузку на железо у меня загрузка ЦП была на 65% еще в контру резался используя свойство уникальности поля url избегаем повторения одних и техже ссылок. Хотя идея и не моя - но как мне кажется - абсолютно логична - это была логика процесса. JAPH sleep 20 - просто чтоб увидеть слово DONE - потомучто приятно ![]() bind_columns - пошел читать my $double=$url."http"; встречается такое - ![]() расставляются полные ссылки - так вот так придумал как избежать ![]() -------------------------------------- Nab еще раз повторюсь - уж шипко загнул про поисковик ![]() по поводу неоптимальности - я изложил ложную суть - сорри - соглашусь с тем что криво до безобразия после ваших постов у меня такое ощущение что предоставленый мной код писало дитя зачатое во хмелю ![]() насколько я знаю бот ничего кроме ссылок грубо говоря не возращает - но блин жрет трафик - поэтому и база(пока) интерфейс с командами - согласен конечно - это на стадии тестирования парсер - да конечно - но это следующий этап. -------------------------------------- кстати: объястите плз - действительно волнует этот вопрос
Огромное спасибо за ваше внимание. Лишнее увидел и то что не предусмотрел. Это сообщение отредактировал(а) trigger - 19.1.2007, 01:40 |
||||
|
|||||
JAPH |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Хорошо, что привели инфу по таблицам, вопрос про циклические ссылки отпадает.
Что касается доменов типа .com Ссылки вида http://www.here.com/ (ссылкой сделано автоматически, ходить не надо ![]()
, так что они пропускаются. (Не говоря про то, что точки надо экранировать ![]() Надо отсеивать только эти расширения, а не имена доменов. Так что:
|
||||||
|
|||||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
ага понял
тогда что касаемо доменов как microsoft.com там редирект идет подскажите пожалуйста |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Только счас начинаю догадываться, к чему призвано это (см. код ниже). Скажите, правильны ли мои мысли
А, вообще, странно - ещё можно допустить, что полные ссылки (вида http://localhost/) пропускаются - ищем только по конкретному сайту. Здесь проверка сработает. Почему пропущены относительные ссылки (допустим, main.htm), не понятно. Ну хорошо, но только что мы в результате занесём в базу? Ссылку? Разве корректную? Насколько я понял, $url="http://site.ru/path/doc.html", к примеру (так она передаётся $ua->get в строке 65 -- если я здесь не прав, рассуждения дальше не имеют силы! Пошёл читать pod). Тогда при ссылке "/index.html", которая подразумевает файл "http://site.ru/index.html", $fool_url="http://site.ru/path/doc.html/index.html", причём все проверки будут пройдены! А вот get($url) в строке 104 её наверняка не съест. В общем, действительно все полные ссылки надо пропустить? --------------- что касаемо редиректа, как на это реагирует $ua->get()? Она возвратит статус 30x, означающий редирект? Счас почитаю, подправлю. |
|||
|
||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Sorry, по статусу редирект не распознать.
Просто выдаётся заголовок
------------- Всё проще.
Так что: если не нужно допускать редиректы, надо каким-то образом переопределить redirect_ok. Если нужно допускать (по умолчанию для запроса GET), то надо корректировать результирующий URL, см. pod для HTTP::Response, про $r->base. |
||||
|
|||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
trigger, По поводу POE.
Штучка позволяет организовывать многопоточность. Здесь находится описание и инфа на английском языке P.S. слажал Это сообщение отредактировал(а) shamber - 19.1.2007, 13:46 |
|||
|
||||
trigger |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
первый этап
второй этап
строки 63-72
Добавлено @ 12:56 shamber огромное спасибо - пошел читать JAPH я понял нимного огромное спасибо - пошел вникать. к логике замечаний нет? ![]() да кстати в таблице pull отсутствует temp_content - колонка для полного контента Это сообщение отредактировал(а) trigger - 19.1.2007, 13:01 |
||||||
|
|||||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
shamber, моя опера по этой ссылке выдаёт "Невозможно найти удалённый сервер". Что-то тут не то.
|
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
JAPH, Исправил..... com и org перепутал
Это сообщение отредактировал(а) shamber - 19.1.2007, 13:50 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |