【发布时间】:2019-04-22 16:29:32
【问题描述】:
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 并将用户名和密码传递给登录,然后继续访问网站上的另一个页面,然后将表格的内容(结果)复制到 excel 的 sheet1工作簿。
我尝试使用 f8 进行调试,但没有可视化浏览器,如果我要关注此页面 http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-website-that-requires-a-login/ 那么它有点难以确切地看到正在发生的事情以及失败的地方。
【问题讨论】:
-
您可以为初学者写出响应或使用 API 测试器(例如 Postman)来查看服务器响应是什么。
-
谢谢,你能详细说明一下写出回复吗?
-
Debug.Print xml.Status, xml.responseText
-
1.确保您将凭据发布到正确的 URL, 2. 需要登录的服务/网站通常具有某种客户端/会话管理方式。检查服务器响应中的“Set-Cookie”标头,确保将其包含在后续请求中(尤其是在您登录后)——因为该 cookie 与您的会话相关联。 3. 打开 Internet 浏览器,打开开发人员工具(在 Chrome 中,您可以通过按
F12来完成此操作)并在您手动登录时监控出现在Network选项卡下的请求,这可能会有所帮助——查看需要模拟的请求。