Это для себя заметка, тем, кто в курсе, ничего тут нового нет.
В трейдинге часто необходимо скачивать данные с различных сайтов. Порой для этого необходимо повторить много однотипных действий. Естественно, это удобно автоматизировать. Поскольку данные обычно--числа, то их удобно обрабатывать экселем (это если чисел не очень много. Много--это, например, тиковые данные чего-нибудь типа RI). Известно, что VBA в связке с экселем является очень удобным инструментом для работы с цифрами. Поэтому логично и парсить сайты тоже при помощи экселя.
Есть в экселе очень удобный объект InternetExplorer.Application Он позволяет вполне гибко программным образом управляться с сайтами путем программной работы с Internet Explorer. Можно гулять по сайтам, заполнять и отправлять формы, жать на кнопки, выкачивать любую инфу и вообще неплохо работать с DOMoм.
Какова технология?
1) Надо немного знать VBA (ниже есть примеры, вот в них надо приблизительно понимать что к чему).
2) Немного знать javascript (потому как команды типа ie.document.form.fff.submit--это javascript команды, в VBA они просто перенесены один в один фактически)
3) Естественно, немного знать html--то есть понимать, что такое элемент, тэги, текст, атрибут.
4) Если все это есть, то:
а) Разучиваем команды VBA по работе с InternetExplorer.application и InternetExplorer.application.document. Их немного, на самом деле, почти все необходимое есть в примерах. Навигация, заполнение форм, отправка, нажатие на кнопку, вытягивание nodelist со специфическими тэгами командой getElementsByTagName--вот и все по сути.
б) Открываем интересующий сайт и лезем в DOM. Я использую для этого Google Chrome--вполне удобные там средства разработчика. Также активно пользуемся просмотром кода элемента.
в) Проникаемся сайтом, изучаем, что нам надо. Надо ли вводить данные в формы или просто только парсить. Короче, строим алгоритм того, что надо. Это искусство, оно во многом зависит от создателей сайта. Требует времени и практики.
г) Собственно, делаем работу. Вытянутую инфу лучше просто запомнить на листе. А уж потом отдельным чисто эксельным VBA кодом ее обрабатывать.
Вот хороший пример автоматизации работы IE:
http://www.excely.com/excel-vba/ie-automation.shtml
А вот пример как можно залогиниться на mail.ru (это не мое, нашел в интернетах. Там кривовато, имхо, вместо отправки формы методом submit лучше жать на кнопку методом click для элемента формы <input type=«submit»>. Но работает):
Public Sub EnterToMailRu()
Const conLogin As String = «fff»
Const conPassword As String = «123456»
Dim i As Integer
Dim ie As Object
'Dim varReturn As Variant
Set ie = CreateObject(«InternetExplorer.Application»)
ie.Visible = True
ie.Navigate ("
http://www.mail.ru")
'varReturn = SysCmd(acSysCmdInitMeter, «Entering to Mail.Ru ...», 100)
While CBool(ie.Busy)
i = i + 1
'varReturn = SysCmd(acSysCmdUpdateMeter, Int(i / 30000 * 100))
If i > 29999 Then
'varReturn = SysCmd(acSysCmdClearStatus)
Beep
MsgBox «Something is wrong. Mail.Ru is not accessible», vbCritical, «Mail.Ru»
ie.Quit
Set ie = Nothing
Exit Sub
End If
DoEvents
Wend
'varReturn = SysCmd(acSysCmdClearStatus)
ie.document.Forms.Auth.Login.Value = conLogin
ie.document.Forms.Auth.Password.Value = conPassword
ie.document.Forms.Auth.submit
Set ie = Nothing
End Sub
А вообще, я эксельные таблицы как-то не очень жалую. Имхо, VBA гораздо проще, удобней и быстрее.
1) Ползем сюда: smart-lab.ru/people/
2) Копируем мышью и вставляем куда-нибудь.
3) ....
4) Профит :)
Применение описанного в моей заметке:
1) Ползем сюда: smart-lab.ru/people/
2) Лезем в код элемента Мартынова. Видим что-то такое:
3) Видим, что можно привязаться к тегу <td с атрибутом class=«user», «strength» и «rating».
4) Думаем, как это реализовать (думаю, это легко, я бы за часок-другой управился бы. С непривычки уйдет денек-другой). Примеры в помощь.
5) ...
6) Профит.
rvest ( blog.rstudio.org/2014/11/24/rvest-easy-web-scraping-with-r/ )
и
htmltab www.r-datacollection.com/blog/htmltab-Next-version-and-CRAN-release/
cran.r-project.org/web/packages/htmltab/vignettes/htmltab.html
Второй пакет позволяет вытаскивать сложные таблицы из верстки html с разным количеством колонок (с объединенными колонками), пропускать ненужные строки
Ну попробуйте постепенно. Вначале вообще VBA освоить. Сосчитать сумму чисел от одного до ста типа. Как оно с ячейками листа эксель взаимодействует. Потом приступайте к InternetExplorer.Application Тупо просто по сайтам полазайте программно. Потом уже парсить пробуйте. Сразу думайте, куда чего сохранять. Для коллекции элементов, получаемой после getElementsByTagName есть хороший метод innertext--выдает текст внутри тэга. В общем, изучайте, если есть такое желание. Это непросто и не быстро, но зато потом будет по кайфу. Это инвестиция--инвестиция в себя. Как и любая инвестиция, вначале требует труда.
Тут вообще главное, имхо, осознать, что такие вещи вообще возможны--а дальше дело техники. И небольшого времени. Вот для этого я и написал эту заметку--чтоб кто-то, кто уже задумывался над такой темой, получил бы знание, что это все реализуемо и несложно.
2) Не, не должен. Ставишь ie.visible=false и все. Никакого окна IE даже не увидишь.
3) Там в коде пишешь типа Do While ie.busy=true Loop и все. Оно будет крутиться в мертвой петле, пока страница не загрузится.
4) Да, есть такие вещи. XMLHTTP вроде, я пользовался этим когда-то. Не помню уже, но от InternetExplorer.Application у меня вроде приятней ощущения остались.