[Ответить в тред] Ответить в тред

15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!
30/09/16 - BREAKING NEWS ШОК АБУ ПРОДАЛСЯ МЭЙЛУ (на самом деле нет)



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 2 | 2 | 2
Назад Вниз Каталог Обновить

DOM & VBA Аноним 08/11/16 Втр 20:11:55  872417  
2521493.jpg (63Кб, 684x762)
Здорова коданы!
Речь пойдет о Document Object Model https://www.w3.org/DOM/ а точнее о том как скрестить его с VBA (макрос в экселе)

Как я понимаю DOM это API для XML документов. Все кто кодит на JavaScript знает о нем не по наслышке.

Затеял я написать web-парсер в VBA опираясь на DOM.

Пару слов о том зачем мне это. Однажды я уже написал парсер в виде макроса в экселевском фале который получает HTML код страницы (при помощи запроса MSXML2.XMLHTTP) в виде огромного огромного куска текста и вытаскивает из него регулярными выражениями все что требуется. И все было хорошо ровно до того момента пор пока я не столкнулся с веб страницей, контент на которой генерируется яваскриптом. Там мой парсер оказался вообще бесполезен, ведь сам запрос возвращал не информативную ерунду. Поиски решения привели меня к DOM - им я могу достать чего то полезное с таких страниц. Да впрочем и вообще со всех, лол, судя по всему надо было сразу же на нем парсер писать, но я говнокодер от сохи не знал что он существует.

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

В чем принцип работы. Я запускаю Internet Explorer - во первых потому что есть везде, а во вторых потому что туда куда мне надо пускает только его (требует настроенный криптопровайдер и ключ ЭЦП). Далее посылаю в браузер команды и получаю из него объекты DOM, которые могу как менять: заполнять поля, жать на кнопки, так и читать их свойства - то есть полезную мне инфу.

С прелюдией закончил, перехожу к сути.
В процессе работы столкнулся с некоторыми трудностями, вызванными слабым пониманием как пользоваться DOM. А именно:
1. Я не понимаю как эффективнее всего смотреть дерево нодов
2. Я не понимаю почему то что я делаю не дает нужный результат

Ниже пример моего кода на котором я застрял и не могу понять что не так.
По итогу я получаю окно браузера IE с прогруженным сайтом google.ru в поисковой строке которого вбито значение "2ch", но кнопка поиска почему то не прожата. Если я мышкой кликаю в окно то оно меняется и приобретает вид страницы с результатами поиска но так же как будто кнопка была не прожата - то же самое я получу если просто начну заполнять строку поиска.

Вопрос - что я делаю не так и как мне атоматизировать клик по кнопке что бы получить в браузере результаты поиска гугла? (соответсвенно и возможность их программно прочитать)
На этом вопросы не заканчиваются но пойду по порядку.

Option Explicit
Sub googleAutomation()
'try to automate google request

'initialization
Dim IE As Object
Dim myNodeCollection As Object
Dim myNode As Object

On Error GoTo closeIE 'close IE if something went wrong

Set IE = CreateObject("InternetExplorer.Application")

IE.Navigate "https://www.google.ru/"

'delay
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop

'get nodes from IE
Set myNodeCollection = IE.document.getElementsByTagName("input")

'iterate trough node collection to fill search field
For Each myNode In myNodeCollection
If myNode.Name = "q" Then
myNode.Value = "2ch"
End If
Next myNode

'iterate again trough node collection to click search button
For Each myNode In myNodeCollection
If myNode.Name = "btnK" Then
myNode.Click
End If
Next myNode

'delay
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop

IE.Visible = True

Exit Sub 'to prevent error handler from reading

closeIE:
IE.Quit 'for close IE process

End Sub
Аноним 08/11/16 Втр 20:33:02  872434
Бля, уважуха, браток. Я вот не написал макросов сложнее фильтрации и разбивки данных по файлам с форматированием. Да и никому просто не нужно было ничего сложнее. А что ты делаешь? Следилку?
Аноним 08/11/16 Втр 21:38:36  872476
8dba9a96a00c.jpg (62Кб, 858x557)
Спасибо на добром слове. Я пытаюсь автоматизировать получение данных с электронной торговой площадки.

Вообще я давно уже редактор экселевский не по назначению применяю. Даже автоматизированную торговую систему писал в нем с интерфейсом и генерацией протоколов по итогам торгов. Но я этим не горжусь, это все от незнания других языков. Так то давно пора мигрировать на C# и учитсья писать web приложения на ASP .NET MVC

Как бы там ни было я не программист а энтузиаст самоучка. По этому еще немного по терзаю VBA что бы парсер этот дописать т.к. времени уйдет больше что бы его же реализовать в чем то другом чем тут домучать.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 2 | 2 | 2
Назад Вверх Каталог Обновить

Топ тредов
Избранное