如何用Python Selenium从表格中获取最新变动的币种名称
解决方案:基于「实时对比上一轮状态」的监控逻辑
核心问题出在你之前的代码可能依赖了一个持久化的「已通知币种列表」,导致重复出现的币种无法触发通知。正确的思路应该是跟踪每一轮刷新后的前两位币种状态,和上一轮做对比,只要位置或内容有变化,就针对变动的部分触发通知,而非判断币种是否被通知过。
具体实现步骤
初始化上一轮状态
启动脚本后先获取页面前两位币种,将其作为初始参考状态,比如用列表previous_top2 = []存储。每次刷新后的对比逻辑
刷新页面后获取当前前两位币种存入current_top2:- 如果
current_top2和previous_top2完全一致:不执行任何操作 - 如果不一致:逐位置对比两个列表,找出变动的币种,触发Discord通知,随后更新
previous_top2为当前状态
- 如果
核心代码示例
以下是调整后的关键逻辑片段:from selenium import webdriver from selenium.webdriver.common.by import By import time import discord_webhook # 初始化WebDriver(根据你的浏览器类型调整) driver = webdriver.Chrome() driver.get("https://www.binance.com/en/futures/funding-rate") # 初始化上一轮的前两位币种状态 previous_top2 = [] # 循环监控 while True: # 获取当前前两位币种(需根据页面实际元素定位调整) current_top2 = [] for i in range(1, 3): try: coin_elem = driver.find_element(By.XPATH, f"//tbody/tr[{i}]/td[1]/div/a") current_top2.append(coin_elem.text.strip()) except: # 定位失败时跳过,避免脚本崩溃 continue # 对比当前与上一轮状态 if current_top2 != previous_top2 and len(current_top2) == 2: # 遍历位置,找出变动项 for idx, coin in enumerate(current_top2): if idx >= len(previous_top2) or coin != previous_top2[idx]: # 触发Discord通知(替换为你的机器人逻辑) webhook = discord_webhook.DiscordWebhook( url="你的Discord Webhook地址", content=f"第{idx+1}位币种更新:{coin}" ) webhook.execute() # 更新上一轮状态 previous_top2 = current_top2.copy() # 刷新页面并等待(可调整间隔时长) driver.refresh() time.sleep(60)
关键细节说明
- 抛弃持久化通知列表:不再记录所有已通知过的币种,只关注相邻两轮的状态差异,确保即使旧币种重新回到前两位也能触发通知。
- 位置级精准对比:逐位置检查前两位,能明确是第一位还是第二位发生变动,通知内容更精准。
- 状态更新时机:仅在确认状态变动后才更新上一轮参考值,避免页面未加载完全时的错误状态覆盖。
额外优化建议
- 页面加载等待:刷新后加入显式等待,确保表格元素加载完成再获取数据,避免定位失败:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver.refresh() # 等待第一位币种元素加载完成,超时10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//tbody/tr[1]/td[1]/div/a")) ) - 异常捕获:给元素定位、通知发送等步骤加上try-except块,避免脚本因单次异常直接终止。
内容的提问来源于stack exchange,提问作者Adnan Zafar
相关产品推荐
相关产品推荐

