Списание World of Labels, Как да извличате информация от уеб страници с VBA
Характеристики на задачата
Уеб страниците са много привлекателен източник на информация. Има много примери, когато е препоръчително автоматично да сърфирате в страниците на световната мрежа, за да извлечете необходимата информация. Например, можете да следите появата на нови връзки към тема, която ви интересува, като сканирате страниците, генерирани от различни търсачки; можете да регистрирате нова информация, която се появява на страниците на конкурентни компании; можете да извличате световни новини и да генерирате свои собствени дайджести; можете да филтрирате и трансформирате информацията, от която се нуждаете за уеб частите на вашите собствени персонализирани решения за цифрово табло.
За разлика от други задачи за свързване на различни приложения, работата с Internet Explorer има редица функции. Общата схема е „създайте обект на приложение => отворен документ => направи обработка => затваряне на документ и приложение" не е приложимо в случай на Internet Explorer. Няма отворен метод за документи на Internet Explorer. Вместо това се използва методът Navigate, който само инициира операцията за отваряне на документ. Всеки, който е работил с интернет браузъри, не може да не забележи, че тези приложения работят във фонов режим, оставяйки много свободно време за други програми. Същото се случва, когато стартирате 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. Втората променлива е флагът за отворено състояние, въведен за внедряване в средата на Office'97 VBA, където по някаква неизвестна причина няма функция IsNothing, въпреки че е спомената в системата за помощ, която проверява връзката на референтна променлива с реален обект. Целта на третата, низова, променлива ще стане ясна от това, което следва.
След като дефинирате необходимите променливи, можете да започнете процедури по програмиране, първата от които създава нов екземпляр на приложението Internet Explorer:
Когато Internet Explorer се отвори, се задават две свойства: Silent и Visible. Свойството Silent разрешава или забранява диалоговата комуникация на Internet Explorer с потребителя, а свойството Visible определя дали прозорецът на Internet Explorer се вижда на екрана на дисплея. По подразбиране Internet Explorer стартира невидим.
Втората процедура прави точно обратното. Internet Explorer се затваря с метода Quit, променливата на обекта се освобождава и флагът за отворено състояние се нулира:
Третата процедура върши по-смислена работа - инициира търсене и изтегляне на необходимата уеб страница. Както беше отбелязано по-горе, зареждането на страницата е само „поръчано“ и какво всъщност се случва зависи от състоянието на мрежовите компоненти. За всеки случай „подреденият“ URL (Uniform Resource Locator – стандартизиран низ от знаци, указващ местоположението на документа в Интернет) на страницата се съхранява в глобална променлива. Това ще ви позволи по-късно да проверите дали страницата е отворена. Обърнете внимание на параметрите, които се предават на процедурата за обработка на събитието DocumentComplete. Един от тези параметри е URL адресът на отворената страница. Трябва да се сравни с първоначалната стойност. Тук, както се казва, възможнонастроики. Причината за несъответствието на URL не е само липсващата страница или повреда на сървъра. Проблеми възникват и при отваряне на страници с рамки. Така например, ако необходимата страница съдържа три кадъра, тогава състоянието DocumentComplete се появява общо седем пъти: три пъти с празна URL стойност по време на процеса на маркиране, три пъти с URL стойността на страниците, заредени в рамки, и накрая с URL стойността на страницата, указана при извикване на метода Navigate.
Има още една особеност, която трябва да имате предвид, когато сравнявате URL адреси. Параметърът URL низ на метода Navigate трябва да указва протокола във формата http://, ftp:// или file://, в случай че трябва да отворите документа на локалния компютър. В последния случай префиксът file:// ще бъде пропуснат, когато възникне събитието DocumentComplete. Процедурата за този нюанс е дадена по-долу.
Обработка на HTML документи
Всички обсъдени по-горе процедури са от общ характер и могат да се използват непроменени в различни приложения. Работата със заредена уеб страница зависи от вашите специфични нужди. По-долу ще бъдат показани само първоначалните функции. На първо място, трябва да е ясно, че въведеният обект на Internet Explorer е базиран на обектния модел на Microsoft Internet Controls, който не съдържа средства за директен достъп до съдържанието на документа. Свойството InternetExplorer.Document предоставя само препратка към общ обект, който няма свои собствени свойства и методи. Очевидно това се прави, защото компонентът Microsoft Internet Controls е проектиран да прилага различни интернет протоколи, а не да работи с документи. Следователно, първото нещо, което трябва да направите, е да осигурите процедура за обработка на необходимотообектен модел на документ.
След цикъла за обработка на връзката има два израза, които отпечатват различни представяния на документа като цяло. Подобни свойства могат да се използват за анализиране както на текст, така и на HTML код с помощта на ваш собствен алгоритъм.
Внедряване на процеса
Четирите процедури, представени по-горе, формират основата за това как един проект на Office взаимодейства с Internet Explorer. Тези процедури отварят приложението Internet Explorer, стартират процеса на навигация, обработват резултата и затварят приложението. В същото време процесите на навигация и обработка могат да се повтарят многократно - в съответствие с интересите на потребителя. Списъкът с URL адреси за отваряне на страници може да бъде зададен предварително или генериран динамично въз основа на анализа на данните, получени по време на обработката на предишни страници. Можете дори да копирате по някакъв начин как приложения като Teleport Pro изтеглят цели уебсайтове от мрежата.
Както и да е, съвсем очевидно е, че за да се създаде работещ проект, е необходима още една програма, която планира и изпраща обажданията към изброените процедури. Необходимостта от такава програма за външен мониторинг се дължи и на факта, че в процеса участват ненадеждни компоненти и платени средства за комуникация. Едва ли е необходимо, след като стартирате навигацията, да чакате безгрижно незаменимото събитие на DocumentComplete. Целият опит с интернет в интерактивен режим показва друго. Следователно, когато разработвате монитор, е необходимо да се грижите за постоянен мониторинг на онлайн състоянието и да предвидите процедури за превключване, ако зареждането на следващата страница се забави след зададения срок.
Ако се опитате да формулирате изискванията към монитора, се оказва, че товаПрограмата трябва да предоставя следните функции:
- отваряне и затваряне на Internet Explorer, включително по искане на потребителя;
- съхранява и актуализира списъка с URL адреси, планирани за обработка;
- време продължителността на зареждане на отделна страница и цялата сесия на работа с Интернет;
- стартиране на следващия процес на навигация както след завършване на обработката на следващата страница, така и след изтичане на зададения срок;
- превключете режима на визуално показване на прозореца на Internet Explorer;
- показва състоянието на процеса на зареждане на следващата страница.
Към тези изисквания можете да добавите регистриране на процеса, освен ако, разбира се, процедурите за обработка не предвиждат извеждане на резултати директно в отворени документи на Office.
Съвсем очевидно е, че VBA форма с обичайните контроли, оборудвана с таймер, е доста подходяща да задоволи всички изисквания. Пример за такава форма е показан на фигурата.
Списъкът с URL адреси се съхранява в контролата ListBox, което го прави по-лесен за управление, отколкото с динамични масиви. Контролите на CheckBox са пряко свързани със съответните свойства на обекта InternetExplorer. Стартирането и спирането на процеса се извършват с командни бутони. Времето и състоянието се показват в нормални прозорци на TextBox. В този случай номерът на стъпката и общият брой стъпки се вземат директно от свойствата ListIndex и ListCount на списъка с URL адреси. За по-голяма яснота, продължителността на зареждането на страницата е изобразена като имитация на елемента ProgressBar.
Що се отнася до състоянието на процеса на зареждане, тук са необходими някои обяснения. Обектът InternetExplorer има много полезно свойство състояние, readyState. Този имотприема пет стойности: от 0 до 4. Стойността 4 съответства на състоянието Complete, преходът към който в нашия пример се осъществява чрез прекъсване и извикване на процедурата за обработка. Като показвате стойностите на посоченото свойство в прозореца на състоянието, можете перфектно да навигирате какво се случва зад кулисите.
От горното описание на програмата за наблюдение и съответната форма става ясно, че ключовата функция в процеса е процедурата, извикана от таймера. Именно в тази процедура се извършва анализът на състоянието, визуалното показване и превключването на процеса. Пълният текст на тази процедура е даден по-долу:
Както можете да видите от горния текст, преходът към следващия етап се осъществява с помощта на булевата променлива blnDone, която приема стойността TRUE в случай на изчакване или стойността на свойството 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 и може да се използва за извикване на процедурата за обработка на кода на уеб страницата.
Надявам се, че тези примери ще послужат като добра помощ за разработчиците на офис приложения и ще стимулират създаването на интересни проекти, които използват неизчерпаем източник на информация - Интернет.