Вы можете избежать расходов браузера и выполнить тот же xhr GET-запрос на странице, которая возвращает json. Вам понадобится парсер json для обработки ответа.
Библиотека Json:
Я использую jsonconverter.bas. Загрузите необработанный код из здесь и добавьте в стандартный модуль JsonConverter . Затем вам нужно перейти VBE> Инструменты> Ссылки> Добавить ссылку в Microsoft Scripting Runtime. Удалите верхнюю строку атрибута из скопированного кода.
Я показываю частичную реализацию, которая выполняет запросы для различных категорий и продуктов и использует как полный, так и частичный поиск строк. Это частичная реализация, в которой я читаю ответы в объекты json, а также печатаю строки json, но не пытаюсь получить доступ ко всем элементам внутри объекта json. Это может быть уточнено более подробно от вас. Для демонстрационных целей я получаю доступ к ("result")("data")
, который дает вам информацию о цене и названии. Часть исходного ответа json имеет html
в качестве значения для средства доступа ("result")("html")
. Это описание информации, например, сокет / процессор с элементами материнской платы.
Option Explicit
Public Sub ProductSearches()
Dim xhr As Object, category As String, items()
Set xhr = CreateObject("MSXML2.XMLHTTP")
category = "motherboard"
items = Array("Gigabyte B450M DS3H", "MSI B450 TOMAHAWK", "random string")
PrintListings items, xhr, category
category = "memory"
items = Array("Corsair Vengeance") 'partial search
PrintListings items, xhr, category
End Sub
Public Function GetListings(ByVal xhr As Object, ByVal category As String, ByVal item As String) As Object
Dim json As Object
With xhr
.Open "GET", "https://pcpartpicker.com/products/" & category & "/fetch/?xslug=&location=&search=" & item, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
Set json = JsonConverter.ParseJson(.responseText)("result")("data")
Set GetListings = json
End With
End Function
Public Sub PrintListings(ByRef items(), ByVal xhr As Object, ByVal category As String)
'Partially implemented. You need to decide what to do with contents of json object
Dim json As Object, i As Long
For i = LBound(items) To UBound(items)
Set json = GetListings(xhr, category, items(i))
'Debug.Print Len(JsonConverter.ConvertToJson(json)) ' Len(JsonConverter.ConvertToJson(json)) =2 i.e {} then no results
Debug.Print JsonConverter.ConvertToJson(json) 'demo purposes only
'do something with json
Next
End Sub
Разбор Json:
Подробнее об использовании JsonConverter и разбореJSON в VBA здесь , здесь и здесь .