Регулярка для парсера

JOSS-PHP

Новичок
Регулярка для парсера

Вот с товарищем решили попробовать написать поисковик конкретно белорусских ресурсов с индексированием контента страниц, ранжированием, релевантностью и прочими премудростями(мини-яндекс что-ли )))).
Столкнулся со следующей проблемой: иногда кроме урла вытягиваются и другие атрибуты тега А.

PHP:
$content = file_get_contents("http://remotvet.ru/");
$pattern = '/<a(.*) href=(.*)>(.*)<\/a>/isU';
preg_match_all($pattern, $content, $matches);
print_r($matches[2]);
как тут быть если возможен вариант что после атрибута href могут идти атрибуты class например.
пробовал написать /<a(.*) href=(.*) (.*)>(.*)<\/a>/isU ,но это не подходит так как не обязательно там должны идти еще аттрибуты.

посёрчил по форуму - ответа не нашел. все топики прикрыты с причиной "Взлом... и т.д.".
в гугле норм ничего не нашел.
п.с. просьба модераторов не закрывать темку. не препятствуйте зарождению мего-поисковика ;)
 

JOSS-PHP

Новичок
Автор оригинала: triumvirat
грядет убийца Гугла!
если бы :) мне до гугла как до неба пешком.
п.с. лучше поскажи как проблему решить. уже котелок кипит и булькает
 

clevel

Новичок
я бы завернул это в функцию, которая на выходе давала список урлов.

В самой функции разбил бы задачу на две регулярки:
1. <a(.*?)>(.*?)</a>
2. в цикле пробежался бы по \\1, и сделал бы вторую регулярку: ([a-z0-9])="?'?([^"' ]+?)

и потом бы выдернул сам аттрибут href, сделал абсолютные пути из (../../)

ну и в массив, который ретурнится..
 

JOSS-PHP

Новичок
Автор оригинала: clevel
В самой функции разбил бы задачу на две регулярки:
1. <a(.*?)>(.*?)</a>
2. в цикле пробежался бы по \\1, и сделал бы вторую регулярку: ([a-z0-9])="?'?([^"' ]+?)
и потом бы выдернул сам аттрибут href, сделал абсолютные пути из (../../)
ну и в массив, который ретурнится..
с двумя регулярками кстати интересноое и легкое кстати решение, вот только думаю насколько это будет тормозить систему(к примеру при 100к ссылок)?

по поводу абсолютных путей. спс за подсказку - даже о них не подумал. надо учесть

з.ы. вот мысль проскочила сейчас. вот у нас будет к примеру в базе 10к ресурсов. как лучше сделать?
1.все пропарсить и засунуть в базу в одном скрипте
2.на каждый ресурс в фоне запускать скрипт парсинга урлов.

ну а потом естесственно индексация всех урлов в базе
 

Adelf

Administrator
Команда форума
паука не на php бы желательно делать :)
Не его уровня задача.
 

freeek

Новичок
если тебе нужно значение атрибута href, так ты его и ищи что тебе нужно,
там же простое условие, верстка валидная, что значение атрибута заключается в ковычки, одинарные или двойные

PHP:
$p = "%<a[^>]*(?=href)href=(?:\'|\")(.*)(?:\'|\")[^>]*>.*<\/a>%iU";    
$content = file_get_contents("http://remotvet.ru/");    
echo '<pre>';    
preg_match_all($p, $content, $matches);    
print_r($matches[1]);
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: Adelf
паука не на php бы желательно делать :)
Не его уровня задача.
Не уровня языка php или не уровня php-программистов?

Скорее второе, да.
 

JOSS-PHP

Новичок
Автор оригинала: Adelf
паука не на php бы желательно делать
Не его уровня задача.
К сожалению, из нас двоих никто на том же С\С++ писать не умеет. Да и с перлом туго.
П.С. а на чём обычно спайдер пишется?
 

Adelf

Administrator
Команда форума
Я пауков не писал, и наверно слабо представляю как они выглядят. Но почти наверняка это проги, которые работают "бесконечно". Сидят себе, смотрят интернет, чтото пишут. В индекс данные возможно складывают уже другие участники процесса.

Я слабо представляю, чтобы на php такое было :) с/с++ имхо самый правильный вариант.

>> К сожалению, из нас двоих никто на том же С\С++ писать не умеет
Ну значит надо писать на PHP :) Но, имхо проблема с поиском href в теге a - это еще самая простая на вашем пути.
 

Духовность™

Продвинутый новичок
имхо проблема с поиском href в теге a - это еще самая простая на вашем пути
+1
писать надо парсер на каких-нибудь конечных автоматах,а то фи - "регулярка". да и алгорим то у вас есть? что из текста индексировать? какие блоки текста? как отличить контент от мусора? сотни вопросов.
 

JOSS-PHP

Новичок
freeek
оооо...огромное спасибо. то что надо.

-~{}~ 16.12.09 12:00:

Автор оригинала: Adelf
Но, имхо проблема с поиском href в теге a - это еще самая простая на вашем пути.
эх... много еще работы и проблем (((
на счёт бесконечно тут по другому вопрос стоит. мы задумали пока что только белорусские ресурсы собирать. их не такуж и много на самом деле - 50-70к
Автор оригинала: triumvirat
да и алгорим то у вас есть? что из текста индексировать? какие блоки текста? как отличить контент от мусора? сотни вопросов.
мы сначала думаем паука добить чтобы без багов работал. потом естественно тайтл дескрипшн и т.д. отдельно будут выпарсиваться.

по-поводу мусора даже не знаю... буду гуглить по этому вопросу так как пока мало себе это представляю.

п.с. может повторюсь , но мы это больше для себя делаем. так сказать попробовать силы что-ли. а дальше уже видно будет что из этого получится. в любом случае это займёт огромное количество времени
 

Alexandre

PHPПенсионер
паука не на php бы желательно делать
Не его уровня задача
+1
но у топикстартера выбора нет...

рекомендации по теме:
кроме учета скачнных страниц, надо вести статистику по :
- кодам ответа сервера ( 200, 404, 500, 302, ... timeout )
- кол-вам ошибок ( сравнивать Content-Lenght и реально принятых байт )
- времени/скорости закачки

сделать многопоточную (параллельную) скачку , и скачивать (повторное индексирование) сперва наиболее быстрые страницы, а потом наиболее тормозные, подгружать на скачку новые процессы взамен закончившихся
 

JOSS-PHP

Новичок
Автор оригинала: Alexandre
+1
но у топикстартера выбора нет...

рекомендации по теме:
кроме учета скачнных страниц, надо вести статус по :
- кодам ответа сервера
- времени/скорости закачки

сделать многопоточную (параллельную) скачку , и скачивать сперва наиболее быстрые страницы, а потом наиболее тормозные, подгружать на скачку новые взамен закончившихся процессов
возможности в выборе инструментария ограничены сейчас, но если проект "пойдёт" то думаю стоит обратиться к сишникам на счёт паука.

про коды ответа от серверов тоже думал. действительно важная тема, так как со временем могут появиться битые ссылки и их надо будет убивать из индекса. по поводу быстрые\тормозные страницы - в любом случае первый раз их придётся не глядя тянуть, а вот уже потом...

п.с. вообще думаю разделить всё на 4 компоненты:
1) сам паук - лазит\ищет\фильтрует линки
2) парсер - ходит по линкам, парсит страницы, кладёт всё по полочкам
3) индексатор
4) сама выдача по запросам
если будет большая нагрузка, то возможно придётся всех их на разные машины ложить.
 

JOSS-PHP

Новичок
Автор оригинала: triumvirat
и нафига вам это надо?..
пока это всё на энтузиазме для самоутверждения\испытания. Но кто его знает чем оно обернётся. может пройдёт годик-два и услышите о новом поисковике ^^
 
Сверху