HTTP-запрос REST API:
Ваш текущий метод не позволяет загружать страницу полностью, как вы заметили. Вы можете сформулировать REST API XMLHTTPrequest , используя URLEncode для передачи закодированной строки URL в API. Сервер отправляет обратно ответ JSON, содержащий значение, которое вы ищете, а также множество другой информации.
Я демонстрирую два метода извлечения информации о цене из возвращенной строки JSON: ① Использование функции Split
для извлечения цены путем генерации подстрок до тех пор, пока не останется нужная строка; ② Использование JSONParser
для навигации по структуре JSON и возврата требуемого значения.
Код:
Следующее использует Split
для извлечения значения.
Option Explicit
Public Sub GetPrice()
Const BASE_URL As String = "https://www.ah.nl/service/rest/delegate?url="
Dim URL As String, sResponse As String, price As String
URL = BASE_URL & Application.WorksheetFunction.EncodeURL("/producten/product/wi3640/lu-bastogne-biscuits-original")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
price = Split(Split(sResponse, """now"":")(1), "}")(0)
Debug.Print price
End Sub
Анализ ответа JSON:
Использование Split
:
Вы можете прочитать весь ответ JSON в объект JSON, используя анализатор JSON, например JSONConverter.bas . Затем проанализируйте этот объект по цене. Я обнаружил, что проще использовать функцию Split для извлечения необходимой информации, показанной ниже:
Split возвращает начинающийся с нуля одномерный массив, содержащий указанное количество подстрок на основе разбиения входной строки по указанному разделителю.
В строке
price = Split(Split(sResponse, """now"":")(1), "}")(0)
У меня есть два вложенных оператора Split. Они последовательно разбивают ответную строку JSON, чтобы извлечь цену 1.55
.
В первом разделении используется "now":
в качестве разделителя, в результате чего получается массив следующим образом:
Целевая цена, которую вы видите, находится в строке в позиции 1.
Итак, эта строка извлекается с помощью:
Split(sResponse, """now"":")(1)
Затем нам нужно получить только цену, поэтому снова используйте Split
, чтобы получить 1.55
, используя разделитель "}"
:
Split(Split(sResponse, """now"":")(1), "}")
В результате получается следующий массив (укороченный как довольно длинный):
Цена, которую мы хотим, теперь находится в позиции 0 в новом массиве, поэтому мы можем использовать следующее для извлечения ответа.
price = Split(Split(sResponse, """now"":")(1), "}")(0)
Использование анализатора JSON:
Если вы хотите пересечь структуру json, вы должны использовать следующее:
Dim json As Object
Set json = JsonConverter.ParseJson(sResponse)("_embedded")("lanes")(5)("_embedded")("items")(1)("_embedded")("product")("priceLabel")
Debug.Print json("now")
После загрузки и добавления JSONConverter.bas
вы добавляете ссылку на Microsoft Scripting Runtime
через VBE > Tools > References
.
выше Set json
кодовое выражение представляет путь к цене, как видно из структуры JSON ниже. Я свернул некоторые детали, чтобы прояснить путь. Вы должны вставить вышеуказанную пару строк в исходный код вместо строки Split
.
На приведенной выше схеме []
обозначает объект collection
, к которому необходимо получить доступ по индексу, например, JsonConverter.ParseJson(sResponse)("_embedded")("lanes")(5)
. {}
обозначает объект dictionary
, к которому можно получить доступ, например, с помощью клавиши, например. JsonConverter.ParseJson(sResponse)("_embedded")("lanes")(5)("_embedded")
. Синтаксис в моей строке
Set json = JsonConverter.ParseJson(sResponse)("_embedded")("lanes")(5)("_embedded")("items")(1)("_embedded")("product")("priceLabel")
демонстрирует различный синтаксис для навигации по этим двум типам объектов.