在后台使用IE抓取网址-如何退出IE进程?

时间:2018-08-20 10:55:48

标签: html excel vba excel-vba web-scraping

我有一些代码可以加载IE,抓取网页,然后关闭IE。

我想(如果我错了,请纠正我),由于您实际上可以看到IE打开,因此运行代码会花费一些时间,

问题是,当我想隐藏IE然后运行代码时-我不需要最后关闭每个IE进程而编写的内容……一旦信息被删除,我就不用了。 见下文:

Set wb = CreateObject("internetExplorer.Application")
sURL = Cells(i, 10)
wb.Navigate sURL
wb.Visible = True
Do While wb.Busy = True Or wb.ReadyState <> 4: DoEvents: Loop
On Error Resume Next
      'scraping code here
wb.Quit
Set wb = Nothing
      'rest of the code here

因此,当wb.Visible = False时,wb.Quit不起作用,您仍然可以看到IE作为一个进程运行(当然这会占用大量内存,并且代码最终由于内存不足而崩溃) 。我需要写什么才能退出该过程?还是没有意义的锻炼?

谢谢

1 个答案:

答案 0 :(得分:2)

您不能针对该元素在该页面上发布XMLTTPRequest

因此,这里有两种获取信息的方法。第二个示例向您展示如何单击它。这些方法显示了如何等待,正确关闭以及如何正确引用。


方法1:Internet Explorer

Public Sub GetInfo2()
    Dim IE As New InternetExplorer
    Const URL = "enter URL"
    Const WAIT_TIME_SECS As Long = 5

    With IE
        .Visible = False
        .navigate URL

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

        Dim t As Date, transactionCharge As Object
        t = Timer
        With .document
            Do
                DoEvents
                On Error Resume Next
                Set transactionCharge = .getElementById("transaction_chargeP0Y")
                On Error GoTo 0
                If Timer - t > WAIT_TIME_SECS Then Exit Do
            Loop While transactionCharge Is Nothing
            If Not transactionCharge Is Nothing Then Debug.Print transactionCharge.innerText
        End With
        .Quit
    End With
End Sub

在上面,我包括了一个带有超时的循环,以防元素不立即可用。


方法2:Selenium Basic

Selenium basic是用于VB.Net,VBA和VBScript的浏览器自动化框架

这向您展示了如何运行无头浏览器实例。

我使用了硒显式等待功能,以使元素有更多时间显示在页面上。硒还具有隐式等待时间。

下面的点击事件会打开2个不同的可扩展的展示细分部分。

第一个是:

first

关联的HTML:

HTML

此行:

.FindElementByCSS("[data-reveal-id='detailed-breakdown']", Timeout:=7000).Click

使用CSS选择器通过元素在页面上的样式来定位元素。它以值为data-reveal-id的属性detailed-breakdown为目标。 []表示attribute selector

第二个点击目标是:

target

HTML是:

HTML

我们可以看到父级span具有可以定位的ID。

 .FindElementById("brkdownInvstToggler", Timeout:=7000).Click

代码:

Option Explicit
Public Sub GetInfo()
    Dim d As WebDriver
    Set d = New ChromeDriver '< You can use IEDriver for Internet Explorer
    Const URL = "enterURL"
    With d
        .AddArgument "--headless"
        .Start "Chrome" 
        .get URL
        .FindElementByCss("[data-reveal-id='detailed-breakdown']", Timeout:=7000).Click
        .FindElementById("brkdownInvstToggler").Click
         Debug.Print .FindElementById("transaction_chargeP0Y", Timeout:=7000).Text
        .Quit
    End With
End Sub

参考(VBE>工具>参考):

  1. 硒类型库

旁注:

如果要循环播放,请记住在下一轮循环之前将元素设置为Nothing

例如

Set transaction_charge = Nothing 

然后处理下一个URL。