如何在 selenium 中更快地从动态网站读取数据
Posted
技术标签:
【中文标题】如何在 selenium 中更快地从动态网站读取数据【英文标题】:How to read data from dynamic website faster in selenium 【发布时间】:2021-12-06 23:59:46 【问题描述】:我有一些动态网站(足球现场投注)。没有 API 我在 selenium 中阅读所有这些 API。我每次都有无限循环和查找元素。
while True:
elements = self.driver.find_elements_by_xpath(games_path)
for e in elements:
match = Match()
match.betting_opened = len(e.find_elements_by_class_name('no_betting_odds')) == 0
问题是它比我需要的慢一百倍。
有什么替代方法?任何其他库或如何使用 Selenium 加速它?
我正在抓取的网站之一https://www.betcris.pl/zaklady-live#/Soccer
【问题讨论】:
这个描述过于笼统和模糊,解决方案可能隐藏在细节中。例如,“我每次都在寻找元素”是什么意思?也许你这样做效率低下?请分享一些代码,最好是minimal reproducible example。 请求库/软件的推荐是特别在 *** 上的题外话。阅读tour 和How to Ask。 【参考方案1】:你的代码有一个while True
循环,没有break
。那是无限循环的实现。从一个简短的片段中,我无法判断这是否是您的“无限循环”问题的根本原因,但可能是这样,请检查您的 while
循环中是否有任何 break
语句。
至于您问题的另一部分:我不确定您如何衡量无限循环的性能,但有一种方法可以加快使用 selenium 解析页面的速度:不使用 selenium。从页面中获取快照并将其用于评估状态、值和内容。
import lxml.html
page_snapshot = lxml.html.document_fromstring(self.driver.page_source)
games = page_snapshot.xpath(games_path)
这种方法比通过 selenium api 查询快大约 2 个数量级。抓取页面一次,真正快速地解析出它,然后如果您愿意,可以稍后再次抓取页面。如果您只想阅读内容,则根本不需要网络元素,只需要数据树。要与元素交互,您当然需要带有 selenium 的 webelement,但要获取值和状态,快照可能就足够了。
或者你可以只用 selenium 做什么:将 'no_betting_odds'
添加到 games_path
xpath。在我看来,您想要获取那些没有 'no_betting_odds'
类的元素。然后只需将'.//*[not contains(@class, "no_betting_odds")]'
添加到games_path
(您没有分享,所以我无法更新)。
【讨论】:
以上是关于如何在 selenium 中更快地从动态网站读取数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Selenium 和 Python 进行用户输入的网页抓取动态网站