Nasdaq.com исторические котировки через VBA POST

243
18 октября 2017, 08:09

Привет всем! Стоит задача собрать исторические котировки по бумаге с сайта nasdaq.com для дальнейшей их обработки и вывода отчета в MS Excel. Язык - VBA. Собственно, в консоли браузера IE и Chrome удалось выяснить, что обмен необходимой информацией идет по методу POST, тело запроса, что подтверждается синтаксисом соответствующей функции JavaScript на самой странице, следующего типа:

[период]|[с загрузкой или без]|[тикер бумаги большими буквами]

, например, тело запроса 5d|false|AAPL должно в формате json передать информацию о котировках компании APPLE за период последние 5 дней.

Вот синтаксис функции на самой странице, которая вызывается для запроса исторических котировок:

function getQuotes(download) {
        if (!download)
            showLoadingSpinner();
        var data = $("[id$='ddlTimeFrame']").val();
        var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol; if (!download) {
            $.ajax({
                type: "POST",
                url: baseUrl,
                data: submitString,
                contentType: "application/json",
                success: function (response) {
                    $("[id$='historicalContainer']").html(response);
                    $(".genTable tbody tr:odd").addClass("genTablealt");
                    hideLoadingSpinner();
                }
            });
        }
        else {
            $("[id$='submitString']").val(submitString);
            $("#getFile").submit();
        }
    }

Далее, я постарался написать функцию VBA, которая бы "эмулировала" такой-же запрос на сервер:

'POST-запрос на сервер
Public Function POST(reff As Variant, body As Variant, headers() As String)
    'reff - адрес сервера
    'body - тело запроса
    'Headers  - массив заголовков. Двухмерный. 1 столбец - название заголовка, 2 столбец - значение
    Dim oHttp As Object
    Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
    oHttp.Open "POST", CStr(reff)
    'заголовки
    For Ii = 1 To UBound(headers)
        If headers(Ii, 1) <> Empty Then
            oHttp.setRequestHeader CStr(headers(Ii, 1)), CStr(headers(Ii, 2))
        End If
    Next Ii
    oHttp.send CStr(body)
    'выводим результат
    POST = oHttp.responseText
End Function

здесь, в строке oHttp.send CStr(body)

как раз и передается тело запроса 5d|false|AAPL в переменной body. В качестве адреса, куда отправляется запрос, использовался адрес самой страницы с котировками.

http://www.nasdaq.com/symbol/aapl/historical

В качестве заголовков (массив headers()), брались:

Content-Type -> application/json

X-Requested-With -> XMLHttpRequest

что имеем в итоге: при запуске происходит "зависание" функции где-то секунд на 30. После чего возвращается ошибка "Время ожидания истекло" на строке кода oHttp.send CStr(body) Помогите решить эту проблему?

Answer 1

Возвожно, были проблемы с сайтом... Возможно, неправильно вызываете функцию.

Sub kk()
Dim hdr(1 To 2, 1 To 2) As String
    hdr(1, 1) = "Content-Type": hdr(1, 2) = "application/json"
    hdr(2, 1) = "X-Requested-With": hdr(2, 2) = "XMLHttpRequest"
    Debug.Print POST("http://www.nasdaq.com/symbol/aapl/historical", "5d|false|AAPL", hdr)
End Sub

Функция выдала результат в Immediate Window практически мгновенно:

   <div id="quotes_content_left_pnlAJAX">
                <h3 class="table-headtag">
                    Results for: 5 Days, From 
    10-OCT-2017  TO 16-OCT-2017 
                </h3>
                <table>
                    <thead>
                        <tr>
                            <th>Date</th>
                            <th>Open</th>
                            <th>
                                <a href="javascript:void(0)" class="tt show-link" id="high" onmouseover="showDelayedToolTip('high')" onmouseout="hideToolTip('high')">
                                    High
                                    <span class="tooltipLG">
                                        <span class="topLG"></span>
                                        <span class="middleLG">
                                            "High" is the highest sales price the stock has achieved during the regular trading hours, the intra-day high.
                                        </span>
                                        <span class="bottomLG"></span>
                                    </span>
                                </a>
                            </th>
                            <th>
                                <a href="javascript:void(0)" class="tt show-link" id="low" onmouseover="showDelayedToolTip('low')" onmouseout="hideToolTip('low')">
                                    Low
                                    <span class="tooltipLG">
                                        <span class="topLG"></span>
                                        <span class="middleLG">
                                            "Low" is the lowest sales price the stock has fallen to during the regular trading hours, the intra-day low.
                                        </span>
                                        <span class="bottomLG"></span>
                                    </span>
                                </a>
                            </th>
                            <th>
                                <a href="javascript:void(0)" class="tt show-link" id="close_last" onmouseover="showDelayedToolTip('close_last')" onmouseout="hideToolTip('close_last')">
                                    Close / Last
                                    <span class="tooltipLG">
                                        <span class="topLG"></span>
                                        <span class="middleLG">
                                            "Close" is the period at the end of the trading session. Sometimes used to refer to closing price.
                                        </span>
                                        <span class="bottomLG"></span>
                                    </span>
                                </a>
                            </th>
                            <th>
                                <a href="javascript:void(0)" class="tt show-link" id="volume" onmouseover="showDelayedToolTip('volume')" onmouseout="hideToolTip('volume')">
                                    Volume
                                    <span class="tooltipLG">
                                        <span class="topLG"></span>
                                        <span class="middleLG">
                                            "Volume" The closing daily official volumes represented graphically for each trading day.
                                        </span>
                                        <span class="bottomLG"></span>
                                    </span>
                                </a>
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>
                                15:09
                            </td>
                            <td>
                                159.86
                            </td>
                            <td>
                                160.87
                            </td>
                            <td>
                                159.23
                            </td>
                            <td>
                                160.2061
                            </td>
                            <td>
                                15,149,124
                            </td>
                        </tr>
                                <tr>
                                    <td>
                                        10/16/2017
                                    </td>
                                    <td>
                                        157.9
                                    </td>
                                    <td>
                                        160
                                    </td>
                                    <td>
                                        157.65
                                    </td>
                                    <td>
                                        159.88
                                    </td>
                                    <td>
                                        24,093,300
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        10/13/2017
                                    </td>
                                    <td>
                                        156.73
                                    </td>
                                    <td>
                                        157.28
                                    </td>
                                    <td>
                                        156.41
                                    </td>
                                    <td>
                                        156.99
                                    </td>
                                    <td>
                                        16,367,780
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        10/12/2017
                                    </td>
                                    <td>
                                        156.35
                                    </td>
                                    <td>
                                        157.37
                                    </td>
                                    <td>
                                        155.7299
                                    </td>
                                    <td>
                                        156
                                    </td>
                                    <td>
                                        16,380,570
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        10/11/2017
                                    </td>
                                    <td>
                                        155.97
                                    </td>
                                    <td>
                                        156.98
                                    </td>
                                    <td>
                                        155.75
                                    </td>
                                    <td>
                                        156.55
                                    </td>
                                    <td>
                                        16,861,450
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        10/10/2017
                                    </td>
                                    <td>
                                        156.055
                                    </td>
                                    <td>
                                        158
                                    </td>
                                    <td>
                                        155.1
                                    </td>
                                    <td>
                                        155.9
                                    </td>
                                    <td>
                                        15,603,520
                                    </td>
                                </tr>
                    </tbody>
                </table>
    </div>
READ ALSO
Как поменять все четные ключи массива на нечетные и наоборот?

Как поменять все четные ключи массива на нечетные и наоборот?

У меня есть массив [1, 2, 3, 4], а нужно получить [2, 1, 4, 3]Может в php есть готовое решение? А если нет, то можно пожалуйста пример такой функции

212
Joomla. В ставка позиции для модуля

Joomla. В ставка позиции для модуля

JoomlaПодскажите пожалуйста, как создать позицию для модуля или материала

189
Instagram API лайк записи

Instagram API лайк записи

Пытаюсь разобраться с instagram APIМне нужен бот, который будет автоматически ставить всем моим подписчикам лайк

220
OpenCart. Запрос БД. Вывод переменных

OpenCart. Запрос БД. Вывод переменных

ЗдравствуйтеПрошу идеи, предложения или еще что-то по реализации данного вопроса

165