Використання Microsoft HTML Parser для отримання інформації з веб-сайтів

vbCode

Однією з поширених завдань сучасного програміста можна назвати автоматизоване отримання інформації з Інтернет з віддалених веб-сайтів і збереження її до БД або у вигляді HTML-файлів. Наприклад, це може бути експорт графічних файлів прогнозу погоди з метеорологічного сайту, котирувань акцій з он-лайн біржі або новин з веб-сайту якої-небудь регіональної газети. Отримана інформація може бути використана для складання річного статистичного звіту і зберігається в БД або звіту про поточний стан того чи іншого фактора і представляється у вигляді єдиної HTML-сторінки для начальника фірми, клієнтів або відділу продажів. Можна назвати нескінченно багато подібних прикладів, але суть їх зводиться до одного – отримання (експорт) віддаленої веб-сторінки і витяг з неї певної частини HTML-коду програмними засобами.

До теперішнього часу можливості синтаксичного аналізу (фрагментації) HTML-сторінок були досить обмежені. Використовуючи HTTP-компоненти, подібно WinInet.dll, або деякі інші, розроблені третіми фірмами, можна отримати доступ до потрібної веб-сторінці, а потім за допомогою численних строкових функцій отримати її частину. Ця технологія цілком працює, але далека від елегантності. Інший шлях – використання архітектури Microsoft Internet Explorer.

Internet Explorer – це не одна окрема програма, а ціла колекція компонентів, які можна використовувати при розробці своїх додатків. Друге, що цікаво для фрагментації HTML-сторінки – це shdocvw.dll і. phtml.dll. Перший компонент містить WebBrowser – Microsoft ActiveX control, використовуваний для візуального перегляду веб-сторінок (головне вікно Internet Explorer, відображає веб-сторінку і є той самий компонент WebBrowser). Другий компонент. Phtml.dll, що містить HTML parser ("parser" з англ. – Синтаксичний аналізатор), може "розбирати" HTML-документи, що містяться у вікні WebBrowser.

Ця стаття описує основні прийоми роботи з Microsoft HTML Parser на прикладі простого додатка для експорту котирувань з веб-сайту MSN.com. Може бути ви вже використовували компонент WebBrowser для перегляду веб-сторінок у ваших програмах, але для нашого прикладу ми заново створимо міні-браузер, який потім буде перетворений на синтаксичний аналізатор веб-сторінок.

1. У меню File виберіть New Project і створіть проект Standard EXE. Потім в меню Project виберіть Components і додайте Microsoft HTML Object Library і Microsoft Internet Controls.

2. На панелі компонентів з'являться компонент WebBrowser. Перетягніть його на форму і додайте TextBox і Command Button. Встановіть значення властивості Text у TextBox в "http://moneycentral.msn.com/" і змініть властивість Caption у кнопки на "& Browse".

3. Двічі клацніть по кнопці і у вікні вихідного коду введіть наступний код:

Private Sub Command1_Click()

          WebBrowser1.Navigate Text1.Text

      End Sub

4. Збережіть і запустіть програму. Натиснувши кнопку Browse, ви повинні побачити веб-сторінку за адресою, який введено в текстовому полі. Таким чином, тепер у нас є простий браузер для Інтернет. Але це тільки перший крок у створенні нашого аналізатора.

5. Повернемося до нашого проекту. У вікні вихідного коду виберемо компонент WebBrowser1 і знайдемо подія DocumentComplete. Ця подія проиходит коли веб-сторінка повністю завантажена у вікні браузера.

Private Sub WebBrowser1_DocumentComplete _

              (ByVal pDisp As Object, URL As Variant)

      End Sub

Компонент WebBrowser має властивість Document, яке може бути типу IHTMLDocument і працювати наступним чином

Private Sub WebBrowser1_DocumentComplete _

              (ByVal pDisp As Object, URL As Variant)

              Dim Doc As IHTMLDocument2

              Set Doc = WebBrowser1.Document

      End Sub

Новий тип IHTMLDocument2 має можливості, недоступні в IHTMLDocument. Ви можете використовувати IHTMLDocument замість IHTMLDocument2 для систем зі старою версією Internet Explorer. І крім того там є схожий тип IHTMLDocument3, який також можна використовувати, якщо ви знаєте як він працює. Відразу зауважимо, що якщо ви переглядаєте документи Word або XML, то можна оголошувати змінну Doc як Document (Для Word) або DOMDocument (для XML).

Далі, перед тим як йти далі, важлива інформація про структуру документів HTML. На відміну від XML документ HTML може бути створений з деякою часткою свободи. Наприклад, ви зможете правильно завантажити HTML-документ, теги (елементи розмітки) якого не закриті. Але добре структурований HTML-документ зазвичай повинен мати такі елементи:

 <HTML> 
	<HEAD>
... Спеціальна інформація подібно <TITLE> ...
 	</HEAD>
 	<BODY>
... Елементи типу <TABLE>, <A>, <IMG> и.др. ..
 	</BODY>
 </HTML>
 

Ця структура подібна гілках дерева – теги містять інші теги, які, у свою чергу, містять треті і т.д. .. Більш точно можна сказати, що кожен елемент включає в себе колекцію від 0 до N елементів. Наприклад, тег <TABLE> (таблиця) може містити теги <TR> (рядки). Кожен тег <TR> може включати скільки завгодно <TD> (комірка), які в свою чергу можуть включати вже інші елементи, не относяящіеся до таблиць (малюнки, текст та ін.)

6. Тепер, розуміючи базову структуру HTML, продовжимо роботу з нашим прикладом. Аналізуючи сторінку з http://moneycentral.msn.com/ привласнимо друге тегом <INPUT> на цій сторінці значення MSFT (краще, якщо це значення буде вводиться в полі Text1) і потім зробимо відправку (submit) форми.

Private Sub Command1_Click()

          WebBrowser1.Navigate Text1.Text

      End Sub



      Private Sub WebBrowser1_DocumentComplete _

              (ByVal pDisp As Object, URL As Variant)

              Dim Doc As IHTMLDocument2

          Set Doc = WebBrowser1.Document

          If URL = _

              "http://moneycentral.msn.com/home.asp" Then

              Dim Inputs As IHTMLElementCollection

              Set Inputs = Doc.All.tags("INPUT")

              Dim Element As IHTMLElement

              Set Element = Inputs.Item(1, 1)

              Dim InputElement As IHTMLInputElement

              Set InputElement = Element

              InputElement.Value = Text1.Text

              Doc.Forms.Item(0, 0).submit

          End If

      End Sub

Тут ви можете бачити як колекції тегів можуть бути оголошені за допомогою специфічних типів. Кожен тег може бути представлений як IHTMLElement або за допомогою спеціального типу, що залежить від типу елемента. Наприклад, тег <TABLE> можна представити за допомогою IHTMLTableElement (елементи таблиці) або IHTMLElement.

Колекція тегів містить наступні важливі методи і властивості:

Length – Кількість елементів в колекції.
Item – Застосовується для вибору окремих елементів в колекції. Використовується з двома параметрами.
Tags – Використовується для фільтрації (вибору) певних елементів. Tags ("A") поверне всі елементи посилань у колекції.

Зараз ви можете запитати "Чому ж не можна одержати необхідну інформацію прямо c http://moneycentral.msn.com/scripts/webquote.dll?ipage=qd&Symbol=msft"? Так, поки це працює, але даними прикладом ми показуємо як використовувати HTML-форми в більш складних ситуаціях.

Якщо ви прямо зараз запустіть програму, то помітите, що наш приклад буде нескінченно завантажувати одну і ту ж сторінку. Додаток продовжує шукати форму, заповнювати її і робити submit. Тому кожен раз викликається метод DocumentComplete. Для усунення цієї проблеми необхідно додати перевірку в DocumentComplete, щоб відправка форми спрацьовувала тільки один раз на потрібній веб-сторінці.

7. Отже, програмний код буде виглядати наступним чином:

Private Sub Command1_Click()

          WebBrowser1.Navigate Text1.Text

      End Sub



      Private Sub WebBrowser1_DocumentComplete _

              (ByVal pDisp As Object, URL As Variant)

              Dim Doc As IHTMLDocument2

          Set Doc = WebBrowser1.Document

          If URL = _ 

              "http://moneycentral.msn.com/home.asp" Then

              Dim Inputs As IHTMLElementCollection

              Set Inputs = Doc.All.tags("INPUT")

              Dim Element As IHTMLElement

              Set Element = Inputs.Item(1, 1)

              Dim InputElement As IHTMLInputElement

              Set InputElement = Element

              InputElement.Value = Text1.Text

              Doc.Forms.Item(0, 0).submit

          ElseIf URL = _

              "http://moneycentral.msn.com/scripts/

              webquote.dll?ipage=qd&Symbol=" _

              & Text1.Text Then

              Dim Tables As IHTMLElementCollection

              Set Tables = Doc.All.tags("TABLE")

              Dim Quote As IHTMLElement

              Set Quote = _

              Tables.Item(14, 14).All.tags("TD").Item(2, 2)

              MsgBox Quote.innerText

          End If

      End Sub

На цьому завершальному етапі наш браузер перетворився на якусь подобу синтаксичного аналізатора веб-сторінок. Додамо, що IHTMLElement має такі можливості:

innerText – Текст між відкриває і закриває тегами
innerHTML – Текст і код HTML між відкриває і закриває тегами
outerText – Текст об'єкта
outerHTML – Текст і код об'єкта

Також зауважте, що остаточна рядок виходить з 11-го елемента четвертий таблиці. Що відбудеться якщо на MoneyCentral вирішать змінити розкладку сторінки? Кращою стратегією буде звернення до сторінки, створеної з певною логікою. Якщо ви впевнені, що котирування акцій зазвичай розташовані перед заголовками новин, тоді має сенс шукати таблицю котирувань, йдучи тому (до початку сторінки) від таблиці з новинами. Інший тактикою буде легка зміна вашої програми-аналізатора коли зміниться формат запитуваної сторінки. Один із шляхів зробити це – розбити єдину процедуру аналізу на більш менші. У цьому випадку після зміни сторінки можна буде обійтися або зміною порядку викликаються процедур, або включенням нових. Крім того, це дозволить іншим програмістам, що використають ваш вихідний код, без праці вносити зміни користуючись загальним інтерфейсом. Для цього потрібно буде IHTMLDocument передавати як параметр з функції DocumentComplete в інші модулі, які будуть аналізувати його вміст. Це дозволить легко розбити програму на модулі.

І на закінчення, перед тим, як ви почнете використовувати свій додаток, деяка інформація для уваги. Є багато сайтів, яким байдуже, що відвідувачі скачують вміст їх сайту. Якщо ви припускаєте використовувати екпортіруемие дані для перевидання на своїй веб-сторінці, то краще, якщо ви будете мати попередню згоду з тим сайтом, з якого берете інформацію.

——-
Підготовлено з використанням статті "Scraping Web Pages" by Jeremy Rule [MSDN News 05/06 2000]

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*