【问题标题】:VBA post request with formdata (URL doesnt change)带有表单数据的 VBA 发布请求(URL 不变)
【发布时间】:2019-01-08 19:01:45
【问题描述】:

我遇到过许多类似的问题,例如thisthis,但我的问题要简单得多。我想更改网络表单上的日期并使用 POST 请求获取数据

我有这个发出 POST 请求的代码:

Sub winpost()
Dim WebClient As WinHttp.WinHttpRequest
Set WebClient = New WinHttp.WinHttpRequest
Dim searchResult As HTMLTextElement: Dim searchTxt As String
Dim html As New HTMLDocument

Dim Payload As String
Payload = "ContentPlaceHolder1_ddlday=6"

With WebClient
.Open "POST", "http://pib.nic.in/AllRelease.aspx", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send (Payload)
.waitForResponse
End With

html.body.innerHTML = WebClient.responseText
Set searchResult = html.querySelector(".search_box_result"): searchTxt = searchResult.innerText
Debug.Print searchTxt

End Sub

网站是this。该页面发送一个关于任何字段更改的发布请求。 在查看网络 > Formdata 部分下的 ChromeDevTools 时,我看到了这个:

ctl00$ContentPlaceHolder1$ddlday: 8

我在 Payload 字符串中尝试了各种版本。但它总是返回相同的页面(1 月 8 日)。

【问题讨论】:

  • 似乎您正在抓取使用视图状态的 asp.net 网站。换句话说,它是有状态的网站,因此您不能只发送 POST 请求并获得结果。您需要复制状态进程。我不知道如何在 VBA 中做到这一点,但这并不容易,您可能想看看 Selenium 等 Web 浏览器仿真工具。
  • 检查您的帖子数据:当我访问您的网站并更改日期时,帖子数据不仅仅是一天。它看起来相当复杂,怀疑只发布一天时你会得到相同的结果......
  • 是的,还有很多其他的表单数据字段。我想我会尝试使用 VBA 中的 ie 对象。(这里只能访问 excel,所以没有硒、节点等)。感谢您指出视图状态解决问题。

标签: excel vba web-scraping httprequest


【解决方案1】:

Internet Explorer

由于没有 SelectByText 选项,IE 的语法与 selenium basic(显示在底部)略有不同。例如,您可以使用索引或属性 = 值 css 选择器。这里的月份是最多 12 个索引而不是月份名称

Option Explicit    
Public Sub SetDates()
    Dim ie As New InternetExplorer
    With ie
        .Visible = True
        .Navigate2 "http://pib.nic.in/AllRelease.aspx"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .Document
            .querySelector("#btnSave").Click
            .querySelector("#ContentPlaceHolder1_ddlMonth [value='2']").Selected = True
            .querySelector("#ContentPlaceHolder1_ddlYear [value='2018']").Selected = True
            .querySelector("#ContentPlaceHolder1_ddlday [value='2']").Selected = True
        End With
        Stop '<==delete me later
        .Quit
    End With
End Sub

基本硒:

如果您确实走selenium basic vba 路线,您可以执行如下操作。注意:安装 selenium 后,您需要转到 VBE > Tools > References > Add reference to selenium type library。您还需要最新的 Chrome 和 ChromeDriver,并且 ChromeDriver 文件夹应该放在环境路径中,或者 chromedriver 放在包含 selenium 可执行文件的文件夹中。

Option Explicit
Public Sub SetDates()
    Dim d As WebDriver
    Set d = New ChromeDriver
    Const Url = "http://pib.nic.in/AllRelease.aspx"
    With d
        .Start "Chrome"
        .get Url
        .FindElementById("btnSave").Click

        'date values
        .FindElementById("ContentPlaceHolder1_ddlMonth").AsSelect.SelectByText "February"
        .FindElementById("ContentPlaceHolder1_ddlYear").AsSelect.SelectByText "2018"
        .FindElementById("ContentPlaceHolder1_ddlday").AsSelect.SelectByText "2"
        Stop   'delete me later

        .Quit
    End With
End Sub

【讨论】:

  • 哇!非常干净的解决方案,不了解 selenium basic,测试了它们,它们似乎有效。非常感谢
猜你喜欢
  • 2015-10-05
  • 1970-01-01
  • 2020-01-18
  • 2021-08-02
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多