![]() |
Модераторы: 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 |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Ух ты! Рискнул, запустил, работает!!!
Только вот появились вопросы: 1. что такое code, size, begin, end_p в таблице pull? В них 0 и всё. 2. чё-то у меня не заработал $ua->get. Так что строки 65 и 104 заменились на
Пока что тестирование получилось неполным, поскольку подопытный сайт содержит только одну абсолютную ссылку, остальные относительные ![]() ![]() После создания относительных будет главный тест - на "скрипты с хвостом". С разными хвостами. Их проходить все поголовно или как-то отсеивать (UNIQUE тут уже не поможет)? ![]() ![]() -------------------- perldoc perlstyle Это сообщение отредактировал(а) JAPH - 19.1.2007, 15:13 |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
однозначно - потому как в основном это ссылки на другие сайты а в некоторых случаях и на внутренние - ну а внутренние мы итак найдем непонял вопроса
ну а это для работы - другие параметры даты размеры ответы JAPH кстати можно глянуть на то что вы с правками внесли ато пока нет времени добраться до того что я написал и внести правки? |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Хм, странно. Представить не могу, как относительная ссылка (вроде "lib/main.php?page=4") приведёт на другой сайт.
![]() Хвостом я назвал параметры в URI - всё, начиная с "?" включительно. Пока вот что получилось:
Это сообщение отредактировал(а) JAPH - 19.1.2007, 17:29 |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
я чето ступил имел ввиду то что чужие урлы откидывать и внутренние но полные "?" кажеца съедал все ссылки - тока не помню где тестил За примерчик спасибо prepare - кажеца строка добавляется , но используя do добавляется две ![]() пока буду причесывать и доделывать логику - например стоилобы допустим проверять ответ по какойто следующей ссылке - вдруг битая ![]() и подумаю над алгоритмом сбора редиректов - интересно капец - но уже дома |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
извиняюсь за бред.
я понял о чем речь относительно "?" действительно это станет проблемой в случаях подмены контента по url-у и тогда документ утратит свою уникальную ссылку что не редко встречается взять даже fishki.net придется поломать голову хотя должен же быть какойто алгоритм - узнаю. |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Реализовал поддержку относительных ссылок. Скрипт стал короче на 13 строк
![]() Но
![]()
Это сообщение отредактировал(а) JAPH - 19.1.2007, 21:12 |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
поясните пожалуйста следующие строки на пальцах.
как работает смещение - не врублюсь чета?
относительно жуков: глотает ссылки типа ../main.html ../dor/main.html ../../dor/main.html потом как пример есть и такое: есть домен http://somehost/ http://somehost/data/main.html - сюда приводит редирект http://somehost/data/wheather.html - реальная страница(раздел) - забирается в базу но в тотже момент - http://somehost/wheather.html тоже туда попадает - и статус 4 ей обеспечен |
|||
|
||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Работает он с ними корректно, проблемы начнутся, когда в документах есть ссылки друг на друга вроде pages/p1.html и ../index.html. Он будет бесконечно по ним бегать. Поэтому надо убирать такие ссылки. Добавьте после выделенного вами участка (строки 66-70)
Что касается самих этих строк, то работают они так: $fool_url до них имеет вид либо "pages/p1.html", либо "/site/index.html". Поэтому различить относительные и абсолютные ссылки можно по первому символу, что и делает строка 66. Далее, если это абсолютная ссылка, то к ней нужно присобачить только имя сайта без завершающего слэша (http://somesite). Поэтому к URL применяется ^http://.*?/ Работает он так: сначала отыскивается http://, затем .*? лениво цепляет к найденному по одному символу до тех пор, пока не удастся дойти до слэша. Как только находится слэш, поиск успешно завершается. Он всегда успешен, так как в URL всегда хотя бы 3 слэша. Далее, из найденного ^(http://.*?)/ выделяет имя сайта без завершающего слэша; поиск производится в списковом контексте, (m{^(http://.*?)/}), поэтому возвращается список вроде ("http://somesite"), из которого выделяется найденная строка (m{^(http://.*?)/})[0], чтоб её присоединить к fool_url. Если ссылка относительная, то делается ^(http://.*/), что приводит к тому, что сначала отыскивается http://, затем .* жадно съедает весь остаток строки, затем "маленькая машинка" видит, что нужен слэш, но от строки ничего не осталось; поэтому звёздочку заставляют отдавать по одному символу до тех пор, пока не удастся "выбить" слэш. Так что совпадение будет примерно таким - "http://somesite/path/" или "http://somesite/". Найденное по тому же принципу присоединяется к fool_url. Теперь, что касается последнего примера. Поподробнее можно? Какие ссылки были в документах, на которых вы тестировали? ![]() Что выводил скрипт? Это сообщение отредактировал(а) JAPH - 21.1.2007, 09:26 |
||||
|
|||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Получилось воссоздать ошибку при редиректах. Подправил get_content, теперь вроде нормально. Смотрим:
|
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Некоторые скрипты вполне могут уходить в бесконечный цикл, так что получить контент от них возможно дня через три
![]() Получилось упростить логику работы скрипта. Кстати, то, что главная страница не сохраняется в pull.temp_content, это так надо? Полная версия:
|
|||
|
||||
trigger |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
приветствую JAPH
такова была лоогика в самом начале - выдрать с первой все ссылки и занести в базу- а потом цыклический обход каждой и сбор контента в этот момент получалось что когда формировались ссылки конкатенацией основного url сайта с тем что сохранялось в $1 - вот и получалась что первая страница (ссылка) готова и на втором этапе из нее брался контент - тоесть относительно игнорировалось содержимое первой страницы- при первом заходе интересовали только новые ссылки. теперь что касается предыдущего вопроса
как пример брался www.korrespondent.net - хотя я не проверял сейчас работу скрипта то может это уже не актуально ? |
||||
|
|||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Но ведь не зря контент всех остальных страниц сохраняется? Наверняка потом из него будет выдёргиваться нечто, чтоб помещать в другие таблицы. А главная чем хуже?
Скрипт уже адекватно реагирует на редиректы (надеюсь). Проверьте ![]() |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
хм - вот тут редирект не поймал
![]() www.umj.com.ua Enter your command: check www.umj.com.ua/:500 read timeout www.umj.com.ua/arhiv/56/index.php
первая важна только ссылками на новое я уже упоминал ранее - первая используется как топ всех разделов в основном и информативность ее практически нулевая а ссылки содержашиееся в ней на новые документы - вот что интересует прежде всего - даже при повторном запуске скрипта - сначала из нее забираются новые ссылки но апдейт не производится. хотя если не прав - поправьте меня Это сообщение отредактировал(а) trigger - 21.1.2007, 17:44 |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Обычно на первой странице в заголовках, кратких описаниях и т.п. говорится, о чём сайт в целом, так что там много терминов, ключевых слов, про которые рассказывает сайт.
По поводу ошибки с редиректом - ну не стал скрипт ждать, пока ему отдадут страницу. Увеличьте время таймаута в строке 29 до 5 секунд (стандартное). ======== Плюс ко всему, у меня нет возможности тестировать скрипт на файлах из интернета - доступ платный. Так что я надеюсь на вас, чтоб вы проверяли его работоспособность в реальных условиях, а также, при ошибках, приводили хотя бы релевантный html-код страниц, если исходный php/... недоступен. Я по этим данным пытаюсь воспроизвести ошибку на локалхосте, и уже в домашних условиях лечу скрипт. Кстати, выводы-то поставлены специально, чтоб понимать, где ошибка. Скрипт же вывел - read timeout! ![]() Это сообщение отредактировал(а) JAPH - 21.1.2007, 18:33 |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Люди, а не вилосипед ли делаете (с извлечением ссылок), модули для того и пишутся...
к примеру HTML::LinkExtor ( HTML::LinkExtractor ) HTML::TokeParser HTML::Tagset Можно и др. парсеры найти ;) (пакет HTML::Parser) |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
первая страница в любом случае берется тем более что это не столь важно что там в title и keyword. по поводу трафика я уже съел его весь ![]() nitr да виласипет ну и что ![]() грабер - сделал но кривовато вот JAPH (Just another perl hacker) и подключился - может ему самому интересно Это сообщение отредактировал(а) trigger - 21.1.2007, 22:23 |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
=for offtop
nitr, ну предложите не велосипед. За что народ ни берётся - всё уже сделано до нас. Так всякую охоту что-либо делать отобьёте. Кроме того, то, что написано собственноручно, просто и понятно. А вот попробуйте растолковать, что да зачем в этих модулях делается? Вот меня интересует вопрос - как DBI.PM умудряется обмениваться данными с MySQL, где конкретно это происходит? (Может, создать отдельную тему, расскажете?) trigger, it's really interesting. Всё жду, когда предложите, что делать с параметрами. Так и оставить, пусть бегает по всевозможным ссылкам? Или ограничиться одной такой? Была бы возможность просто стащить исходный код такого скрипта, да вот только не получится. |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
JAPH, dbi.perl.org, а работает он по средствам "драйверов" (DBD).
Открой модуль - прочти ![]() Я ж не против того чем вы заняты. Это совет! Думаю неплохой ;) Добавлено @ 23:25
Не хорошо думаете ;) Просто я прочёл про перекрестные ссылки у вас выше ![]() з.ы.: Не буду более вам мешать. моё дело посоветовать решение проблемы (в случае ссылок), ну а ваше... |
||||
|
|||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Вот как много написали...
![]() Читаю и удивляюсь.... Я думал это так, для изучения возможностей и собственного образования занимаетесь, а вы просто CPAN боитесь ![]() Если нет способности, или желания разобраться что делает чужой модуль то вы так и будет поделки на коленке клепать... Хотя спрос и на такие поделки есть, точно знаю... Но по крайней мере глупо игнорировать миллионы человеко-часов потраченные на разработку модулей... Когда у вас будет серьезный проект для которого необходимо будет решение целой кучи задач очень разных, то написание всего на pure Perl, без использования модулей отобъет у заказчика желание дожидаться результата ![]() Кстати а зачем вы испльзуете LWP? почему не работаете на прямую с сокетами? Я вот знаю nitr этим страдает ![]() А в вашем случае я бы забил на правильное извлечение адресов, и воспользовался бы одним из приведенных модулей, а больше бы сосредоточился на правильной структуре приложения и алгоритму прохода по этим ссылкам... чтобы таки не было цикличности и т.д. -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Именно, да и ещё занимаются продвижением смоих модулей, поддержкой. И есть люди помогающие им и т.п. Извините, если посчитали оффтопом.
Да, но к сожалению. В принципе можно использовать HTTP::Response, HTTP::Request и URI::* В таких случаях я пиши своё. Ну или так называемые надработки ![]() З.Ы.: Всё на это мой совет исчерпан ![]() |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Nab, я, конечно, согласен, что игнорировать CPAN не стоит, но это когда действительно нужно будет сделать нечто ограниченное по времени. А пока программирование есть хобби, имхо можно и позаниматься "велостроительством".
|
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
![]() 1.если знать только модули (не спорю нужны) а не знать как работает - далеко уйдем ? 2. никто ничего не продвигает сдесь
может стоит обидется ? 3. советы дельные спасибо конечно вот истина не думаю что ктото из вас не начинал делать велосипеды - а только через месяц нашли модуль который решает нужную задачу. Былобы великодушно с Вашей стороны уважаемые критики (осмелюсь назвать вас ГУРУ) подсказать стоящий с вашей точки зрения алгоритм(ы) и методы его осуществления. если взять алгоритм который я брал вначале - то я не думаю что он не имеет права на существование - он достаточно прост и экономен, а вот методы которые я выбрал - действительно кривые такчто слушаим Вас..... ![]() JAPH не понимаю зачем это нужно можно в цикле проходить каждый сайт по очереди и каждый раз заносить первую страницу незачем ругается сюда на синтакс SQL при заносе контента $sth -> execute($req -> content(), $req -> base(), $id) я еще так не тестил сирозно но скрипт отваливается - сори нет времени пока посмотреть - понедельниг оказался тижолым |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Господи... trigger, расставьте хоть точки в конце каждой мысли! Я так и не понял, что вы имели в виду, говоря
Что такое ЭТО? Хоть бы упомянули, о чём речь... Почему "каждый раз"? Всего один запрос. MySQL его единожды обработает, и никакого цикла не надо. Если можно без цикла, лучше, быстрее, красивее без него. Тем более порядок обхода сайтов не очень-то важен - что сначала все с одного домена, затем с другого, что вперемешку,- всё равно в базе хранится "оптимизированно", т.е. вразброс. Извлекать потом можно по очереди, главную страницу не учитывать (хотя на странице "Ссылки"/"Контакты" тоже не очень-то много полезной информации, но она спокойно забирается и не вызывает возражений ![]() Что касается ошибки с синтаксисом SQL. Не удалось воспроизвести. ![]() ![]() ![]() ![]() =begin offtop А смысл? Лучше не надо - будем консультироваться по стандартным модулям ![]() ![]() Но параллельно писать свои ![]() И называть так же, как стандартные - чтоб никто потом не догадался! ![]() =end offtop |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
да с точками и запятыми не сложилось
![]() сначала что непонятно: 1. строка $dbh -> do("INSERT IGNORE INTO pull(sitesID, url, status) SELECT `ID`, `url`, 1 FROM sites"); #Пересылаем нужные сайты в таблицу pull, помечая ссылки на их главные страницы статусом 1 Я не могу понять зачем это делать? 1. в таблице pull колонка url имеет UNIQUE атрибут и при добавлении каждый раз одной и тойже ссылки (например http://localhost/) скорее будет выдаваться ошибка или запись проигнорируется (щас сажусь тестить). поясню как было задумано по действиям. 1. делаем выбор что делать (в данном случае check) выбираем допустим один url из таблицы sites проверяем связь с ресурсом а не с базой если связь есть - забираем контент и парсим на ссылки. Выбрав все ссылки заносим их в базу (там уже находится http://localhost/) первая страница и все остальные. потом каждая выбирается и берется контент по каждой ссылке. Предположим у нас проиндексирована часть сайта - ну просто устали ждать. и при повторном запуске скрипта делаем INSERT IGNORE INTO pull(sitesID, url, status) - база их проигнорирует из-за UNIQUE и возможно выдаст ошибку. итак - что и куда ругается (щас добавлю) отправил в приват - чтоб не мусорить тут Это сообщение отредактировал(а) trigger - 23.1.2007, 03:35 |
|||
|
||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Понял, в чём проблема - два редиректа на один и тот же ресурс. Надо дописать:
Так, если неудачно выполняется execute (ошибка duplicate key), эта запись удаляется. Для корректной работы надо в соединении с базой убрать RaiseError => 1. Описанный вами check-алгоритм как раз и реализуется, только в исходном варианте это было прописано явно, а сейчас это уже труднее заметить. Почему делается INSERT-SELECT? Потому что изначально предполагается, что сайтами-кандидатами на обыск заполнена только таблица sites, pull при этом пустая. Этот запрос переводит все эти записи в pull, как если бы у нас была страничка из ссылок на нужные сайты. Проверка на связь с ресурсом, при успехе проход по всем страницам сайта? Проверка идёт, когда из базы выбирается ссылка на этот сайт, занесённая из sites. Если что-то не получилось - нет связи, сервер перегружен, ленивый сервер,...,- то скрипт об этом напишет, пометит ссылку (фактически, целый сайт) статусом 4 и спокойно пойдёт работать с другими сайтами. Остальное должно быть понятно - оно почти не изменилось. Кстати, надо бы подумать, в какой момент возвращаться к строкам статуса 4 и возвращать им статус 1. Может, делать их статус = номеру ошибки? (403, 404, 500) Ещё одно. Как насчёт ссылок вроде "#top"? Моё предложение - удалять такие хвосты.
|
||||
|
|||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
ок щас подставлю и запускаю - огромное спасибо.
Есть предложение! Во избежание ненужного разростание данной ветки переходить в приват... |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Понял, в чём проблема - два редиректа на один и тот же ресурс. Надо в запрос вставить IGNORE. Проверьте, поможет ли.
Описанный вами check-алгоритм как раз и реализуется, только в исходном варианте это было прописано явно, а сейчас это уже труднее заметить. Почему делается INSERT-SELECT? Потому что изначально предполагается, что сайтами-кандидатами на обыск заполнена только таблица sites, pull при этом пустая. Этот запрос переводит все эти записи в pull, как Всё это игнорируем. Не могу понять, как это сообщение появилось, когда меня не было в интернете ![]() Это сообщение отредактировал(а) JAPH - 24.1.2007, 19:42 |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
я понял все прекрасно.
скрипт работает - запустил час назад. пока не отвалился ![]() Это сообщение отредактировал(а) trigger - 23.1.2007, 11:48 |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
ээээээээээээээээээээээ ... Ну в общем пока все замечательно - тестировал
для начала на малом проекте - 1700 документов - битые ссылки отловились - заодно и поправились ![]() Что касаемо более больших проектов - 3 000 и 15 000 документов проглотил нормально ну а остальные надоело ждать ![]() осталось только нормально проверить его на отношение к миру - дома начну проверять на чемто небольшом |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Удачи!
![]() Если очень хочется, новой темой. Но в привате-то зачем? Секреты, что ли? OpenSource ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |