Я хотел бы очистить веб-сайт (извлечь цену продукта) с одной страницы веб-сайта (с запросом XML HTTP). Но прежде чем этот скрипт запустится, мне нужно сначала выбрать правильный магазин (сохраненный в переменной cookie браузера или включенный любым другим способом / запросом, если это возможно), поскольку цены в разных магазинах разные.
Я создал рабочий код, но его запуск занимает очень много времени, поэтому я предполагаю, что должен быть способ быстрее и чище :). Мне также нужно было включить приложение, чтобы дождаться, пока веб-сайт выполнит следующие действия.
Мой текущий код VBA:
- запускает HTTP-запрос IE для открытия сайта, и в несколько кликов выбирает желаемое хранилище и сохраняет его в cookie (как должен делать пользователь сайта)
- следующая страница продукта запрашивается с другим HTTP-запросом IE, и данные извлекаются. Я обнаружил, что нельзя использовать HTTP-запрос XML, потому что он не будет использовать значение cookie с правильным хранилищем, отображая правильную цену.
- Цена, по которой я иду (в приведенном ниже примере), составляет E 1,39 вместо E 1,48 (когда не используется значение cookie и не выбран магазин).
- Значение файла cookie сохраняется в файле cookie. "Www.jumbo.com/cookie/HomeStore Содержимое содержит тег store, который известен заранее и, если возможно, может быть жестко закодирован в запросе.
Выбор правильного хранилища (и сохранение его в файле cookie браузера)
Sub SetStore()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLSearchbox As MSHTML.IHTMLElement
Dim HTMLSearchboxes As MSHTML.IHTMLElementCollection
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim HTMLSearchButton As MSHTML.IHTMLElement
Dim HTMLSearchButtons As MSHTML.IHTMLElementCollection
Dim HTMLStoreID As MSHTML.IHTMLElement
Dim HTMLStoreIDs As MSHTML.IHTMLElementCollection
Dim HTMLSaveStore As MSHTML.IHTMLElement
Dim HTMLSaveStores As MSHTML.IHTMLElementCollection
'set on False to hide IE screen
IE.Visible = True
'navigate to url with limited content
IE.navigate "https://www.jumbo.com/content/algemene-voorwaarden/"
Do While IE.readyState <> READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLButton In HTMLButtons
If HTMLButton.getAttribute("data-jum-action") = "openHomeStoreFinder" Then
HTMLButton.Click
Exit For
End If
Next HTMLButton
Application.Wait Now + #12:00:02 AM#
Set HTMLSearchboxes = HTMLDoc.getElementsByTagName("input")
For Each HTMLSearchbox In HTMLSearchboxes
If HTMLSearchbox.getAttribute("id") = "searchTerm__DkKYx4XylsAAAFJktpb2Guy" Then
'input field store name/location to show search results
HTMLSearchbox.Value = "Oosterhout"
Application.Wait Now + #12:00:03 AM#
HTMLSearchbox.Click
Exit For
End If
Next HTMLSearchbox
Set HTMLSearchButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLSearchButton In HTMLSearchButtons
If HTMLSearchButton.getAttribute("data-jum-filter") = "search" Then
HTMLSearchButton.Click
Exit For
End If
Next HTMLSearchButton
Application.Wait Now + #12:00:05 AM#
Set HTMLStoreIDs = HTMLDoc.getElementsByTagName("li")
For Each HTMLStoreID In HTMLStoreIDs
'oosterhout = YC8KYx4XB88AAAFIDcIYwKxJ
'nieuwegein = 84IKYx4XziUAAAFInSYYwKrH
'vaassen = JYYKYx4XC1oAAAFItvcYwKxJ
'brielle = OG8KYx4XP4wAAAFIlsEYwKxK
If HTMLStoreID.getAttribute("data-jum-store-id") = "YC8KYx4XB88AAAFIDcIYwKxJ" Then
HTMLStoreID.Click
Application.Wait Now + #12:00:03 AM#
Exit For
End If
Next HTMLStoreID
Set HTMLSaveStores = HTMLDoc.getElementsByTagName("button")
For Each HTMLSaveStore In HTMLSaveStores
If HTMLSaveStore.getAttribute("data-jum-action") = "saveHomeStore" Then
HTMLSaveStore.Click
Exit For
End If
Next HTMLSaveStore
'IE.Quit
End Sub
Извлечение данных со страницы продукта (IE HTTP-запрос, работа со значением файла cookie)
Sub GetJumboPriceIE()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-bastogne-koeken-original-260g/173140KST/"
IE.Visible = False
IE.navigate SKU_url
Do While IE.readyState <> READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
IE.Quit
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
Приведенный выше код работает, но хотел бы использовать код XML-запроса XML, как показано ниже (но с использованием правильного хранилища). Цена 1,39 печатается.
Извлечение данных со страницы продукта (с использованием XML-запроса HTTP), но значение cookie не используется
Sub GetJumboPriceXML()
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-bastogne-koeken-original-260g/173140KST/"
XMLReq.Open "GET", SKU_url, False
XMLReq.send
If XMLReq.Status <> 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
Этот код не использует правильный магазин и выводит цену, которой я не ищу (печатается цена 1,48).
Подведем итог:
Когда магазин не выбран (файлы cookie не установлены), следующий URL теперь дает цену € 1,48.
Мне бы хотелось, чтобы сценарий VB установил для магазина значение «Jumbo Oosterhout Nieuwe Bouwlingstraat», а затем очистил предварительно определенный список URL-адресов продуктов и извлек их цены (указанный выше URL дает 1,39 евро).
Затем установите магазин в другом местном магазине «Jumbo Brielle Thoelaverweg» и очистите идентичный список URL-адресов продуктов. Приведенный выше URL дает 1,48 евро.
Вы можете выбрать другой магазин, нажав на значок булавки местоположения в правом верхнем углу страницы.
Большое спасибо за вашу помощь