如何用Python提取无限滚动网页数据?TradingView筛选器提取失败求助
嘿,我来帮你解决这两个问题——先从通用的无限滚动网页数据提取说起,再针对你提到的TradingView网站给出具体方案~
无限滚动网页的核心逻辑是滚动触发JS动态加载数据,像你用requests直接拉取静态HTML的方式,只能拿到页面初始加载的内容,根本碰不到后续滚动才会出现的数据。通常有两种靠谱的解决思路:
方法1:模拟浏览器交互(适合复杂场景)
用Selenium、Playwright这类工具模拟真实用户的浏览操作——比如滚动页面、点击按钮,让页面像人浏览一样逐步加载所有数据。这种方法兼容性极强,哪怕网站需要登录、有复杂JS逻辑都能搞定,唯一缺点是速度稍慢。
方法2:直接抓取数据API(效率更高)
打开浏览器开发者工具(按F12),切换到「Network」标签,滚动页面时盯着XHR/fetch请求,找到返回数据的API接口。直接请求这些接口拿数据,不用管页面渲染,速度快很多——前提是你能找到接口,并且搞定必要的认证(比如登录后的Cookie)。
你的代码失效,本质是两个原因:一是这个网站的表格数据是滚动时才动态加载的,静态请求拿不到后续内容;二是未登录用户可能被限制加载数量,登录后才能获取完整数据。给你两个可行的解决方案:
方案一:用Selenium模拟登录+滚动加载
这是最直接的办法,完全模拟真实用户操作:
- 先安装Selenium和对应浏览器驱动(比如ChromeDriver,要和你的Chrome版本匹配)
- 模拟登录TradingView(如果经常使用,可以提前保存Cookie跳过重复登录)
- 循环滚动页面直到没有新数据加载
- 提取你需要的股票代码
给你写了示例代码,里面标注了登录部分的注释,你可以根据自己的情况调整:
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:
- 登录TradingView后,打开浏览器F12→Network→XHR,滚动页面,找类似
/screener/scan的请求(这是TradingView筛选器常用的数据接口) - 复制这个请求的Headers(尤其是Cookie、Authorization这类认证信息)和参数
- 用
requests循环请求分页数据,直到拿到所有内容
注意:TradingView的API有反爬机制,请求频率别太高,而且接口参数可能会随网站更新变动,需要自己抓包确认最新的请求格式。
最后总结下:无限滚动网页优先找API,速度快;如果API不好抓或者需要登录交互,就用Selenium这类工具模拟浏览器。
内容的提问来源于stack exchange,提问作者prashanth manohar




