Журнал Світ етикетки, Як за допомогою VBA отримувати інформацію з Web-сторінок
Особливості завдання
Web-сторінки є дуже привабливим джерелом інформації. Можна навести безліч прикладів, коли доцільно в автоматичному режимі здійснювати серфінг на сторінках Всесвітньої Павутини, щоб отримати необхідні відомості. Наприклад, можна стежити за появою нових посилань по предмету, що цікавить, скануючи сторінки, що генеруються різними пошуковими системами; можна реєструвати нові відомості, що з'являються на сторінках конкуруючих компаній; можна отримувати світові новини та генерувати власні дайджести; можна фільтрувати і перетворювати необхідну інформацію для компонентів Web Parts власних рішень Digital Dashboard, що налаштовуються.
На відміну від інших завдань зв'язування різних програм робота з Internet Explorer має ряд особливостей. Загальна схема «створити об'єкт Application => відкрити документ => виконати обробку => закрити документ і програму» у випадку з Internet Explorer не застосовується. Для документів Internet Explorer не існує методу Open. Натомість використовується метод Navigate, який лише ініціює операцію відкриття документа. Кожен, хто працював з браузерами Internet, не міг не помітити, що ці програми працюють у фоновому режимі, залишаючи багато вільного часу для інших програм. Те саме відбувається і при запуску Internet Explorer із Microsoft Office. Internet Explorer негайно поверне управління модулю, що викликає, хоча до закінчення завантаження необхідного документа ще далеко. Щоб не заблокувати систему, необхідно вирішити задачу синхронізації паралельно працюючих програм. Зазвичай для цієї мети VBA використовується таймер у поєднанні з функцією DoEvents, що передаєкерування операційною системою для обробки подій та виконання інших програм. У мові VB подібні дії простіше виконати за допомогою Sleep.
Друга особливість використання Internet Explorer полягає у різноманітті бібліотек, які містять компоненти необхідної об'єктної моделі. Однакових результатів можна досягти за допомогою різних інструментів, тому насамперед слід ознайомитися зі складом тієї чи іншої бібліотеки, доступними властивостями, методами та подіями для однойменних об'єктів.
Звернення до Internet Explorer
Як зазначалося, під час роботи з Internet Explorer необхідно подбати про синхронізації паралельних процесів. Рекомендованим етапом вирішення подібного завдання є побудова спеціального класу, що дозволяє використовувати події зовнішнього застосування. Для цього у VBA-проекті слід створити новий модуль класу та описати в ньому об'єктну змінну з ключовим словом WithEvents, після чого у списку процедур для описаного об'єкта з'являться всі передбачені події. Об'єкт Internet Explorer має неабияку кількість подій, крім об'єктів Application додатків Microsoft Office. Для цілей нашого прикладу достатньо використовувати одну подію — DocumentComplete. Ця подія виникає, коли будь-який документ повністю завантажений і в рядку стану Internet Explorer з'являється знайоме всім повідомлення Готово. Відповідний модуль класу показаний нижче:
Після того, як об'єкт Internet Explorer належним чином визначено, можна перейти до процедур головного модуля проекту. Оскільки передбачається паралельна робота, не обійтися без глобальних змінних, що служать для зберігання інформації між викликами процедур. У нашому випадку їх три:
Перша змінна - це покажчик навідкритий екземпляр Internet Explorer. Друга змінна - прапор відкритого стану, введена для реалізації в середовищі VBA Office'97, де з незрозумілої причини відсутня, хоча й згадується в довідковій системі, функція IsNothing, що перевіряє зв'язок змінної посилання з реальним об'єктом. Призначення третьої, рядкової, змінної буде зрозуміло з подальшого викладу.
Після визначення необхідних змінних можна приступити до програмування процедур, перша з яких створює новий екземпляр Internet Explorer:
При відкритті Internet Explorer встановлюються дві властивості: Silent та Visible. Властивість Silent дозволяє або забороняє діалогове спілкування Internet Explorer з користувачем, а властивість Visible визначає видимість вікна Internet Explorer на дисплеї. За промовчанням Internet Explorer запускається невидимим.
Друга процедура виконує прямо протилежні дії. Internet Explorer закривається за допомогою Quit, об'єктна змінна звільняється, і прапор відкритого стану скидається:
Третя процедура виконує більш змістовну роботу - ініціює пошук та завантаження необхідної Web-сторінки. Як зазначалося вище, завантаження сторінки лише «замовляється», і що станеться насправді — залежить стану компонентів мережі. Про всяк випадок "замовлений" URL (Uniform Resource Locator - стандартизований рядок символів, що вказує місцезнаходження документа в Internet) сторінки запам'ятовується в глобальній змінній. Це дозволить надалі перевірити, чи сторінку відкрито. Зверніть увагу на параметри, що передаються процедурі обробки події DocumentComplete. Один із цих параметрів — URL відкритої сторінки. Саме його слід порівнювати із вихідним значенням. Тут, як кажуть, можливіваріанти. Причина невідповідності URL полягає не тільки у відсутності потрібної сторінки або відмови сервера. Проблеми виникають і при відкритті сторінок із кадрами. Так, наприклад, якщо необхідна сторінка містить три кадри, стан DocumentComplete виникає цілих сім разів: три рази з порожнім значенням URL у процесі розмітки, три рази зі значенням URL сторінок, що завантажуються у кадри, і нарешті, зі значенням URL сторінки, вказаної при виклик методу Navigate.
Є ще одна особливість, яку слід враховувати під час порівняння URL. У рядковому параметрі URL методу Navigate необхідно обов'язково вказувати протокол у вигляді http://, ftp:// або file://, якщо раптом потрібно відкрити документ на локальному комп'ютері. В останньому випадку префікс file://, при події DocumentComplete, буде опущений. Процедуру, яка передбачає цей нюанс, наведено нижче.
Обробка HTML-документу
Всі розглянуті вище процедури мають загальний характері і можуть використовуватися в різних додатках у незмінному вигляді. Обробка завантаженої Web-сторінки залежить від потреб. Нижче буде показано лише початкові можливості. Насамперед слід усвідомити, що введений об'єкт Internet Explorer побудований на основі об'єктної моделі Microsoft Internet Controls, яка не містить жодних засобів доступу безпосередньо до вмісту документа. Властивість InternetExplorer.Document надає лише посилання на якийсь узагальнений об'єкт, який не має власних властивостей та методів. Вочевидь, це зроблено оскільки компонент Microsoft Internet Controls призначений реалізації різних протоколів Internet, а чи не до роботи з документами. Тому перше, що необхідно зробити, це забезпечити процедуру обробки необхідноюмоделлю документа.
Після циклу обробки посилань вміщено два оператори, які друкують різні подання документа загалом. Аналогічні властивості можна використовувати для аналізу як тексту, так і HTML-коду, за допомогою власного алгоритму.
Реалізація процесу
Представлені вище чотири процедури є основою механізму взаємодії проекту Office з Internet Explorer. Ці процедури відкривають програму Internet Explorer, запускають процес навігації, обробляють отриманий результат і закривають програму. При цьому процеси навігації та обробки можуть повторюватися багаторазово - відповідно до інтересів користувача. Список URL-адрес сторінок можна задавати заздалегідь або формувати динамічно, ґрунтуючись на аналізі даних, отриманих при обробці попередніх сторінок. Можна навіть певним чином повторити роботу таких програм, як Teleport Pro, що завантажують з мережі цілі сайти.
Як би там не було, цілком очевидно, що для створення працюючого проекту потрібна ще одна програма, яка здійснює планування та диспетчеризацію звернення до перерахованих процедур. Необхідність у такій зовнішній програмі монітора викликана ще й тим, що в процесі задіяні ненадійні компоненти та засоби комунікації, що оплачуються. Навряд чи слід, запустивши навігацію, безтурботно чекати неодмінного настання події DocumentComplete. Весь досвід роботи з Internet в інтерактивному режимі свідчить про інше. Тому при розробці монітора необхідно подбати про постійний контроль над станом у режимі online та передбачити перемикання процедур, якщо завантаження чергової сторінки затягується понад встановлений ліміт часу.
Якщо спробувати сформулювати вимоги до монітора, то вийде, що цяпрограма повинна забезпечувати такі функції:
- відкривати та закривати Internet Explorer, у тому числі і за бажанням користувача;
- зберігати та оновлювати список URL, запланованих для обробки;
- хронометрувати тривалість завантаження окремої сторінки та всього сеансу роботи з Internet;
- запускати черговий процес навігації як після завершення обробки чергової сторінки, так і після заданого ліміту часу;
- перемикати режим візуального відображення вікна Internet Explorer;
- відображати стан процесу завантаження чергової сторінки.
До цих вимог можна додати і ведення протоколу процесу, якщо, звичайно, процедури обробки не передбачають виведення результатів безпосередньо у відкриті документи Office.
Цілком очевидно, що для задоволення всіх вимог цілком підходить форма VBA зі звичайними елементами управління, оснащена таймером. Приклад такої форми наведено малюнку.
Список URL зберігається в елементі керування ListBox, що дозволяє керувати ним простіше, ніж у разі використання динамічних масивів. Елементи керування CheckBox безпосередньо пов'язані з властивостями об'єкта InternetExplorer. Запуск та зупинення процесу виконуються за допомогою командних кнопок. Час та стан відображаються у звичайних вікнах TextBox. При цьому номер кроку та загальна кількість кроків беруться безпосередньо з властивостей ListIndex та ListCount списку URL. Наочність для тривалості завантаження сторінки зображується у вигляді імітації елемента ProgressBar.
Що ж до стану процесу завантаження, то тут необхідно дати деякі пояснення. Об'єкт InternetExplorer має дуже корисну для контролю стану властивість - readyState. Ця властивістьприймає п'ять значень: від 0 до 4. Значення 4 відповідає стану Complete, перехід до якого в нашому прикладі здійснюється за допомогою переривання та виклику процедури обробки. Відображаючи значення зазначеної властивості у вікні стану, можна чудово орієнтуватися у «за кадром».
З наведеного опису програми-монітора та відповідної форми стає ясно, що ключову функцію в процесі несе процедура, що викликається таймером. Саме в цій процедурі відбуваються аналіз стану, візуальне відображення та перемикання процесу. Повний текст цієї процедури наведено нижче:
Як видно з наведеного тексту, перехід до чергового етапу здійснюється за допомогою булевої змінної blnDone, яка набуває значення ІСТИНА у разі вичерпання часу очікування або появи значення властивості readyState = READYSTATE_COMPLETE. Оскільки переривання від таймера настає пізніше, ніж подія DocumentComplete (припускаємо, що наша машина однопроцесорна), то перехід у цей стан означає, що обробка сторінки вже завершена.
Задля справедливості слід зазначити, що в ряді випадків обробку сторінки можна починати і при readyState = READYSTATE_INTERACTIVE. Це той самий стан, коли Internet Explorer дозволяє переглядати сторінку в інтерактивному режимі, хоча ще не всі компоненти завантажені. Починаючи з цього моменту, HTML-код цілком придатний для обробки. Якщо для вирішення завдань користувача коду HTML достатньо, процес можна дещо прискорити, помістивши виклик обробника сторінок у наведену вище процедуру в конструкцію Select Case для станів READYSTATE_INTERACTIVE і READYSTATE_COMPLETE. У цьому випадку подію DocumentComplete необхідно заблокувати. Для того, щоб зовсім мінімізувати час завантаження, необхідновикористовувати пару подій: NavigateComplete2 та DownloadComplete. Подія NavgateComplete2 виникає, коли документ оголошується знайденим і його URL потрапляє у стек навігації та стає доступним для перевірки. Подія DounloadComplete, яка не має параметрів виклику, виникає неодноразово - перед подією NavigateComplete2 і після неї. Саме настання події DounloadComplete за подією NavigateComplete2 відповідає переходу в стан READYSTATE_INTERACTIVE і може використовуватися для виклику процедури обробки коду Web-сторінки.
Сподіваюся, що наведені приклади послужать гарною підмогою для розробників офісних додатків і стимулюють створення цікавих проектів, які використовують невичерпне джерело інформації Internet.