Блог им. anatolyutkin

Как парсить сайты при помощи экселя VBA

Это для себя заметка, тем, кто в курсе, ничего тут нового нет. 

В трейдинге часто необходимо скачивать данные с различных сайтов. Порой для этого необходимо повторить много однотипных действий. Естественно, это удобно автоматизировать. Поскольку данные обычно--числа, то их удобно обрабатывать экселем (это если чисел не очень много. Много--это, например, тиковые данные чего-нибудь типа 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
 
★51
27 комментариев
Мне пригодится, спасибо :)
avatar
shprots, Дык пожалста :) Рутину надо автоматизировать.
avatar
Видимо это полезная штука, когда есть готовая таблица с формулами и нужно в неё импортировать по-быстрому данные какие-то из ынтырнэтов.
avatar
Reshpekt Fund Russia, Ну это другой уровень, я бы сказал. Допустим, вам надо скачать число держащих позиции юриков по RI с марта по октябрь 2013. Можно это уныло вручную сделать, а можно код написать за часок--и потом оно все сделает само.

А вообще, я эксельные таблицы как-то не очень жалую. Имхо, VBA гораздо проще, удобней и быстрее.
avatar
Rom V,
1) Ползем сюда: smart-lab.ru/people/
2) Копируем мышью и вставляем куда-нибудь.
3) ....
4) Профит :)

Применение описанного в моей заметке:
1) Ползем сюда: smart-lab.ru/people/
2) Лезем в код элемента Мартынова. Видим что-то такое:



3) Видим, что можно привязаться к тегу <td с атрибутом class=«user», «strength» и «rating».
4) Думаем, как это реализовать (думаю, это легко, я бы за часок-другой управился бы. С непривычки уйдет денек-другой). Примеры в помощь.
5) ...
6) Профит.
avatar
anatolyutkin, Для этих целей отлично подходит пара пакетов в R.

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 с разным количеством колонок (с объединенными колонками), пропускать ненужные строки
avatar
AlexBack, Спасибо. Поизучаю.
avatar
Rom V, Да, до низа страницу не посмотрел :) Так что добавление. Там еще надо суметь на вторую, третью… сто третью страницы перебраться. Можно это сделать просто по урле: smart-lab.ru/people/good/page3/ --это третья страница, синтаксиси понятен, пишем ie.navigate(«smart-lab.ru/people/good/page3/») и парсим.
avatar
Rom V, Еще там выше кое-чего написал.

Ну попробуйте постепенно. Вначале вообще VBA освоить. Сосчитать сумму чисел от одного до ста типа. Как оно с ячейками листа эксель взаимодействует. Потом приступайте к InternetExplorer.Application Тупо просто по сайтам полазайте программно. Потом уже парсить пробуйте. Сразу думайте, куда чего сохранять. Для коллекции элементов, получаемой после getElementsByTagName есть хороший метод innertext--выдает текст внутри тэга. В общем, изучайте, если есть такое желание. Это непросто и не быстро, но зато потом будет по кайфу. Это инвестиция--инвестиция в себя. Как и любая инвестиция, вначале требует труда.
avatar
да, помню был удивлен, обнаружив, что для парсинга 2000-й эксель гораздо лучше чем 2003, в котором часть функций просто отключили
avatar
broker25, Я в 2003 упражняюсь. Как-то так исторически сложилось.
avatar
… удобно искать куски кода по интересующим ситуациям, тегам и пр. на www.planetaexcel.ru/www.sql.ru/forum — тоже богатый ресурс…
avatar
roan, Да, спасибо. Планету эксель давно ценю и уважаю, вроде, даже зарегистрирован там. SQL форум не знаю, посмотрю.
avatar
Тут www.excelvba.ru/code есть интересные решения
avatar
imitator, Да, спасибо, этот сайт тоже вроде использовал.

Тут вообще главное, имхо, осознать, что такие вещи вообще возможны--а дальше дело техники. И небольшого времени. Вот для этого я и написал эту заметку--чтоб кто-то, кто уже задумывался над такой темой, получил бы знание, что это все реализуемо и несложно.
avatar
Не умничаю, но советую. Експлорером шерстить инет, не очень быстрый способ. Во-первых вместе с информативным html тащит еще и скрипты и стили, а главное картинки. Даже при скоростном и безлимитном инете, напрасная трата ресурсов и времени. 2 експлорер должен быть видимым, а это не естетично. 3 не забывай, что придется весь код перекручивать, т.к перед разбором страницы надо дождаться ее загрузки и уже в обработке этого события разбиратт. Есть 2 достуных на любой винде Com объекта xmlhttprequest и htmlfile
avatar
Cheshirscy, название объектов точно не помню, но если интересно могу уточнить
avatar
Cheshirscy, 1) Ну а как без скриптов то? В них же важные вещи могут быть.
2) Не, не должен. Ставишь ie.visible=false и все. Никакого окна IE даже не увидишь.
3) Там в коде пишешь типа Do While ie.busy=true Loop и все. Оно будет крутиться в мертвой петле, пока страница не загрузится.
4) Да, есть такие вещи. XMLHTTP вроде, я пользовался этим когда-то. Не помню уже, но от InternetExplorer.Application у меня вроде приятней ощущения остались.
avatar
anatolyutkin, "… от InternetExplorer.Application у меня вроде приятней ощущения остались" — аналогично… дальше примеров с XMLHTTP и т.п. дело не пошло, а IE через OLE — милое дело…
avatar
roan, Ну да, c IE оно как-то работает без особых зарубливаний в тему. Мне буквально пару часов хватило, чтобы освоиться. А вот с XMLHTTP помню, чета там было тяжко. Хотя, это субъективно все, конечно.
avatar
Cheshirscy, "… а главное картинки..." — отключается в настройках…
avatar
Из рассылки узнал об этом топике. Спасибо, автор! Реально полезная инфа
avatar
VBA еще жив???
avatar
Станислав Дорошин, конечно… это навык тысяч людей, что ему сделается…
avatar
Станислав Дорошин, Это теплая ламповая классика. Куда ж ей деться? :)
avatar

теги блога anatolyutkin

....все тэги



UPDONW
Новый дизайн