在vba中创建的POST请求不会导致任何结果

时间:2017-07-31 12:42:32

标签: vba post web-scraping

我使用POST请求在vba中编写了一个非常小的脚本。但是,当我运行它时,除了空白消息外,我得不到任何结果。我已经尝试相应地填写请求参数。也许,我无法注意哪些应该包含在参数中。我正在处理的页面包含右侧面板中的几个图像。当点击图像时,我在这里谈论的请求被发送到服务器并带回结果并显示有关其“味道”的新信息。我的目标是解析与每个图像相关的所有风格。无论如何,我试图附上所有必要的东西,以找出我所缺少的东西。提前谢谢。

这是我从chrome开发人员工具中获得的准备POST请求的内容: “https://www.dropbox.com/s/zjn0ahixhu58miq/RequestStatus.txt?dl=0

以下是我正在尝试的内容:

Sub PostReq()

    Dim http As New XMLHTTP60, html As New HTMLDocument
    Dim ArgumentStr As String

    ArgumentStr = "opt=flavor&opt1=207&opt2=47&ip=105"
    With http
        .Open "POST", "https://www.optigura.com/product/ajax/details.php", False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
        .setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
        .send ArgumentStr
        html.body.innerHTML = .responseText
    End With

    MsgBox http.responseText

End Sub

这是该网页的原始链接:

https://www.optigura.com/uk/product/gold-standard-100-whey/

2 个答案:

答案 0 :(得分:1)

您的代码设置了一个请求标头,如下所示:

.setRequestHeader "Content-type", "application/x-www-form-urlencoded"

所以脚本会期望参数字符串是URL编码的(它不是&#t; t)。

尝试编码字符串,或使用" GET"发送请求。代替。

答案 1 :(得分:0)

最后,我做到了。要接收所需的响应,必须先发送GET请求,然后再使用该get请求的响应发送POST请求。这是工作中的一个:

Sub httpPost()

    Dim http As New XMLHTTP60, html As New HTMLDocument
    Dim ArgumentStr As String

    ArgumentStr = "opt=flavor&opt1=207&opt2=47&ip=105"

    With http
        .Open "GET", "https://www.optigura.com/uk/product/gold-standard-100-whey/", False
        .send
    End With

    With http
        .Open "POST", "https://www.optigura.com/product/ajax/details.php", False
        .setRequestHeader "X-Requested-With", "XMLHttpRequest"
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
        .setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
        .send ArgumentStr
        html.body.innerHTML = .responseText
    End With

    MsgBox http.responseText

End Sub