Очистить веб-сайт (Excel vba) с запросом xml http после установки файла cookie - PullRequest
0 голосов
/ 06 сентября 2018

Я хотел бы очистить веб-сайт (извлечь цену продукта) с одной страницы веб-сайта (с запросом 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 евро.

Вы можете выбрать другой магазин, нажав на значок булавки местоположения в правом верхнем углу страницы.

Большое спасибо за вашу помощь

...