Delphi. MSHTML. Загрузка страницы и парсинг

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

Как загрузить страницу?

Способ №1

На мой взгляд – самый простой способ – загрузить через idHTTP.get(‘url’) . Страницу мы получаем в виде строки и далее можно искать (парсить) в ней различные теги, email и др. информацию при помощи регулярных выражений. Способ хорош своей простотой и универсальностью, но если вдруг со страницей произойдут какие-то изменения – регулярки, возможно придется переписывать.

Способ №2

Через интерфейс IHTMLDocument2

Если использовать этот код, то постоянно выплывает это окошко…

4

 

Как бороться с этим окном?

Самый “железный” способ – снизить безопасность в Internet Explorer до нуля! Как это сделать? Заходим в свойства браузера и выставляем ползунок в нулевое положение.

5

Программный способ избавиться от окна. Если допустим мы пишем софт для машины клиента, а не для своей, и чтобы потом ему 33 раза не объяснять где что нажать, чтобы заработало, то программный способ просто необходим!!!

Чуть позже я напишу отдельный пост на эту тему, но суть в том, что нужно поменять в реестре windows

значение переменной 1A10 на 0, то есть так…

6

 

Только не ручками, а программно.Эта переменная как раз отвечает за cookie, значение 0 – соответствует разрешению принимать куки со всех сайтов.

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

По поводу программного способа – долго искал сам.

Задал вопрос на форуме.

Воспользовался программой Process Monitor от Microsoft и отследил какие изменения в реестре происходят при изменении настроек IE.

Очень помог пост EricLaw, в особенности его фраза

One notable factor is that the slider applies only to cookies for sites in the Internet Zone. Internally,URLACTION_COOKIES_ENABLED (0x01a10) setting has no UI but controls the behavior of Cookies on a per-zone basis. When set to 0, all cookies are Allowed. When set to 1, the P3P Policy is Evaluated to determine if the cookie should be accepted according to the user’s preference. When set to 3, all cookies are blocked. By default, cookies set for the Intranet Zone are always permitted, cookies for the Internet Zone are evaluated against the user’s P3P preferences, and cookies by sites in the Restricted Zone are always blocked.

 


Продолжаем тему про загрузку страницы…

Маленькое отступление. Что такое интерфейс?

Согласно книге В.В Фаронова “Delphi. Программирование на языке высокого уровня” основное назначение интерфейсов – описать свойства, методы и события удаленного объекта в терминах машины клиента, то есть на используемом при разработке клиентского приложения языке программирования.

Интерфейс это частный случай описания классов. Описание интерфейса аналогично объявлению абстрактного класса (без реализации методов). В отличие от классов – интерфейс не может содержать поля. Read and Write могут ссылаться только на методы.

Проверим эту информацию, залезем в IHTMLDocument2

И что мы видим? Функции разных типов, процедуры и ни одного свойства! Не обманул Валерий Фаронов!!! В основном типажи функций – OleVariant, WideString, и различные интерфейсы.

И действительно! Свойства описаны при помощи функций, а не напрямую и ни одной реализации. Не обманул Валерий!!!

Ещё одно небольшое отступление

Также, когда мы загружали страницу, то пользовались такой конструкцией

На сайте delphikingdom я обнаружил такую информацию

Итак, разрешите представить – QueryInterface. С помощью этого интерфейса клиент может определить, поддерживает ли COM-обьектом какой либо другой интерфейс, который известен клиенту, и получить указатель на тот интерфейс, если он поддерживается объектом. При работе с СOM, это пожалуй самый популярный вызов. В Dеlphi он иногда вызывается явно, иногда неявно. Неявный вызов происходит при применении оператора as для интерфейсных ссылок.

Далее мы увидим как QueryInterface использовать явно.

Попробуем поработать с idoc, который мы получили выше. Как видно из кода, это интерфейс IHTMLDocument2, из которого можно вытащить что-нибудь полезное. Для начала вытащим просто список тегов.

Пробуем парсить. Вытаскиваем список тегов

Что такое IHTMLElement? Это опять же интерфейс из библиотеки MSHTML, если в неё заглянуть, то там большая портянка функций и процедур. Приведу здесь только выдержки из неё – то, что мы использовали в коде выше.

Причем если кликнуть на Get_tagName, то мы никуда не попадем, реализации-то нет! Прав был Валерий Фаронов!!!

Собственно, результат наших трудов…

3

 

Способ №3 (только в VCL)

Вот код, который можно встретить в различных уголках Интернета. Для этого способа нужно визуально или динамически создать Webbrowser.

Я так и этак пытался запустить этот способ в FireMonkey но прочитав форум Embarcadero понял, что эта затея бессмысленна в FireMonkey;

Думаю это самый удобный способ, если работать в VCL, так как усилий минимум, результата максимум. Можно почти напрямую обращаться к элементам по их id и что-то с ними делать.

В следующем посте займусь непосредственно парсингом.

Список литературы

Основополагающая статья на DelphiKingdom “Использование функциональности IE или заметки о WebBrowser

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

Что можно вытащить из DOM?

Ответ на вопрос № (дан способ загрузки страницы через IHTMLDocument2)

Ответ на вопрос (человек пытается создать свои функции для парсинга, например getElementsByAttr и др. )

Статья на MSDN

Пост EricLaw (решение проблемы всплывающего окна проблемы безопасности)

 

 

by Stanislav_Panteleev