Запрос асинхронный. Отправляется при изменении параметров на странице.
Мощнейший инструмент. Не знал. HistoricalDataAjax уловил. Всё видно. Так ведь наверное также можно и со страницы http://ru.investing.com/indices/us-spx-500 передаваемые данные вычислить? Если менять таймфреймы на графике, к примеру -5Н- на -1D- ? Можно эти данные в ту функцию вставить?
Запрос асинхронный. Отправляется при изменении параметров на странице.
Мощнейший инструмент. Не знал. HistoricalDataAjax уловил. Всё видно. Так ведь наверное также можно и со страницы http://ru.investing.com/indices/us-spx-500 передаваемые данные вычислить? Если менять таймфреймы на графике, к примеру -5Н- на -1D- ? Можно эти данные в ту функцию вставить?
Попытался проделать нечто аналогичное, но с сайтом Yahoo.com. Однако положительного результата не добился. В Вашем случае в окне Immediate данные встают ровными рядами. В моей пробе почему то получается какая то "каша", из которой что-либо извлечь очень сложно, да и осмыслить полученное тоже. Не могу вникнуть, почему так получается?
[vba]
Код
Sub Get_Web() Dim url As String, Data As String Dim XMLHTTP
Попытался проделать нечто аналогичное, но с сайтом Yahoo.com. Однако положительного результата не добился. В Вашем случае в окне Immediate данные встают ровными рядами. В моей пробе почему то получается какая то "каша", из которой что-либо извлечь очень сложно, да и осмыслить полученное тоже. Не могу вникнуть, почему так получается?
[vba]
Код
Sub Get_Web() Dim url As String, Data As String Dim XMLHTTP
Dim aTable, N, M, TB Dim html, i, k Set html = CreateObject("htmlfile") html.write XMLHTTP.responsetext Dim S As String For Each aTable In html.GetElementsByTagName("table") If aTable.className = "yfnc_datamodoutline1" Then For Each TB In aTable.GetElementsByTagName("tr") S = "" For Each N In TB.GetElementsByTagName("th") S = S & " | " & N.innertext Next If Len(S) = 0 Then For Each N In TB.all S = S & " | " & N.innertext Next End If Debug.Print S Next End If Next
[/vba]
добавь строки в код после своего кода: [vba]
Код
Debug.Print Data
Dim aTable, N, M, TB Dim html, i, k Set html = CreateObject("htmlfile") html.write XMLHTTP.responsetext Dim S As String For Each aTable In html.GetElementsByTagName("table") If aTable.className = "yfnc_datamodoutline1" Then For Each TB In aTable.GetElementsByTagName("tr") S = "" For Each N In TB.GetElementsByTagName("th") S = S & " | " & N.innertext Next If Len(S) = 0 Then For Each N In TB.all S = S & " | " & N.innertext Next End If Debug.Print S Next End If Next
Sub Get_Web() Dim url As String, X() url = "http://finance.yahoo.com/q/hp?s=%5EDJI+Historical+Prices" X = Get_MMM(url) Range("A2").Resize(UBound(X) + 1, UBound(X, 2) + 1) = X
End Sub Function Get_MMM(url As String) Dim Data As String Dim XMLHTTP, RegExp, X() ReDim X(0, 0) Set XMLHTTP = CreateObject("MSXML2.XMLHTTP") 'CreateObject("MSXML2.XMLHTTP") CreateObject("Microsoft.XMLHTTP") With XMLHTTP .Open "GET", url, False '----------------------------------------------------------------------GET POST .setRequestHeader "Accept", "text/plain, */*; q=0.01" .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .setRequestHeader "Host", "finance.yahoo.com" .setRequestHeader "Accept-Encoding", "gzip,deflate" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .setRequestHeader "Accept-Language", "uk-UA,uk;q=0.8,ru;q=0.6,en-US;q=0.4,en;q=0.2,de;q=0.2" .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36"
bRes = RegExp.test(Data) If bRes Then Set oMatches = RegExp.Execute(Data) ReDim X(oMatches.Count, 6)
For n = 0 To oMatches.Count - 1 X(n, 0) = oMatches(n).subMatches(0) For i = 1 To oMatches(n).subMatches.Count - 1 X(n, i) = Val(Replace(oMatches(n).subMatches(i), ",", "")) Next Next End If Get_MMM = X End Function
[/vba]
Можно так
[vba]
Код
Sub Get_Web() Dim url As String, X() url = "http://finance.yahoo.com/q/hp?s=%5EDJI+Historical+Prices" X = Get_MMM(url) Range("A2").Resize(UBound(X) + 1, UBound(X, 2) + 1) = X
End Sub Function Get_MMM(url As String) Dim Data As String Dim XMLHTTP, RegExp, X() ReDim X(0, 0) Set XMLHTTP = CreateObject("MSXML2.XMLHTTP") 'CreateObject("MSXML2.XMLHTTP") CreateObject("Microsoft.XMLHTTP") With XMLHTTP .Open "GET", url, False '----------------------------------------------------------------------GET POST .setRequestHeader "Accept", "text/plain, */*; q=0.01" .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .setRequestHeader "Host", "finance.yahoo.com" .setRequestHeader "Accept-Encoding", "gzip,deflate" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .setRequestHeader "Accept-Language", "uk-UA,uk;q=0.8,ru;q=0.6,en-US;q=0.4,en;q=0.2,de;q=0.2" .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36"
bRes = RegExp.test(Data) If bRes Then Set oMatches = RegExp.Execute(Data) ReDim X(oMatches.Count, 6)
For n = 0 To oMatches.Count - 1 X(n, 0) = oMatches(n).subMatches(0) For i = 1 To oMatches(n).subMatches.Count - 1 X(n, i) = Val(Replace(oMatches(n).subMatches(i), ",", "")) Next Next End If Get_MMM = X End Function
Гениально !!! Но дело в том, что своими экспериментами я рассчитывал получить нечто подобное:
чтобы потом воспользоваться Вашим макросом из этой же темы (Сообщение № 8) и вывести всё на лист. Но тут, чувствую что-то я в тупике, потому как картинка то совсем другая . В регулярных выражениях то я не силён, если не сказать большего.
История вопроса. (Для ясности). Дело в том, что страница с Индексом Dow Jones (http://finance.yahoo.com/q/hp?s=^DJI+Historical+Prices) не формирует внизу таблицы ссылку на скачивание файла ".csv" - Download to Spreadsheet, в котором были бы сосредоточены все данные за выбранный период. Сайт выводит только кусок данных в виде таблицы с фиксированным количеством строк. Точнее - разбивает запрашиваемый период постранично, выдавая данные таблицами установленного размера. У других индексов, к примеру таких как S&P 500 (http://finance.yahoo.com/q/hp?s=^GSPC+Historical+Prices) такая ссылка формируется. Поэтому можно взять ссылку, вставить в неё переменные периода, названия инструмента и качать такие файлы циклом. С Индексом Dow Jones такая схема не прокатила. Вот я и решил попробовать получить все данные по инструменту через запросчик (Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")). Ну а в ответ прилетела "каша".
Гениально !!! Но дело в том, что своими экспериментами я рассчитывал получить нечто подобное:
чтобы потом воспользоваться Вашим макросом из этой же темы (Сообщение № 8) и вывести всё на лист. Но тут, чувствую что-то я в тупике, потому как картинка то совсем другая . В регулярных выражениях то я не силён, если не сказать большего.
История вопроса. (Для ясности). Дело в том, что страница с Индексом Dow Jones (http://finance.yahoo.com/q/hp?s=^DJI+Historical+Prices) не формирует внизу таблицы ссылку на скачивание файла ".csv" - Download to Spreadsheet, в котором были бы сосредоточены все данные за выбранный период. Сайт выводит только кусок данных в виде таблицы с фиксированным количеством строк. Точнее - разбивает запрашиваемый период постранично, выдавая данные таблицами установленного размера. У других индексов, к примеру таких как S&P 500 (http://finance.yahoo.com/q/hp?s=^GSPC+Historical+Prices) такая ссылка формируется. Поэтому можно взять ссылку, вставить в неё переменные периода, названия инструмента и качать такие файлы циклом. С Индексом Dow Jones такая схема не прокатила. Вот я и решил попробовать получить все данные по инструменту через запросчик (Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")). Ну а в ответ прилетела "каша".Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Пятница, 07.11.2014, 11:54
Переменную объявить надо Dim Data As String,bRes As Boolean
Да уже понял, и не одну (Dim bRes As Boolean, oMatches As Object, N As Long, i As Long) Это для тех кто шёл мимо. Всё отлично работает, если не считать что шапку не выводит. С регулярными выражениями, вижу, Вы на дружеской ноге !!! Но дело не в этом. Хитрость моя, вижу не сработала. Получаем только те 66 строк, которые сайт в таблицу выдаёт.
[vba]
Код
With XMLHTTP .Open "GET", url, False .............................................................................................
.send "s=%5EDJI&a=01&b=3&c=2010&d=10&e=4&f=2014&g=d" End With
[/vba] "s=%5EDJI&a=01&b=3&c=2010&d=10&e=4&f=2014&g=d" - это запрос на период с 3.02.2010 до 4.11.2014. А выдаёт только 66 строк. С 6.11.2014 по 06.08.2014. Вторая, третья, четвёртая и т.д. части на других страницах сайта остаются. И почему-то с 6.11.2014, когда в запросе стоит 4.11.2014. Хм. Будем думать. (Хотя для импорта таблицы, минуя стандартный web-запрос - решение получилось очень симпатичное.)
Переменную объявить надо Dim Data As String,bRes As Boolean
Да уже понял, и не одну (Dim bRes As Boolean, oMatches As Object, N As Long, i As Long) Это для тех кто шёл мимо. Всё отлично работает, если не считать что шапку не выводит. С регулярными выражениями, вижу, Вы на дружеской ноге !!! Но дело не в этом. Хитрость моя, вижу не сработала. Получаем только те 66 строк, которые сайт в таблицу выдаёт.
[vba]
Код
With XMLHTTP .Open "GET", url, False .............................................................................................
.send "s=%5EDJI&a=01&b=3&c=2010&d=10&e=4&f=2014&g=d" End With
[/vba] "s=%5EDJI&a=01&b=3&c=2010&d=10&e=4&f=2014&g=d" - это запрос на период с 3.02.2010 до 4.11.2014. А выдаёт только 66 строк. С 6.11.2014 по 06.08.2014. Вторая, третья, четвёртая и т.д. части на других страницах сайта остаются. И почему-то с 6.11.2014, когда в запросе стоит 4.11.2014. Хм. Будем думать. (Хотя для импорта таблицы, минуя стандартный web-запрос - решение получилось очень симпатичное.)Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Пятница, 07.11.2014, 11:52
Ничего себе "Только учусь". Это невероятно. Я думал, у этой задачи в принципе НЕТ решения. Ведь Yahoo раскидывает данные по разным страницам. Да ещё и файла на download не предоставляет. Я в шоке. Как удалось собрать ВСЕ данные со всех страниц? Смотрю в код и не могу врубиться как это работает :-)
Ничего себе "Только учусь". Это невероятно. Я думал, у этой задачи в принципе НЕТ решения. Ведь Yahoo раскидывает данные по разным страницам. Да ещё и файла на download не предоставляет. Я в шоке. Как удалось собрать ВСЕ данные со всех страниц? Смотрю в код и не могу врубиться как это работает :-)
В принципе там ничего сложного (кроме регулярок. Для меня это пока тёмный лес) Если рассмотреть внимательно запросы в адресной строке, то всё стоновится на места свои
Можно проанализировать принцип формирования даты и потом в цикле получить все данные Сделать это можно и без регулярных выражений. Я приметно такое делал на другом сайте Если надо могу посидеть-сделать
В принципе там ничего сложного (кроме регулярок. Для меня это пока тёмный лес) Если рассмотреть внимательно запросы в адресной строке, то всё стоновится на места свои
Можно проанализировать принцип формирования даты и потом в цикле получить все данные Сделать это можно и без регулярных выражений. Я приметно такое делал на другом сайте Если надо могу посидеть-сделатьalex77755
Могу помочь в VB6, VBA Alex77755@mail.ru
Сообщение отредактировал alex77755 - Суббота, 08.11.2014, 09:53
Ну что сказать. Красиво конечно, но н-и-ч-е-г-о не понятно. (Я про регулярные выражения. Какую-нибудь бы умную книгу найти надо бы). Но фишка оказалась в том, что этот метод для сайта Yahoo похоже самый рабочий вариант.
Я работал с файлами .csv. Это Те, что внизу таблицы за именем Download to Spreadsheet прячутся. И только пару-тройку дней назад обнаружил, что сами файлы формируются у них не корректно. Значения в столбце Volume превращаются в нули где-то с 15-20-ой строки. Как-то сразу внимания то не обратил, а кода уже нагородил целый лес. Теперь придётся твой вариант брать. Одна беда - осмыслить его сложновато.
Ну что сказать. Красиво конечно, но н-и-ч-е-г-о не понятно. (Я про регулярные выражения. Какую-нибудь бы умную книгу найти надо бы). Но фишка оказалась в том, что этот метод для сайта Yahoo похоже самый рабочий вариант.
Я работал с файлами .csv. Это Те, что внизу таблицы за именем Download to Spreadsheet прячутся. И только пару-тройку дней назад обнаружил, что сами файлы формируются у них не корректно. Значения в столбце Volume превращаются в нули где-то с 15-20-ой строки. Как-то сразу внимания то не обратил, а кода уже нагородил целый лес. Теперь придётся твой вариант брать. Одна беда - осмыслить его сложновато.
Сделать это можно и без регулярных выражений. Я приметно такое делал на другом сайте Если надо могу посидеть-сделать
Конечно интересно. Но Тут наверное не так вопрос стоило бы ставить (ИМХО). Если это будет не так Трудно, и не займёт много времени, или есть уже заготовка, опять же - самому интересно навыки отточить - тогда сделай пожалуйста. Будет Очень Интересно. К тому же меня от этих "космических" регулярных выражений пока бросает в дрожь :-) Надо эту тему поизучать.
Сделать это можно и без регулярных выражений. Я приметно такое делал на другом сайте Если надо могу посидеть-сделать
Конечно интересно. Но Тут наверное не так вопрос стоило бы ставить (ИМХО). Если это будет не так Трудно, и не займёт много времени, или есть уже заготовка, опять же - самому интересно навыки отточить - тогда сделай пожалуйста. Будет Очень Интересно. К тому же меня от этих "космических" регулярных выражений пока бросает в дрожь :-) Надо эту тему поизучать.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Вторник, 11.11.2014, 11:58