You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python提取无限滚动网页数据?TradingView筛选器提取失败求助

嘿,我来帮你解决这两个问题——先从通用的无限滚动网页数据提取说起,再针对你提到的TradingView网站给出具体方案~

如何用Python从无限滚动网页提取数据?

无限滚动网页的核心逻辑是滚动触发JS动态加载数据,像你用requests直接拉取静态HTML的方式,只能拿到页面初始加载的内容,根本碰不到后续滚动才会出现的数据。通常有两种靠谱的解决思路:

方法1:模拟浏览器交互(适合复杂场景)

用Selenium、Playwright这类工具模拟真实用户的浏览操作——比如滚动页面、点击按钮,让页面像人浏览一样逐步加载所有数据。这种方法兼容性极强,哪怕网站需要登录、有复杂JS逻辑都能搞定,唯一缺点是速度稍慢。

方法2:直接抓取数据API(效率更高)

打开浏览器开发者工具(按F12),切换到「Network」标签,滚动页面时盯着XHR/fetch请求,找到返回数据的API接口。直接请求这些接口拿数据,不用管页面渲染,速度快很多——前提是你能找到接口,并且搞定必要的认证(比如登录后的Cookie)。


针对TradingView Screener的数据提取问题

你的代码失效,本质是两个原因:一是这个网站的表格数据是滚动时才动态加载的,静态请求拿不到后续内容;二是未登录用户可能被限制加载数量,登录后才能获取完整数据。给你两个可行的解决方案:

方案一:用Selenium模拟登录+滚动加载

这是最直接的办法,完全模拟真实用户操作:

  1. 先安装Selenium和对应浏览器驱动(比如ChromeDriver,要和你的Chrome版本匹配)
  2. 模拟登录TradingView(如果经常使用,可以提前保存Cookie跳过重复登录)
  3. 循环滚动页面直到没有新数据加载
  4. 提取你需要的股票代码

给你写了示例代码,里面标注了登录部分的注释,你可以根据自己的情况调整:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化Chrome浏览器(确保ChromeDriver在系统PATH里,或者指定路径)
driver = webdriver.Chrome()
driver.get("https://uk.tradingview.com/screener/")
driver.maximize_window()

# ---------------------- 模拟登录(可选,已登录可跳过)----------------------
# 等待页面加载完成,点击登录按钮
# time.sleep(2)
# login_btn = driver.find_element(By.XPATH, "//button[contains(text(), 'Sign In')]")
# login_btn.click()
# time.sleep(2)
# 输入你的账号密码
# username = driver.find_element(By.ID, "username")
# username.send_keys("你的TradingView用户名")
# password = driver.find_element(By.ID, "password")
# password.send_keys("你的密码")
# submit_login = driver.find_element(By.XPATH, "//button[contains(text(), 'Sign In')]")
# submit_login.click()
# time.sleep(5)  # 等待登录跳转完成
# -------------------------------------------------------------------------

# 开始滚动加载所有数据
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 给页面留加载时间,网速慢的话可以调长
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    if new_scroll_height == last_scroll_height:
        break  # 没有新数据加载了,停止滚动
    last_scroll_height = new_scroll_height

# 提取所有股票代码
ticker_elements = driver.find_elements(By.CLASS_NAME, "tv-screener__symbol")
ticker_list = [elem.text for elem in ticker_elements if elem.text]
print("提取到的股票代码:", ticker_list)

# 关闭浏览器
driver.quit()

方案二:抓取TradingView的API接口(更高效)

如果不想用浏览器模拟,试试抓后台API:

  1. 登录TradingView后,打开浏览器F12→Network→XHR,滚动页面,找类似/screener/scan的请求(这是TradingView筛选器常用的数据接口)
  2. 复制这个请求的Headers(尤其是Cookie、Authorization这类认证信息)和参数
  3. requests循环请求分页数据,直到拿到所有内容

注意:TradingView的API有反爬机制,请求频率别太高,而且接口参数可能会随网站更新变动,需要自己抓包确认最新的请求格式。


最后总结下:无限滚动网页优先找API,速度快;如果API不好抓或者需要登录交互,就用Selenium这类工具模拟浏览器。

内容的提问来源于stack exchange,提问作者prashanth manohar

火山引擎 最新活动