Необходимо подгружать исторические данные в Excel с сайта http://ru.investing.com. Сделать параметрический web запрос не получается, Web разработчик отшлифовал ссылки для удобства поискового паука и в них нет инфы ни на сам инструмент, ни на даты начала и конца периода, ни на таймфрейм. Иначе можно было бы подставлять в строку адреса страницы нужный код, отражающий таймфрейм, дату начала и т.д.
Какие есть варианты реализации данной задачи с помощью VBA ?
Необходимо подгружать исторические данные в Excel с сайта http://ru.investing.com. Сделать параметрический web запрос не получается, Web разработчик отшлифовал ссылки для удобства поискового паука и в них нет инфы ни на сам инструмент, ни на даты начала и конца периода, ни на таймфрейм. Иначе можно было бы подставлять в строку адреса страницы нужный код, отражающий таймфрейм, дату начала и т.д.
Какие есть варианты реализации данной задачи с помощью VBA ?Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Вторник, 09.09.2014, 10:28
Нужно получить исторические данные по инструменту за выбранный период. К примеру, берём фондовый индекс S&P500 - Прошлые данные (http://ru.investing.com/indices/us-spx-500-historical-data). Перед нами открывается вожделенная таблица с цифрами. Она то нам и нужна. Но по умолчанию сайт выдаёт таблицу, в которой только 20 записей - строк и ВСЁ. Эти 20 записей можно загрузить в Excel без проблем обычным Web запросом, но если попробовать там внутри web запроса поменять период данных, взяв к примеру полгода, то всё-равно загрузится один месяц. т.е. 20 строк. Вот поэтому то и нужно решение через макрос на VBA или парсинг на VBA. Слаб в теории, только учусь, поэтому никак не могу сообразить как это сделать. И ссылки на страницы скупые, т.е. обработанные скриптом, чтобы они были короче и красивее.
(http://ru.investing.com/indices/us-spx-500-historical-data). Только один инструмент прописывается (выделил красным). В параметрическом web запросе на его место теоретически можно было бы подставлять другой инструмент и тем самым загружать другие данные другого инструмента. Ну а период где и как взять, таймфрейм? Вот в чём проблема.
Наверное можно было бы реализовать загрузку данных в виде архива с других ресурсов макросом, потом его распаковать и т.д. ...но это длинный путь и наверное сложнее.
Нужно получить исторические данные по инструменту за выбранный период. К примеру, берём фондовый индекс S&P500 - Прошлые данные (http://ru.investing.com/indices/us-spx-500-historical-data). Перед нами открывается вожделенная таблица с цифрами. Она то нам и нужна. Но по умолчанию сайт выдаёт таблицу, в которой только 20 записей - строк и ВСЁ. Эти 20 записей можно загрузить в Excel без проблем обычным Web запросом, но если попробовать там внутри web запроса поменять период данных, взяв к примеру полгода, то всё-равно загрузится один месяц. т.е. 20 строк. Вот поэтому то и нужно решение через макрос на VBA или парсинг на VBA. Слаб в теории, только учусь, поэтому никак не могу сообразить как это сделать. И ссылки на страницы скупые, т.е. обработанные скриптом, чтобы они были короче и красивее.
(http://ru.investing.com/indices/us-spx-500-historical-data). Только один инструмент прописывается (выделил красным). В параметрическом web запросе на его место теоретически можно было бы подставлять другой инструмент и тем самым загружать другие данные другого инструмента. Ну а период где и как взять, таймфрейм? Вот в чём проблема.
Наверное можно было бы реализовать загрузку данных в виде архива с других ресурсов макросом, потом его распаковать и т.д. ...но это длинный путь и наверное сложнее.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Dim mdoc, HE, t_ype, Name, objIE, HB, R, C Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "res://mshtml.dll/blank.htm" objIE.Document.Write T Cells.ClearContents For Each HE In objIE.Document.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next Set objIE = Nothing End Sub
[/vba]
Цитата
Вытянуть нужное - регулярные выражения:
можно попробовать и без регулярок:
[vba]
Код
Sub test()
T = HistoricalData("01/07/2014", "09/09/2014")
Dim mdoc, HE, t_ype, Name, objIE, HB, R, C Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "res://mshtml.dll/blank.htm" objIE.Document.Write T Cells.ClearContents For Each HE In objIE.Document.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next Set objIE = Nothing End Sub
Да уж, сложная задача поместить оба кода в один модуль :-)
Ну это для Вас может и просто. Ну поместил и что? Ничего не работает. Нужно разбираться. Я понимаю конечно, суть выдана, но есть ещё и детали ...Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Четверг, 11.09.2014, 11:10
Может уже начнем подробнее описывать суть запроса\проблемы? А то нам приходится на кофейной гуще гадать, а это не самый продуктивный способ потратить время.
Может уже начнем подробнее описывать суть запроса\проблемы? А то нам приходится на кофейной гуще гадать, а это не самый продуктивный способ потратить время.SkyPro
Может уже начнем подробнее описывать суть запроса\проблемы? А то нам приходится на кофейной гуще гадать, а это не самый продуктивный способ потратить время.
Виноват. Два дня не мог понять что к чему. В настройках стояло "Обязательное декларирование переменных". Не могу понять, на этом форуме есть возможность удалить сообщение? Вы отреагировали быстрее чем я успел отредактировать свой пост
Может уже начнем подробнее описывать суть запроса\проблемы? А то нам приходится на кофейной гуще гадать, а это не самый продуктивный способ потратить время.
Виноват. Два дня не мог понять что к чему. В настройках стояло "Обязательное декларирование переменных". Не могу понять, на этом форуме есть возможность удалить сообщение? Вы отреагировали быстрее чем я успел отредактировать свой пост Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Пятница, 12.09.2014, 11:05
Удалять сообщения на форуме нельзя. Они могут помочь тем, кто будет искать ответ на схожий вопрос. А в вашем случае поможет либо убирание "Option explicit" из шапки модуля, либо обьявление всех переменных
Удалять сообщения на форуме нельзя. Они могут помочь тем, кто будет искать ответ на схожий вопрос. А в вашем случае поможет либо убирание "Option explicit" из шапки модуля, либо обьявление всех переменных SkyPro
.................................................................... Cells.ClearContents For Each HE In objIE.Document.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next Set objIE = Nothing End Sub
Замечательное решение. Прекрасно работает. Но Cells.ClearContents "убивает" всё, что есть на листе, а хотелось бы очистить только тот диапазон, в который загрузились данные. И хотелось бы загружать данные в активную ячейку, т.е. в выбранную пользователем. Таким образом на лист можно будет загрузить несколько финансовых инструментов.
.................................................................... Cells.ClearContents For Each HE In objIE.Document.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next Set objIE = Nothing End Sub
Замечательное решение. Прекрасно работает. Но Cells.ClearContents "убивает" всё, что есть на листе, а хотелось бы очистить только тот диапазон, в который загрузились данные. И хотелось бы загружать данные в активную ячейку, т.е. в выбранную пользователем. Таким образом на лист можно будет загрузить несколько финансовых инструментов.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Пятница, 12.09.2014, 11:41
Function HistoricalData$(dateFrom$, dateTo$) ............................................................................................................................................ ............................... .send "action=historical_data&curr_id=166&st_date=" & dateFrom & "&end_date=" & dateTo & "&interval_sec=Daily" HistoricalData = .responseText End With Set oXMLHTTP = Nothing End Function
А почему curr_id и interval_sec Вы не внесли в аргументы функции. Это вообще реально или есть в этой функции какие-то ограничения на такое действие?
Function HistoricalData$(dateFrom$, dateTo$) ............................................................................................................................................ ............................... .send "action=historical_data&curr_id=166&st_date=" & dateFrom & "&end_date=" & dateTo & "&interval_sec=Daily" HistoricalData = .responseText End With Set oXMLHTTP = Nothing End Function
А почему curr_id и interval_sec Вы не внесли в аргументы функции. Это вообще реально или есть в этой функции какие-то ограничения на такое действие?Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Пятница, 12.09.2014, 11:56
Не внес, так как показал вам лишь пример. Добавить аргументы вы можете сами по аналогии. Ограничений нет. Проанализировать, какие параметры передаются можно нажав F12 в хроме, выбрав "network".
Не внес, так как показал вам лишь пример. Добавить аргументы вы можете сами по аналогии. Ограничений нет. Проанализировать, какие параметры передаются можно нажав F12 в хроме, выбрав "network". SkyPro