使用VBA擦除HTML POST请求

时间:2016-03-10 17:38:09

标签: vba excel-vba web-scraping excel

我正在尝试使用VBA从这个网站上删除摩洛哥股票的报价:

http://www.casablanca-bourse.com/bourseweb/en/Negociation-History.aspx?Cat=24&IdLink=225

如果选择安全性,请选中“按期间”,指定日期间隔,最后单击“提交”按钮。

我首先使用easy方法:使用Internet Explorer对象:

Sub method1()

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = False
    IE.Navigate "http://www.casablanca-bourse.com/bourseweb/Negociation-Historique.aspx?Cat=24&IdLink=302"

    Do While IE.Busy
        DoEvents
    Loop

    'Picking the security
    Set obj1 = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_DDValeur")
    obj1.Value = "4100  " 'Security code taken from the source html

    'Specifying "By period"
    Set obj2 = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_RBSearchDate")
    obj2.Checked = True

    'Start date
    Set obj3 = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_DateTimeControl1_TBCalendar")
    obj3.Value = "07/03/2016"

    'End date
    Set obj4 = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_DateTimeControl2_TBCalendar")
    obj4.Value = "07/03/2016"

    'Clicking the button
    Set objs = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_Image1")
    objs.Click

    'Setting the data <div> as an object
    Set obj5 = IE.document.getElementById("HistoriqueNegociation1_UpdatePanel1")
    s = obj5.innerHTML

    'Looping until the quotes pop up
    Do While InStr(s, "HistoriqueNegociation1_HistValeur1_RptListHist_ctl01_Label3") = 0
        Application.Wait DateAdd("s", 0.1, Now)
        s = obj5.innerHTML
    Loop

    'Printing the value
    Set obj6 = IE.document.getElementById("HistoriqueNegociation1_HistValeur1_RptListHist_ctl01_Label3")
    Cells(1, 1).Value = CDbl(obj6.innerText)

    IE.Quit
    Set IE = Nothing

End Sub

这个网页是动态的,我不得不让应用程序等待,直到数据弹出(直到数据在HTML代码中弹出),这就是我使用第二个Do while循环的原因。

现在,我想要做的是使用更难的方式:通过VBA发送表单请求,这在GET请求时非常简单,但是这个站点使用我发现很难模仿的POST请求在VBA。

我使用了这个简单的代码:

Sub method2()

    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    URL = "http://www.casablanca-bourse.com/bourseweb/Negociation-Historique.aspx?Cat=24&IdLink=302"
    objHTTP.Open "POST", URL, False
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send ("encoded request params go here")
    Cells(1, 1).Value = objHTTP.ResponseText

End Sub

我使用Chrome DevTools(F12)记录POST请求。但我很难弄清楚params应该是什么(表单数据太长,我无法截图或复制它,所以请随意自己录制)。我选择了我需要的唯一参数(安全代码,无线电代码和两个日期),但请求响应与DevTools不匹配,并且它不包含任何可用的。以下是我使用的参数:

HistoriqueNegociation1$HistValeur1$DDValeur=9000%20%20&HistoriqueNegociation1$HistValeur1$historique=RBSearchDate&HistoriqueNegociation1$HistValeur1$DateTimeControl1$TBCalendar=07%2F03%2F2016&HistoriqueNegociation1$HistValeur1$DateTimeControl2$TBCalendar=07%2F03%2F2016

显然,我在这里没有得到任何东西(或所有东西)。

1 个答案:

答案 0 :(得分:1)

实际上,我不能选择&#34;一些参数&#34;,我必须发送所有这些参数。我起初并没有这样做,因为我从DevTools获得的params行太长(47012个字符),Excel-VBA并没有接受那么长的行。所以我将params复制到一个文本文件,然后使用该文件发送请求,并且它有效。