如何使用Excel VBA获取POST请求的所有表单数据?

时间:2019-07-09 23:12:33

标签: excel vba post web-scraping

我正在尝试使用Excel VBA刮取使用ASP.NET Ajax开发的网站。我正在使用Microsoft HTML对象库和Microsoft XML v6.0库。我想做的是,当我在第一个文本框中选择一个项目时,将第二个文本框中的所有项目都放在表中。

在第一个文本框中选择一个项目时,将自动加载第二个文本框中的项目。因此,首先我向website发出了GET请求,然后我将所有带有类aspNetHidden的元素都刮掉了。我向未出现在第一个抓取中的POST字符串中添加了两个元素:ctl00$ctl18__ASYNCPOST,以及它们各自的值。我还为第一个文本框ctl00$MainContent$cboDenominacionSocial添加了值。

Sub Macro1()
'
' Macro1 Macro
'
    ' Declare variables
    Dim xmlhttp As New MSXML2.XMLHTTP60
    Dim urlMF As String

    '
    urlMF = "https://www.smv.gob.pe/Frm_EVCP?data=5A959494701B26421F184C081CACF55BFA328E8EBC"

    '

    '
    xmlhttp.Open "GET", urlMF, False
    'xmlhttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3842.0 Safari/537.36"
    'xmlhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
    xmlhttp.send

    Dim bodySMV As New HTMLDocument
    bodySMV.body.innerHTML = xmlhttp.responseText

    Dim topicsSMV As Object
    Dim topicElem As Object

    Set topicsSMV = bodySMV.getElementsByClassName("aspNetHidden")

    Dim postReq As String
    postReq = ""

    i = 1
    For Each topic In topicsSMV
        Set topicElem = topic.getElementsByTagName("input")
        For Each dataTopic In topicElem
            Cells(i, 1) = dataTopic.Name
            Cells(i, 2) = dataTopic.Value
            temp = dataTopic.Name & "=" & dataTopic.Value
            If i = 1 Then postReq = "ctl00%24ctl18=ctl00%24MainContent%24UpdatePanel1%7Cctl00%24MainContent%24cboDenominacionSocial"
            If i > 1 Then postReq = postReq & Chr(38) & temp
            i = i + 1
        Next dataTopic
    Next topic
    postReq = postReq & "ctl00%24MainContent%24cboDenominacionSocial=156429&__ASYNCPOST=true&"
    Cells(i, 1).Value = postReq

    xmlhttp.Open "POST", urlMF, False
    xmlhttp.send postReq
    bodySMV.body.innerHTML = xmlhttp.responseText

'
End Sub

我想从第二个文本框中获取所有可能的元素列表,具体取决于第一个文本框的选择。 POST请求中我缺少什么?

0 个答案:

没有答案