уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Продолжаем использовать TRegExp – регулярные выражения в Delphi XE для собственных нужд. Краткое описание предыдущих частей:

Часть 1. В статье дается вводная часть, ставятся задачи для которых мы используем новые возможности Delphi XE, а именно – получить актуальную программу телепередач с сервиса tv.mail.ru. Так же в статье рассмотрено составление простого регулярного выражения для парсинга списка городов, для которых доступны программы ТВ.

Часть 2. В статье рассмотрена работа со списками телевизионных каналов. Разработаны методы получения и обработки данных по метровым и спутниковым каналам и их фильтрации в списке.

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

3. Получаем программу телепередач для заданного канала

Вначале рассмотрим, что происходит при сохранении настроек сервиса. Для этого воспользуемся инструментами разработчика в браузере Chrome. Заходим на страницу настроек сервиса и в Chrome выбираем инструменты:

chrome1

В нижней части окна появятся все необходимые инструменты. Теперь действуем следующим образом: выбираем любые настройки, например, город Уфа, два-три метровых канала и жмем кнопку “Сохранить”. Теперь в инструментах разработчика выбираем Resources –> Other:

chrome2

В списке слева у Вас должен появится всего один запрос, который Chrome не смог отнести ни к какой категории – это запрос на сохранение настроек. Выбираем его в списке и смотрим заголовки отправляемого сообщения:

chrome3

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

chrome4

Попробуйте выбрать какой-нибудь определенный канал и нажать “Ок” – URL страницы измениться, а именно – добавятся новые параметры:

  • period – период за который необходимо получить программу (сейчас, вечером, весь день). Может принимать значения от 1 до 3. Значение по умолчанию 1 и в URL не вставляется.
  • channel – содержит идентификатор канала для которого необходимо получить программу ТВ. Эти значения мы научились получать в прошлой части.

Вот, собственно, мы и докопались до сути – целевого URL на получение программы по каналу:

http://tv.mail.ru/?zone=%region%&period=%period%&channel=%channel%

Из трех параметров значения двух мы уже можем получить (zone и channel) ну, а третий – достаточно просто запомнить, что:

1 – не проставляется и используется для вывода того, что идёт сейчас по каналу

2 – используется для вывода информацмм о том, что идет вечером

3 – используется для вывода телепрограммы на весь день.

Вот теперь Вы можете оценить тот объем работы, которые требуется проделать, для того, чтобы просто докопаться до того URL который выдаст нам необходимую информацию. Да, вполне возможно, что эту же задачу можно было бы решить, проведя некоторое количество экспериментов с URL главной страницы и добиться результата, но ИМХО последовательное изучение объекта более правильно, хоть и занимает большее количество времени на изучение. Но это все лирика, а мы перейдем к следующему – завершающему этапу работы. Запускаем Delphi XE, открываем наш проект, который в случае надобности, Вы можете скачать здесь. И начнем с того, что напишем простенькую функцию для получения ID канала по его названию из массива Channels:

function TForm1.GetChannelID(const ChannelName: string): integer;
var i:integer;
begin
  Result:=-1;
  if Channels=nil then Exit;
  for i:=0 to Length(Channels)-1 do
    if Channels[i].ChannelName=ChannelName then
      begin
        Result:=Channels[i].ID;
        break;
      end;
end;

Теперь смотрим исходник странички с программой на один канал, например, Первый:

html_programm

Красным выделены части текста, которые нам нужны, то есть время и название передачи, фильма и т.д. Как можно видеть по представленному выше фрагменту HTML-кода, рядом с некоторыми пунктами в программе могут находится рисунки, кроме этого названия программ могут выделяться жирным шрифтом, другим цветом и т.д. Всё это лишние для нас и, соответственно, мешающие элементы. Т.к. нам необходимо одним регулярным выражением получить всю программу. Как быть?

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

Для того, чтобы очистить документ мы можем воспользоваться либо уже известными нам функциями поиска/замены текста, типа StringReplace и пр., либо использовать то, что предоставляет нам TRegExp – функцию замены текста по регулярному выражению – Replace о которой я рассказывал в статье “Delphi XE. Работа с регулярными выражениями”.

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

<b\s{1,}class=\S+\d+>|\s+orange\s+bold|<img\s+.*class=[a-z]*>|\s+class=»orange\s+bold»|\r’

Уверен, что его можно сделать ещё короче и ещё более эффективным, т.к. составилось оно буквально за 5 минут :) (можете потренироваться, кстати, в составлении регулярок – увлекательное занятие).

Теперь, сразу после закачки документа необходимо выполнить следующий код:

Input:=TRegEx.Replace(DownloadedText,Pattern,'');

где Input — строка, которую мы будем использовать для парсинга программы. DownloadedText— текст, который необходимо очистить от лишних элементов, Pattern — регулярное выражение по которому будет произведена очистка. Replace находит все совпадения с регулярным выражением и заменяет их на текст, заданный третьим параметром, т.е. в нашем случае на пустую строку. Теперь нам остается только применить регулярное выражение для получения списка всех программ. Оно у меня получилось следующим:

class=\S{5,7}(\d{2}:\d{2})\S{5}\r\D*a{1}\s+\D*\S*\d{1,}»>(.*)<

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

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии