我在Excel中使用VBA,并且尝试访问网页,然后单击链接以触发在我的PC上的CSV下载。
到目前为止,借助VBA,我可以打开IE并访问所需的网页。但是,在检查了页面(F12)的HTML代码并使用getElementsByClassName和其他方法之后,我无法生成可点击的对象,该对象将触发从我的代码中进行下载。
Sub Automate_IE_Enter_Data() “这将在IE中加载网页 昏昏欲睡 网址为字符串的暗淡 昏暗的IE作为对象 昏暗的objElement作为对象 昏暗的objCollection作为对象 昏暗的HWNDSrc很久
'Create InternetExplorer Object
Set IE = CreateObject("InternetExplorer.Application")
'Set IE.Visible = True to make IE visible, or False for IE to run in the background
IE.Visible = True
'Define URL
'URL = "https://www.automateexcel.com/excel/vba"
URL = "https://www.barchart.com/futures/quotes/ZWF9|530P/price-history/historical"
'Navigate to URL
IE.Navigate URL
' Statusbar let's user know website is loading
Application.StatusBar = URL & " is loading. Please wait..."
' Wait while IE loading...
'IE ReadyState = 4 signifies the webpage has loaded (the first loop is set to avoid inadvertantly skipping over the second loop)
'Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
'Webpage Loaded
Application.StatusBar = URL & " Loaded"
'Get Window ID for IE so we can set it as activate window
HWNDSrc = IE.hWnd
'Set IE as Active Window
SetForegroundWindow HWNDSrc
Set IEAppColl = IE.Document.getElementsByClassName("bc-glyph-download")(0)
IEAppColl.Click
Application.Wait Now + TimeValue(“ 00:00:10”)
SetForegroundWindow HWNDSrc
Application.Wait Now + TimeValue(“ 00:00:05”)
结束子
预期:1)在IE上打开以下URL: https://www.barchart.com/futures/quotes/ZWF9|530P/price-history/historical 2)点击“每日价格”部分上的“最高”链接,以下载CSV文件
1)可以 2)产生错误:对象不支持此属性或方法。
对于如何复制VBA代码中“最大”链接的点击,我不是很满意。不确定我使用的是正确的名称。
答案 0 :(得分:1)
除非登录,否则该网站不允许您下载csv。您指定的类已链接到jQuery,jQuery会检查您的登录状态,如果未登录则抛出错误。要通过excel下载,您首先需要访问网站并创建一个帐户,然后编写代码以登录您,然后下载csv,它应该可以工作。我不知道确切的语法,但希望这会为您指明正确的方向。
我也建议您尝试硒。它是一种流行的网络爬网软件,因此应该很容易找到相关帮助。
答案 1 :(得分:1)
使用IE-您可以简单地使用以下命令启动未要求的下载提供的登录。
ie.document.querySelector("[data-ref=historical]").Click
更长的登录版本:
这使IE和Selenium都感到恐惧,包括检测到的bot未接受登录详细信息(对于IE)(登录时未发现IE),登录后未发现页面错误,过时的元素引用,不可点击的元素……以下是我成功进行的可怕的战争以获得下载。早上,我将看看是否可以找到更好的方法。
Option Explicit
Public Sub Download()
Dim d As WebDriver
Set d = New ChromeDriver
Const URL = "https://www.barchart.com/futures/quotes/ZWF9%7C530P/price-history/historical"
Const JS_WAIT_CLICKABLE = _
"var target = this, endtime = Date.now() + arguments[0];" & _
"(function check_clickable() {" & _
" var r = target.getBoundingClientRect(), x = r.left+r.width/2, y = r.top+r.height/2;" & _
" for (var e = document.elementFromPoint(x , y); e; e = e.parentElement)" & _
" if (e === target){ callback(target); return; }" & _
" if (Date.now() > endtime) { callback(target); return; }" & _
" setTimeout(check_clickable, 60);" & _
"})();" 'by @florentbr
With d
.Start "Chrome"
.get URL, timeout:=100000
.FindElementByCss("[data-ref=historical]").Click
With .FindElementsByCss("input.form-input")
.item(1).SendKeys "name"
.item(2).SendKeys "password"
End With
.FindElementByCss("[value=GO]").Click
.GoBack
.GoBack
Application.Wait Now + TimeSerial(0, 0, 5)
With .FindElementByCss("[data-ref=historical]")
.ExecuteAsyncScript(JS_WAIT_CLICKABLE, 10000) _
.Click
End With
.Quit
End With
End Sub