Блог им. 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
 
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
14.3К | ★51
26 комментариев
Мне пригодится, спасибо :)
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
VBA еще жив???
avatar
Станислав Дорошин, конечно… это навык тысяч людей, что ему сделается…
avatar
Станислав Дорошин, Это теплая ламповая классика. Куда ж ей деться? :)
avatar

Читайте на SMART-LAB:
Фото
Сделки в публичном портфеле ВДО
Фото
S&P500: штурм истории уже близко?
Индекс S&P 500 не перестает радовать инвесторов. Успешно переварив предыдущий флэт, пара провела образцовый ретест зеркальной зоны поддержки...
Фото
Ключевая ставка ЦБ РФ ожидаемо сохранена на уровне 14%: какие перспективы у долгового рынка в ближайшее время?
ЦБ РФ, как и ожидалось большинством аналитиков, решил сделать паузу в цикле снижения ключевой ставки на фоне усиления ценового давления. В...
Фото
Озон Фармацевтика МСФО 6 мес. 2026 г. - выручка +12%, прибыль +90%
Озон Фармацевтика за полугодие нарастила выручку на 12% до 14,8 млрд руб.  Валовая прибыль выросла на 29% до 7,4 млрд руб. при росте...

теги блога anatolyutkin

....все тэги



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