从EXCEL VBA单击Web上的按钮

时间:2018-12-26 23:22:07

标签: excel vba web-scraping

我在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代码中“最大”链接的点击,我不是很满意。不确定我使用的是正确的名称。

2 个答案:

答案 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