Привет всем! Стоит задача собрать исторические котировки по бумаге с сайта 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)
Помогите решить эту проблему?
Возвожно, были проблемы с сайтом... Возможно, неправильно вызываете функцию.
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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть массив [1, 2, 3, 4], а нужно получить [2, 1, 4, 3]Может в php есть готовое решение? А если нет, то можно пожалуйста пример такой функции
JoomlaПодскажите пожалуйста, как создать позицию для модуля или материала
Пытаюсь разобраться с instagram APIМне нужен бот, который будет автоматически ставить всем моим подписчикам лайк
ЗдравствуйтеПрошу идеи, предложения или еще что-то по реализации данного вопроса