Пример настройки UniParser на сайт-донор

Многие услышав слово «регулярные выражения» сразу впадают в панику и с ужасом вспоминают те непонятные наборы символов по виду похожих на абракадабру. Но не так страшен черт, как его рисуют. Давайте вместе пройдем весь путь настройки UniParser-a и я постараюсь показать всю легкость и красоту использования регулярок.

Итак, сейчас мы будем настраивать наш парсер на сайт с видеоресурсами http://www.film.ru.

Назовем наш файл настроек именем www.film.ru.

Для граббинга сайта переходим в каталог фильмов с сортировкой по алфавиту, ссылку страницы вставляем в поле URL начальной страницы.

Чтобы парсер мог зайти в описание каждого фильма ему необходимо описать тип ссылок, которые он должен будет посетить. С помощью кнопки +SubURL добавляем наш первый элемент в структуре запроса.

Теперь настало время анализировать код сайта. Для этого открываем исходный HTML-код страницы сайта и находим ссылку на описание фильма по его названию. Видим следующий код:

<li><a title="А был ли Каротин (1989)" href="/afisha/movie.asp?code=KAROTIN">

Просматривая другие ссылки на страницы-описания убеждаемся, что все они имеют одинаковую структуру:

<li><a title="название_фильма" href="ссылка_на_описание">

Попробуем теперь описать данную часть кода с помощью регулярного выражения. Но перед этим нам необходимо узнать несколько правил написания регулярок:

1. Регулярное выражение должно быть заключено между двух спец. символов, означающих начало и конец регулярки, я для этого использую символ «решетка» - #;
2. Все символы, не являющиеся буквами или цифрами, должны быть прослешированы (добавлен слеш «\» перед каждым символом);
3. Искомая часть кода в регулярном выражении должна быть описана между скобками – ();
4. В каждой регулярке должна быть описана только одна искомая часть кода.

Давайте применим первые два правила к нашему коду:

#\<li\>\<a title\=\"название_фильма\" href\=\"ссылка_на_описание\"\> #

Перейдем теперь к самому основному – ссылке на описание фильма. Но для начала ознакомимся с некоторыми спец. символами регулярок:
1. Квадратные скобки ([]) – в них мы определяем набор символов, которые могут быть в заданной части регулярки, могут быть перечислены как последовательный набор букв «abcde» либо диапазон букв через тире «a-z»;
2. Символ звездочка (*) – означает количество описываемых символов от нуля и до бесконечности;
3. Символ «домик» (^) – означает отрицание последующего символа.

Все, этого нам вполне хватит для описания нашей ссылки. Итак давайте попробуем это сделать. Из перечисленных правил помним, что искомую часть кода описываем в скобках. Так как наша ссылка в конце ограничена одинарной кавычкой, то нам надо сказать, чтобы по регулярному выражению выдирались все символы до кавычки. Запишем это:

([^\"]*)

Хочу обратить внимание, что в квадратных скобках одинарная кавычка тоже должна быть заслеширована. Эту часть регулярки можно прочитать как: любое количество любых символов кроме кавычки. Все просто! Запишем теперь регулярку полностью:

#\<li\>\<a title\=\"название_фильма\" href\=\"([^\"]*)\"\> #

Чтобы наша регулярка стала универсальной для всех ссылок, нам необходимо описать в ней название фильма. Так как в данный момент нас название фильма не интересует, то в скобки мы его не берем, но в остальном описываем аналогично предыдущему варианту:

[^\<]*

Читаем это как: любая последовательность символов, в которую не входит символ «<». Запишем теперь все это в общую регулярку:

#\<li\>\<a title\=\"[^\"]*\" href\=\"([^\"]*)\"\>#

Все, наша «абракадабра» написана! Оказалось, что написать регулярку оказалось проще, чем ее прочитать! :) Хорошо, теперь запишем результаты наших трудов в поле URL1:

Дальше нам надо, чтобы парсер, заходя на каждую страницу с описанием, сохранял нам название фильма, год выпуска, жанр, описание и постер. Для добавления условий поиска по странице используем кнопку +REGEXP.

Первым опишем название фильма. В поле Имя введем название name. Далее открываем страницу с описанием фильма, открываем ее исходный код и находим в нем описание

">А был ли Каротин<span style="font:normal 18px

Проверяем на наличие на странице текст с такими же тэгами, удостоверяемся, что такого больше нету. Отлично, описываем аналогично предыдущему случаю со ссылкой:

#\"\>([^\<]*)\<span style\=\"font\:normal 18px#

Записываем регулярку в поле REGEXP 1. Аналогично описываем год выпуска и жанр. В результате у нас получилась вот такая картина:

Давайте на этом этапе посмотрим, что же у нас получилось. Для того чтобы UniParser знал в каком месте ему необходимо прервать свой поиск и вывести найденную информацию, необходимо указать точку сохранения, поэтому на URL 1 ставим галочку возле Точка сохранения и в самом низу жмем кнопку Тест.

Отлично, у нас все получилось! Теперь давайте займемся постером. После изучения html кода в районе ссылки на постер оказалось, что для того, чтобы описать и унифицировать участок кода со ссылкой на постер, необходимо описывать довольно большую часть кода с параметрами картинки:

<img src="http://www.film.ru/img/afisha/poster.jpg" width="150" height="230" alt="" style="border:0 solid transparent !important" /></a></td><td valign="top" style="padding:19px 20px 12px 0">

Но регулярку можно существенно уменьшить, добавив в наши знания всего один символ – точка! Итак, точка означает любой символ. А в совокупности с символом «*» будет значить «любое количество любых символов». Применим все это на практике:

#\<img src\=\"([^\”]*)\".*\/\>\<\/a\>\<\/td\>\<td valign=\"top\" style\=\"padding\:19px 20px 12px 0\"\>#

А теперь вставим данный код в парсер, выберем Тип данных Фото и запустим на тестирование:

С постером мы разобрались, осталось дело за описанием. Находим описание в html-коде, смотрим, анализируем и выявляем закономерность, что все описания находятся между такими тэгами:

<div class="ntext" style="padding-top:12px"><p>описание </p> </div>

Просматривая несколько описаний определяем, что в некоторых описаниях присутствует символы перевода строки. По умолчанию регулярки ищут данные построчно, то есть если в нашем тексте будет присутствовать перевод строки, то регулярка просто на нем не сработает. Но есть такая замечательная вещь, как модификатор «s». После его применения все переводы будут игнорироваться. Все модификаторы пишутся после знака «#». Попробуем написать нашу регулярку описания фильма:

#\<div class\=\"ntext\" style\=\"padding\-top\:12px\"\>\<p\>(.*)\<\/p\>[^\<]*\<\/div\>#s

Текст описания в регулярке мы обозначили любой последовательностью символов «.*», так как мы не можем быть уверены, что в тексте не будет каких-либо спец. символов. Заносим регулярку в нашу структуру запроса и смотрим на результаты теста:

Как видим, описание фильма отлично нашлось по нашей регулярке! И это все бы ничего, но парсер у нас умеет просматривать фильмы только с одной страницы, с названиями фильмов, начинающихся с буквы А, нам нужна полностью вся база фильмов этого сайта, поэтому продолжим.

Теперь нам необходимо научить наш парсер листать страницы. Для этого сначала найдем в html-коде нашей исходной страницы ссылку на следующие списки фильмов:

<a title="Фильмы по алфавиту: &laquo;Б&raquo;" href="/a-z.asp?letter=%C1">Б</a>

Из всей строки для уникализации поиска по регулярному выражению нам будет достаточно всего этой части:

raquo;" href="/a-z.asp?letter=%C1">

Используя наш уже не малый багаж знаний в написании регулярок опишем в данном тексте ссылку:

#raquo\;\" href\=\"([^\"]*)\"\>#

Теперь нам надо создать еще один SubURL нашей начальной страницы и записать в него только что созданную регулярку.

Теперь созданный URL2 будет загружать аналогичную страницу со списком фильмов, которая загружается из URL начальной страницы. А это значит, что добавив SubURL в URL2, аналогичный созданному нами URL1 со всеми настройками, мы определим все необходимые настройки парсинга всей базы фильмов и закончим написание нашей структуры запроса.

В процессе тестирования обнаружилась одна неприятная вещь – некоторые постеры одного фильма начали перескакивать на другие описания. А это значит, что на некоторых страницах наша регулярка image находила несколько ссылок. Для исправления этого досадного недостатка в REGEXP 4 выставляем дополнительный параметр Выбрать первый в REGEXP. Все, на этом настройка запроса завершена! Посмотреть на работу наших трудов можно в демонстрационном режиме парсера.