【发布时间】:2018-05-18 21:07:14
【问题描述】:
我在 vba 中结合 selenium 编写了一个脚本来解析网页中所有可用的公司名称。该网页已启用延迟加载方法,因此每个滚动中只有 20 个链接可见。如果我滚动 2 次,则可见链接数为 40,依此类推。该网页中有 1000 个链接可用。我下面的脚本可以到达该页面的底部,处理所有滚动并获取该网页中所有可用的名称。
但是,每次滚动后,该网页需要等待一段时间才能更新内容。这是我使用hardcoded delay的地方,但是硬编码的过程非常不一致,有时它会使浏览器在整个操作完成之前退出。
如何修改这部分 .Wait 6000 以使其成为 Explicit Wait 而不是 Hardcoded Wait。
这是我目前写的:
Sub Getlinks()
Dim driver As New ChromeDriver, prevlen&, curlen&
Dim posts As Object, post As Object
With driver
.get "http://fortune.com/fortune500/list/"
prevlen = .FindElementsByClass("company-title").Count
Do
prevlen = curlen
.ExecuteScript ("window.scrollTo(0, document.body.scrollHeight);")
.Wait 6000 ''I like to kick out this hardcoded delay and use explicit wait in place
Set posts = .FindElementsByClass("company-title")
curlen = posts.Count
If prevlen = curlen Then Exit Do
Loop
For Each post In posts
R = R + 1: Cells(R, 1) = post.Text
Next post
End With
End Sub
【问题讨论】:
-
你知道浏览器在加载这些数据时是否变得“忙”吗?根据网站用于获取此数据的方法,您可能可以使用:Do While IeApp.busy Application.Wait DateAdd("s", 5, Now) Loop,没关系,我没注意你正在使用 Chrome。不是 IE。
-
我在使用 IE 玩同样的游戏时确实尝试了您的建议,但这根本不起作用。一两次滚动后,弓箭手非常顺利地退出。顺便感谢您的建议@Ricardo A。
-
它是否显示任何类型的装载机或等待符号?如果是这样,您应该等待存在然后消失
-
感谢@Tarun Lalwani 的提示。我也尝试过这个角度,但无法成功。每个卷轴后都有一个旋转符号可见。一旦新项目加载,该符号就会变得不可见。该符号在
F500-spinner类中。 -
我会在 chrome 和 int 网络选项卡中加载一个慢速网络模拟配置文件。这将使您有足够的时间查看和获取微调器标识,然后您应该需要检查其可见性和不可见性
标签: vba excel selenium web-scraping selenium-chromedriver