Использование MSXML в скрипте VBA для извлечения данных веб-сайта

У меня есть следующий код из http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-website-that-requires-a-login/#comment-60553

Sub GetTable()
Dim xml As Object ' MSXML2.XMLHTTP60
Dim htmlDoc As Object ' MSHTML.HTMLDocument
Dim htmlBody As Object ' MSHTML.HTMLBody
Dim ieTable As Object
Dim clip As DataObject

Set xml = GetMSXML

With xml
      .Open "POST", "https://web.site", False
      .send "username=myname&password=mypassword"""
End With
With xml
      .Open "POST", "https://web.site/anotherpage", False
End With
Set htmlDoc = CreateHTMLDoc
Set htmlBody = htmlDoc.Body
htmlBody.innerHTML = xml.responseText

Set ieTable = htmlBody.all.Item("report")

    'copy the tables html to the clipboard and paste to teh sheet
  If Not ieTable Is Nothing Then
        Set clip = New DataObject
        clip.SetText "<html>" & ieTable.outerHTML & "</html>"
        clip.PutInClipboard
        Range("A1").Select
        ActiveSheet.PasteSpecial "Unicode Text"""
    End If

End Sub

Function CreateHTMLDoc() As Object ' MSHTML.HTMLDocument
Set CreateHTMLDoc = CreateObject("htmlfile")
End Function

Function GetMSXML() As Object ' MSXML2.XMLHTTP
On Error Resume Next
  Set GetMSXML = CreateObject("MSXML2.XMLHTTP")
End Function

Используя этот код, я пытаюсь получить доступ к сайту web.site и передать ему имя пользователя и пароль для входа в систему, прежде чем перейти на другую страницу сайта, прежде чем копировать содержимое таблицы (результаты) в лист1 книги excel.

Я попытался отладить это с помощью f8, но без визуального браузера, который я получил бы, если бы следил за этой страницей http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-веб-сайт,требующийвходавсистему/ тогда немного сложно увидеть, что именно происходит и где происходит сбой.


person Aaran    schedule 20.11.2018    source источник
comment
Вы можете написать ответ для начала или использовать тестер API, такой как Postman, чтобы увидеть, что такое ответ сервера.   -  person QHarr    schedule 20.11.2018
comment
Спасибо, а не могли бы вы подробнее написать ответы?   -  person Aaran    schedule 20.11.2018
comment
Debug.Print xml.Status, xml.responseText   -  person QHarr    schedule 20.11.2018
comment
1. Убедитесь, что вы отправляете свои учетные данные по правильному URL-адресу. 2. Службы/веб-сайты, требующие входа в систему, обычно имеют некоторые средства управления клиентом/сеансом. Проверьте заголовок «Set-Cookie» в ответе сервера, убедитесь, что вы включили его в последующие запросы (особенно после входа в систему), поскольку этот файл cookie связан с вашим сеансом. 3. Может быть полезно открыть интернет-браузер, открыть инструменты разработчика (в Chrome это можно сделать, нажав F12) и отслеживать запросы, которые появляются на вкладке Network при входе вручную, чтобы увидеть запросы, которые необходимо эмулировать. .   -  person chillin    schedule 20.11.2018


Ответы (1)


Попробуйте следующий код, чтобы помочь вам перейти на сайт, если у вас есть какие-либо вопросы, просто оставьте комментарий на моем канале https://www.youtube.com/watch?v=hfAhmae4iqA ;

Dim IEe As InternetExplorer
    Dim doc, element
    Set IEe = New InternetExplorer

    IEe.Visible = False 'make true if you want to the internet explorer 
    IEe.Navigate "YOUR WEBSITE"

       Do While IEe.ReadyState = 4: DoEvents: Loop
    Do Until IEe.ReadyState = 4: DoEvents: Loop

Set element = IEe.Document.getElementByID(INSERT ELEMENT ID) 'RIGHT CLICK ON WEBSITE AND SAY INSPECT ELEMENT CLICK THE MOUSE ICON AND THEN CLICK THE TEXT BOX WHERE THE PASSWORD OR USERNAME SHOULD BE INSERTED 

element.Value = "USERNAME"

Set element = IEe.Document.getElementByID(INSERT ELEMENT ID) 'THE FIRST IS FOR USERNAME THE NEXT FOR PASSWORD 

element.Value = "PASSWORD" 'remember storing a password in a macro is not safe  
person kuv    schedule 16.03.2020
comment
Быстрый вопрос: вы просто отвечаете на максимально возможное количество вопросов, чтобы получить ссылку на свой канал на YouTube? Почему бы не добавить свой канал в свой профиль, и если людям понравятся ответы, которые вы даете, они смогут продолжить расследование. На данный момент это начинает ощущаться как спам. Если я ошибаюсь, то прошу прощения. Просто вы отвечаете на вопросы 4-5-летней давности, например этот - person Darren Bartrup-Cook; 16.03.2020
comment
у меня нет намерения спамить вопросами, которые были заданы так давно, просто предлагаю понять, где я могу помочь, если у кого-то возникнет аналогичная проблема и он наткнется на ветку. - person kuv; 16.03.2020