【发布时间】:2017-03-29 21:10:32
【问题描述】:
我编写了一个 VBA 宏来计算 Google 搜索特定术语时返回的(大约)图像数量。近似我的意思是程序应该计算返回的图像数量,向下滚动以加载更多(如果适用)最多计算 400 个图像。这是(简化的)代码:
Sub GoogleCount ()
'''
'[Code to construct the URL ('fullUrl')]
'''
Set objIE = New InternetExplorer
objIE.navigate fullUrl
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
Set currPage = objIE.document
'Count images returned
newNum = currPage.getElementById("rg_s").getElementsByTagName("IMG").Length
'Scroll down until count = 400 (max) or no change in value
Do While newNum >= 100 And newNum < 400 And newNum <> oldNum
oldNum = newNum
currPage.parentWindow.scrollBy 0, 100000
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
newNum = currPage.getElementById("rg_s").getElementsByTagName("IMG").Length
Loop
'''
'[Code to paste the value of newNum into my workbook, and do some other progress reporting]
'''
End Sub
我对滚动不满意,感觉非常'手动',尤其是当您以固定值滚动时(任何点让它动态?即找到页面的结尾并滚动到那里)。
但主要问题是它不起作用:当我执行代码时,它会正确计算前 100 个(或更少)图像。但是当它应该滚动并计算更多时,我会返回 100 的值。用 F8 慢慢地遍历代码,我得到了正确的数字(最大 400),这让我得出结论,代码运行得太快了(我可能错了)。
为了减慢代码速度,我尝试添加 objIE.readyState 检查循环,但因为我只是在滚动,我不认为它算作页面“重新加载”,所以循环在等待新的循环时无效要加载的图像。
我考虑过添加一个时间延迟。我已经在工作了
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
在工作表的其他地方 - 所以,我可以添加小至毫秒级的延迟。
但我真的想避免使用它,因为这段代码是为 c 运行的。 50 种不同的搜索,并且已经花费了足够长的时间来执行,添加足够长的固定延迟以适应慢速连接速度并不理想。此外,互联网速度变化很大,以至于固定延迟非常不可靠 - 我可以进行某种连接测试以获得更好的大致数字,但最好的选择显然是只要你必须等待。
或者更好找到另一种计算图像的方法,最好是不涉及重新加载页面 4 次的方法! 有什么想法吗?
注意。如果您想自己调试,将fullUrl 设置为https://www.google.com/search?q=stack overflow|exchange&tbm=isch&source=lnt&tbs=isz:ex,iszw:312,iszh:390 的良好图像搜索可能会返回>100 张但少于400 张的图像,因此您可以测试代码的各个方面
【问题讨论】:
-
我建议您直接滚动到页面底部并返回最后一张图片的索引而不是使用循环