我正在尝试使用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
显然,我在这里没有得到任何东西(或所有东西)。
答案 0 :(得分:1)
实际上,我不能选择&#34;一些参数&#34;,我必须发送所有这些参数。我起初并没有这样做,因为我从DevTools获得的params行太长(47012个字符),Excel-VBA并没有接受那么长的行。所以我将params复制到一个文本文件,然后使用该文件发送请求,并且它有效。