如何用Python的Selenium获取网页JS游戏中的玩家数等数据?
解决Selenium获取浏览器游戏页面动态数据的问题
针对你遇到的问题,给你几个实用的解决方向:
检查目标元素是否在iframe中
很多网页游戏会把核心内容放在iframe里,Selenium默认只会在主页面上下文查找元素,根本碰不到iframe里的内容。先找到游戏对应的iframe,切换上下文后再定位元素:from selenium.webdriver.common.by import By # 定位游戏iframe(可根据实际src、id或class调整) game_iframe = driver.find_element(By.CSS_SELECTOR, "iframe[src*='TugTeamMultiplication']") # 切换到iframe内部 driver.switch_to.frame(game_iframe) # 现在可以正常定位玩家数量、时间等元素 player_count = driver.find_element(By.XPATH, "//*[contains(text(), 'Players')]").text # 操作完成后切回主页面 driver.switch_to.default_content()放弃自动生成的绝对Xpath,用相对定位
开发者工具复制的Xpath大多是绝对路径(比如/html/body/div[2]/div[3]...),页面结构稍微变一下就失效。换成基于元素特征的相对定位,比如根据文本、class属性:
比如找玩家数,可写成//*[text()='Players Online:']/following-sibling::span,或者//div[contains(@class, 'player-counter')](具体要根据页面元素的实际属性调整)。用显式等待等待动态元素加载
JS渲染的元素不会瞬间出现,直接定位肯定找不到。用Selenium的显式等待,等元素可见后再操作:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 15) # 等待玩家数量元素可见,最多等15秒 player_element = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), 'Players')]"))) print(player_element.text)模拟点击后等待游戏界面加载
点击「Play Game」后,游戏界面是异步渲染的,别着急立刻定位元素。点击后先等游戏内的关键元素出现:# 点击Play Game按钮 play_btn = driver.find_element(By.XPATH, "//button[text()='Play Game']") play_btn.click() # 等待游戏界面加载完成,比如等玩家信息区域出现 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".player-info-area")))
内容的提问来源于stack exchange,提问作者twitterL9
相关产品推荐
相关产品推荐

