我编写了一个 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
我对滚动感到不高兴,感觉很不舒服'manual',尤其是当您滚动固定值时(使它动态的任何点?即找到页面的末尾并滚动到那里).
但主要问题是它不起作用:当我执行代码时,它会很好地计算前 100 张(或更少)图像。但是当它应该滚动并计数更多时,我得到返回的值 100。使用 F8 慢慢地单步执行代码,我得到了正确的数字(最大 400),这使我得出结论,代码运行得太快(我可能是错的)。
为了减慢代码速度,我尝试添加objIE.readyState
检查循环,但因为我只是滚动,所以我不认为它算作页面“重新加载”,因此循环在等待新图像加载时无效。
我想过相反,添加时间延迟。我已经在职了
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
在工作表的其他地方 - 所以,我could添加小至毫秒级的延迟。
但我真的想避免使用它,因为此代码运行于 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 个图像,因此您可以测试代码的各个方面