我有一些代码可以加载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作为一个进程运行(当然这会占用大量内存,并且代码最终由于内存不足而崩溃) 。我需要写什么才能退出该过程?还是没有意义的锻炼?
谢谢
答案 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个不同的可扩展的展示细分部分。
第一个是:
关联的HTML:
此行:
.FindElementByCSS("[data-reveal-id='detailed-breakdown']", Timeout:=7000).Click
使用CSS选择器通过元素在页面上的样式来定位元素。它以值为data-reveal-id
的属性detailed-breakdown
为目标。 []
表示attribute selector。
第二个点击目标是:
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>工具>参考):
旁注:
如果要循环播放,请记住在下一轮循环之前将元素设置为Nothing
。
例如
Set transaction_charge = Nothing
然后处理下一个URL。