Поиск по блогу

понедельник, 1 сентября 2008 г.

Автоматизация добавления RSS блога в агрегаторы. Часть I

Итак, теории пока достаточно, перейдем к практике. Сделаем утилиту, которая добавляет RSS ленту вашего блога в разные RSS-агрегаторы. Если вам часто приходится заниматься проектированием, то рассуждения об организации программы можно пропустить, не читая.

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

url= /*ссылка на страницу, на которой расположена форма для добавления RSS*/
field_url= /*название (id) поля формы, в которое надо вписать ссылку на сайт (если потребуется)*/
field_rss_url= /*название (id) поля формы, в которое надо вписать ссылку на RSS*/
field_rss_name= /*название (id) поля, в которое надо вписать название блога*/
field_dsc= /*название (id) поля, в которое надо вписать описание блога (если потребуется)*/
field_keys= /*название (id) поля, в которое надо вписать ключевики*/
key_delimiter= /*разделитель ключевых слов. В программе все ключевые слова будем разделять запятыми. А если на ресурсе разделитель будет отличаться — заменим его.*/


Названия полей необходимы для обращения к этим полям. Как видите, программа получается универсальная. Самым трудоемким будет обойти ресурсы и записать в конфигурационный файл id полей. Я преднамеренно включила максимальное количество полей для того, чтобы в будущем эту же программу можно было использовать для добавления ссылок в каталоги соц. закладок и т.д.. Принцип программы будет чрезвычайно прост: после двойного щелчка по ссылке на ресурс (в левой части формы) страница откроется в WebBrowser-е и поля в соответствии с конфигурационным файлом заполнятся данными из верхней части формы. Человеку останется только просмотреть на всякий случай, все ли поля заполнены, ввести где надо капчу, выбрать категорию (если понадобится) и нажать кнопку.

Интерфейс получился такой:

автоматическое добавление ссылки
Итак, в принципе, алгоритм описан. Реализовать его на Delphi — достаточно просто. Выкладываю прототип программы. В ее ini-файле пока только 3 ресурса. По аналогии вы можете добавить, сколько угодно (новые разделы в INI-файле должны называться SITEnn, где nn - порядковый номер. Названия полей (инпутов) ищутся в html-коде страниц и вносятся для каждого сайта отдельно). Крайне полезный список ссылок на RSS-агрегаторы можно найти на блоге ЖПО - Жизнь Поисковой Оптимизации. Было бы здорово, если бы кто-нибудь добавил все ссылки и выложил получившийся файл. Может, у меня дойдут руки на этой неделе... Но пока не до этого. Ждите продолжения данной статьи. Там я остановлюсь на некоторых технических моментах написания программы и приведу кое-какие листинги.

Качайте и пробуйте прототип программы. Надеюсь, что пригодится.

суббота, 30 августа 2008 г.

Объектная модель браузера (DOM в веб-браузерах)

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

В Википедии:
DOM (от англ. Document Object Model — «объектная модель документа») — это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому документов, а также изменять содержимое, структуру и оформление документов.

Суть объектной модели браузера в том, что мы через простой интерфейс можем получить доступ к любым элементам страницы. Например, к любой ссылке (или ко всему массиву ссылок), к любой форме, к любому элементу ввода, к любой кнопке и так далее. К объектам и их свойствам и методам, естественно. Нас больше всего будут интересовать объекты, связанные с тегами HTML. Они соответствуют тегам, которые формируют текущий документ, и включают такие элементы как гиперсвязи и формы.

К объектам можно обращаться по id, по номеру в массиве (например, если надо перебрать все элементы одинакового типа).

Я бы посоветовала взять в руки какой-нибудь толстенный спровочник по JavaScript, например. И просмотреть раздел, посвященный объектной модели браузера. В свое время я так и делала. Необязательно знать и помнить все объекты, свойства и методы — важно оценить возможности и прикинуть, для чего все это может пригодиться. Тем, кто уже изучал JavaScript, будет немного легче.

Так, сейчас немного о том, как работать с объектной моделью в Delphi, используя рассмотренный в предыдущем посте компонент TWebBrowser.

Существует интерфейс IHTMLDocument2, который позволяет с легкостью это делать. А можно напрямую через OleObject. Например, если в html-документе, заруженном в WebBrowser, есть, допустим, инпут с id='message', то код:
WebBrowser.OleObject.document.getElementById('message').Value := 'Привет!';
запишет в этот инпут строку "Привет!".

А код:
  ovElements := WebBrowser1.OleObject.Document.Forms.Item(0).Elements;
for i := 0 to (ovElements.Length-1) do
if (AnsiUpperCase(ovElements.Item(i).tagName) = 'INPUT') then
if (AnsiUpperCase(ovElements.Item(i).type) = 'SUBMIT') or
(AnsiUpperCase(ovElements.Item(i).type) = 'BUTTON') then
if (ovElements.item(i).Value = 'Send') then
ovElements.Item(i).Click;
переберет все элементы первой по счету формы страницы, найдет в ней кнопку, на которой будет написано "Send" и сымитирует ее нажатие.

Как видите, объектная модель — очень полезная и удобная штука. Хотя основное ее применение — не парсинг, а автоматизация регистраций, заполнения форм и так далее. Чтобы показать, насколько она может быть полезна, в следующих постах приведу пример разработки и создания небольшой утилиты для автоматизации добавления вашей RSS-ленты в RSS-агрегаторы.

четверг, 28 августа 2008 г.

Получение содержимого web-страниц в Delphi. Вариант первый, самый простой

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

Сегодня опишу самый простой способ получить содержимое web-страницы. Для этого будем использовать стандартный Active-X компонент TWebBrowser. Этот же компонент использует Windows в своем IE. В некоторых случаях это даже удобно, так как созданный на основе этого компонента объект будет "видеть" все ваши IE-кукисы и прочие настройки (если, конечно, вы пользуетесь IE).

Итак, создадим форму, на нее поместим TEdit (подобие адресной строки), кнопку и компонент TWebBrowser (вкладка Internet).


В обработчике нажатия кнопки пишем:
WebBrowser1.Navigate(Edit1.Text);

Вот и все!

Simple Browser
Этот компонент удобен в случаях, когда HTML-код страницы нельзя получить другим простым способом (например, некоторые сайты отказываются работать, когда браузер не поддерживает flash, поэтому получить код страницы в обход применения этого компонента — возможности нет). Также TWebBrowser удобен для автоматизации работы с формами на сайтах.

Иногда требуется, чтобы страница полностью отобразилась в контейнере, прежде чем продолжится работа с ней. В этом случае я обычно в проекте создаю глобальную переменную, на событие OnDocumentComplete вешаю обработчик:
procedure TFMain.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DocLoaded := true;
end;

А в теле основного модуля работа продолжается только тогда, когда эта глобальная переменная станет равна true:
procedure TFMain.PostMessageOnBoard(Mess: string);
var
Doc : IHTMLDocument2;
S : string;
begin
DocLoaded := false;
WebBrowser1.Navigate(Edit1.Text);
while DocLoaded = false do
Application.ProcessMessages;

Doc := WebBrowser1.Document as IHTMLDocument2;
WebBrowser1.OleObject.document.getElementById('shform').ClassName := '';

S := Doc.body.innerHTML;

//...
end;

Кстати, в приведенном выше отрезке кода содержится пример использования объектной модели браузера. (Что это — я расскажу позже.) А в переменной S в результате окажется весь HTML-код страницы.

В ближайших постах я планирую рассказать:
  • Что такое объектная модель браузера и с чем ее едят?
  • Как еще можно получить содержимое страницы?
  • Написание простенького парсера (Пример №1 - Парсинг ключевых слов).
Так что подписывайтесь на RSS :)

Поделиться