如何用Python Selenium自动获取TradingView新K线的MAMA/FAMA指标值
解决TradingView MAMA/FAMA指标自动抓取新K线数据的问题
我之前也碰到过一模一样的情况——TradingView的指标 tooltip 只有在鼠标 hover 到对应K线上时才会渲染出数值,所以核心思路就是自动模拟鼠标hover到最新生成的K线,然后抓取数据,同时定期检查新K线的出现。下面是具体的实现步骤和代码示例:
步骤1:定位最新K线元素
TradingView的K线元素通常带有tv-bar类名,最新的K线一般会有额外的标识(比如tv-bar-last),或者你可以直接获取所有K线元素的最后一个。示例代码如下:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化显式等待,最长等待10秒 wait = WebDriverWait(driver, 10) # 等待所有K线元素加载完成 bars = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.tv-bar"))) # 获取最后一个(最新的)K线元素 latest_bar = bars[-1]
步骤2:模拟鼠标hover到最新K线
用Selenium的ActionChains工具模拟鼠标移动操作,触发指标tooltip的渲染:
from selenium.webdriver.common.action_chains import ActionChains # 初始化动作链 actions = ActionChains(driver) # 移动鼠标到最新K线位置 actions.move_to_element(latest_bar).perform()
步骤3:抓取MAMA/FAMA指标数值
hover之后,指标数值会出页面的tooltip元素里,你需要根据实际页面结构定位数值所在的位置。示例代码:
# 等待tooltip元素可见 tooltip = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.tv-tooltip"))) # 根据指标名称定位数值(请根据实际页面结构调整XPath) mama_value = tooltip.find_element(By.XPATH, ".//span[contains(text(), 'MAMA')]/following-sibling::span").text fama_value = tooltip.find_element(By.XPATH, ".//span[contains(text(), 'FAMA')]/following-sibling::span").text print(f"最新K线MAMA值: {mama_value}, FAMA值: {fama_value}")
步骤4:自动检测新K线并循环抓取
为了自动获取新生成的K线数据,你可以设置一个循环,定期检查K线数量的变化,当发现新K线时重复上述操作:
import time # 记录初始K线数量 previous_bar_count = len(bars) while True: # 根据K线周期设置等待时间(比如1分钟K线可以设60秒左右) time.sleep(5) # 重新获取当前所有K线元素 current_bars = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.tv-bar"))) current_bar_count = len(current_bars) # 如果K线数量增加,说明有新K线生成 if current_bar_count > previous_bar_count: latest_bar = current_bars[-1] # 模拟hover触发tooltip actions.move_to_element(latest_bar).perform() # 抓取最新指标值 tooltip = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.tv-tooltip"))) mama_value = tooltip.find_element(By.XPATH, ".//span[contains(text(), 'MAMA')]/following-sibling::span").text fama_value = tooltip.find_element(By.XPATH, ".//span[contains(text(), 'FAMA')]/following-sibling::span").text print(f"新K线MAMA值: {mama_value}, FAMA值: {fama_value}") # 更新K线数量记录 previous_bar_count = current_bar_count
额外注意事项
- 元素定位调整:TradingView的页面结构可能会更新,建议用浏览器开发者工具(F12)实际查看K线和tooltip的具体class或XPath,随时调整定位表达式。
- 反爬规避:频繁的自动化操作可能触发TradingView的反爬机制,建议在循环中加入合理的等待时间,或者偶尔模拟鼠标移动到其他位置,让行为更贴近真实用户。
- 优先用显式等待:尽量用
WebDriverWait替代time.sleep,这样可以提高代码稳定性,避免不必要的等待。
内容的提问来源于stack exchange,提问作者Logan Thompson
相关产品推荐
相关产品推荐

