Страницы: 1
RSS
WinHttpRequest получает страницу, отличную от той, что получает браузер
 
Здравствуйте!
Требуется средствами VBA собрать данные о наличии товаров в разных магазинах.
Пример страницы товара: https://superakb.ru/catalogue/varta-sd-77-ach-l-e44_4361/
На странице есть фраза: "В наличие в N магазинах", из html можно выбрать, какие это конкретно магазины.
Проблема в том, что когда я запрашиваю эту же страницу через WinHttpRequest, она выдается немного в другом виде, и там присутствует фраза "Нет в наличие".
Возможно, проблема решилась бы указанием в запросе заголовков, но подбор заголовков наугад ни к чему не привел.
Текущий вариант кода ниже, оставлен только User-Agent.
Код
Sub test_internet()
    addr = "https://superakb.ru/catalogue/varta-sd-77-ach-l-e44_4361/"
    t = 6
    Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    xmlhttp.Open "GET", addr, True
    xmlhttp.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:65.0) Gecko/20100101 Firefox/65.0"
    xmlhttp.Send
    
    If Not xmlhttp.WaitForResponse(t) Then
        MsgBox "timeout", URL: Exit Sub
    End If
 
    txt = xmlhttp.ResponseText
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText txt
        .PutInClipboard
    End With
End Sub
Подскажите, пожалуйста, каких заголовков не хватает, или, если дело не в них, как решить проблему.
Спасибо!
 
Привет!
Может подойдёт ...
Код
Function WebPageText(ByVal sURL As String) As String
    On Error Resume Next
    Set ie = CreateObject("InternetExplorer.Application"):    ' загружаем браузер Internet Explorer
    Таймер = Timer
    ie.Navigate sURL    ' загружаем сайт
    'ie.Visible = 1
    While ie.busy Or (ie.readyState <> 4)
        Application.StatusBar = "Открываю страницу для ячейки: " _
                                & i & ", " & j & ". Осталось сек: " _
                                & 12 - Int(Timer - Таймер)
        DoEvents
        If Timer - Таймер > Abs(12) Then Exit Function
    Wend    ' ждем, пока загрузится страница
    WebPageText = ie.Document.body.innerText    ' считываем текст веб-страницы
    ie.Quit: Set ie = Nothing     ' закрываем браузер
End Function
Изменено: Inexsu - 04.03.2019 00:39:23
Сравнение прайсов, таблиц - без настроек
 
Насколько я понимаю, это выдаст текст без HTML-тегов. Семантический анализ намного проще проводить с тегами. Кроме того, конкретно в этом случае список магазинов "скрыт", и при загрузке текста через браузер не будет виден.
 
отличие в том, что в браузере отрабатывают скрипты, меняя HTML код

в коде от Inexsu замените .innerText на .outerHtml
и будут вам все теги
 
Все получилось, спасибо за помощь!
 
спасибо за timeout
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх