我正在开发一个不和谐的机器人,它使用selenium从火箭联盟追踪器中抓取球员的排名。(有时),但我似乎遇到了很多问题,当从Replit运行它似乎最大的CPU和RAM,并经常失败(webdriver TimeoutException
),但在Google Cloud VM中运行的相同代码在大多数情况下运行良好,但在运行一段时间后似乎无一例外地失败(尽管使用tmux保持活动状态)。
代码感觉有点乱。有问题的元素很难在页面上追踪。有时正确的元素文本(等级)被刮擦,但其他时候它刮擦玩家MMR,因此,我设置了一个if .isdigit()
来捕获它何时刮擦MMR,然后如果True
运行一个新find_element
来(希望)刮取正确的信息。我的理解是页面是动态的,我认为find_element
的结果取决于页面加载顺序,即,如果MMR元素在rank元素之前加载,则find_element
正在抓取“错误”信息。
也许有一种方法可以重新运行相同的find_element
命令,直到元素返回False
for .isdigit()
?最终,我只想从一个已知的URL中抓取玩家排名并返回它。
def scrape_rank(pName):
driver.get(f"https://rocketleague.tracker.network/rocket-league/profile/steam/{pName}/overview")
three_v_three_rank = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[contains(text(),'Standard 3v3')]/following-sibling::div")))
if str(three_v_three_rank).isdigit():
rank_3v3 = driver.find_element(By.XPATH, "//div[contains(text(),'Standard 3v3')]/following-sibling::div/following-sibling::div")
return rank_3v3
else:
rank_3v3 = three_v_three_rank
return rank_3v3
driver.quit()
rank_text = rank_3v3
rank = rank_text.split('\n')[0]
return rank
1条答案
按热度按时间sf6xfgos1#
为了提高性能,我改变了在网站上选择元素的方式。
现在,它会找到应该用文本“Standard 3v3”找到元素的表格,因此它不必查看整个页面,而是只查看表格内部。