python 有什么方法可以重构这个selenium函数来提高性能吗?

wz3gfoph  于 2023-04-04  发布在  Python
关注(0)|答案(1)|浏览(72)

我正在开发一个不和谐的机器人,它使用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
sf6xfgos

sf6xfgos1#

为了提高性能,我改变了在网站上选择元素的方式。
现在,它会找到应该用文本“Standard 3v3”找到元素的表格,因此它不必查看整个页面,而是只查看表格内部。

wait = WebDriverWait(driver, 10)

def scrape_rank(pName):

  driver.get(f"https://rocketleague.tracker.network/rocket-league/profile/steam/{pName}/overview")

  # Find table which contains all ranks from all gamemodes
  ranks_table = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.trn-table__container>table>tbody")))

  # Find 3v3 rank element inside of table
  rank_3v3 = ranks_table.find_element(By.XPATH, "//tr//td[@class='name']//div[contains(text(),'Standard 3v3')]/following-sibling::div"))

相关问题