получать серию курсов валют от вебси - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь автоматизировать получение курсов валют с веб-сайта для небольшого списка валют на определенную дату.

Я хотел бы получить совет

Я попробовал два метода:-

1) обновление полей на веб-странице и попытка получить скорость 2) выдача запроса на сервер с использованием xmlhttp

, но ни один из них не сработал

, первый метод, который я попытался, былобновите поля на странице: -

objIE.navigate ("https://www.oanda.com/currency/converter/")

Do
    DoEvents
Loop Until objIE.readyState = READYSTATE_COMPLETE


objIE.document.getElementById("quote_currency_input").Value = "Utd. Arab Emir Dirham"
objIE.document.getElementById("base_currency_input").Value = "Pound Sterling"
objIE.document.getElementById("end_date_input").Value = "Apr 6, 2019"
objIE.document.getElementById("form_quote_currency_hidden").Value = "AED"
objIE.document.getElementById("form_base_currency_hidden").Value = "GBP"
objIE.document.getElementById("form_end_date_hidden").Value = "2019-04-06"
objIE.document.getElementById("form_end_date_hidden").FireEvent "onchange"

.Range("A1").Offset(i - 1, 1).Value = objIE.document.getElementById("base_amount_input").Value

Затем я попытался использовать xmlhttp: -

Set xmlhttp = CreateObject("MSXML2.serverXMLHTTP")

With xmlhttp
    .Open "POST", "https://www.oanda.com/currency/converter/", False
    .setRequestHeader "Content-Type", "application/json"
    .send "update?base_currency_0=AUD&quote_currency=GBP&end_date=2019-04-06&view=details&id=1&action=C&"
    Debug.Print .responseText
End With

, но я не мог понять, как просто получить ставку !!!

1 Ответ

0 голосов
/ 13 апреля 2019

Это сработало для меня.Сервер отвечает JSON (который VBA не поддерживает изначально, но есть доступные библиотеки / модули, которые помогут вам разобрать его).

Option Explicit

Private Sub GetRate()

    Dim xmlhttp As MSXML2.ServerXMLHTTP60 ' Add a reference for early binding.
    Set xmlhttp = New MSXML2.ServerXMLHTTP60

    Const BASE_URL As String = "https://www.oanda.com/currency/converter/update?"

    Dim urlWithQueryString As String
    urlWithQueryString = BASE_URL & "base_currency_0=" & Application.EncodeURL("AUD") & "&quote_currency=" & Application.EncodeURL("GBP") & "&end_date=" & Application.EncodeURL("2019-04-06") & "&view=details&id=1&action=C"

    With xmlhttp
        .Open "GET", urlWithQueryString, True

        .setRequestHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*"
        .setRequestHeader "Referer", "https://www.oanda.com/currency/converter/"
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
        .setRequestHeader "X-Prototype-Version", "1.7"
        .setRequestHeader "X-Requested-With", "XMLHttpRequest"
        .send
        .waitForResponse

        MsgBox .responseText
    End With
End Sub
  • Ни одно из значений параметров запроса (в приведенном выше примере)) необходимо кодирование URL (без небезопасных символов URL), но я все равно это сделал.
  • Вы можете преобразовать вышеприведенное в функцию, которая принимает аргументы для base_currency, quote_currency и end_date.
  • Я не мог понять, для каких целей служат параметры id и action.Я мог видеть, что id увеличивался на 1 с каждым запросом, который я делал в своем браузере (возможно, это какой-то счетчик на стороне клиента - или, возможно, он используется для облегчения кэширования запросов сервером).

После того, как вы проанализировали ответ в структуре, я думаю, что вы хотите, чтобы ставки присутствовали в:

JSONresponse["data"]["rate_data"]["bidRates"][0]

Если ваша версия Excel содержит Power Query, вы можете вместо этого использовать еезапросить ставку.Преимущества будут в том, что он может обрабатывать JSON (изначально) и может возвращать таблицу Excel.Недостатком является то, что Power Query имеет собственный язык программирования M, но эквивалент в M будет выглядеть примерно так:

let
    url = "https://www.oanda.com/currency/converter/update",
    requestParameters = [base_currency_0 = "GBP", quote_currency = "AUD", end_date = "2019-04-06", view = "details", id = "1", action = "C"],
    requestHeaders = [
        Accept = "text/javascript, text/html, application/xml, text/xml, */*",
        Referer = "https://www.oanda.com/currency/converter/",
        #"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
        #"X-Prototype-Version" = "1.7",
        #"X-Requested-With" = "XMLHttpRequest"
    ],
    request = Web.Contents(url, [Query = requestParameters, Headers = requestHeaders]),
    json = Json.Document(request),
    rate = json[data][rate_data][bidRates]{0}
in
    rate

, который вы реализуете (в зависимости от версии Excel) с помощью: Excel > Data > Get Data > From Other Sources > Blank Query > Advanced Editor (top left) > replace any code with code above > Close & Load (top left) > Load to new sheet.(Это было бы более полезно, если бы вы загружали на лист более одного значения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...