Python如何正确爬取JS网站数据?用Selenium爬aoe2排行榜拿不到完整源码怎么办
你当前代码的核心问题
- 未等待异步动态内容加载完成:调用
driver.get(url)后立刻读取page_source,但目标页面的排行榜数据是JavaScript通过异步请求后续渲染到DOM中的,此时初始页面源码还未包含这些动态生成的内容。Chrome检查元素面板展示的是页面加载数秒、JS执行完毕后的实时DOM树状态,和代码立刻读取的初始源码完全不是同一时间节点的内容。 - 存在冗余无效代码:
code = driver.get(url)这行没有实际作用,get()方法无返回值,不会为任何变量赋值。 - 缺少资源释放逻辑:用完驱动后未调用
driver.quit()释放浏览器进程,长期运行会占用系统内存。
最小可运行的修复代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://aoe2.net/#aoe2de-leaderboard-rm-1v1' driver = webdriver.Chrome() driver.get(url) # 显式等待:直到排行榜表格元素加载完成,最长等待15秒 wait = WebDriverWait(driver, 15) wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, 'table.leaderboard-table')) ) page_source = driver.page_source print(page_source) # 释放浏览器进程 driver.quit()
爬取JS渲染站点的通用正确方法
- 优先定位后端接口,优先于全页面Selenium渲染:浏览器中看到的所有动态数据,本质都是前端JS发起网络请求从后端获取的结构化数据。打开开发者工具的网络面板,筛选Fetch/XHR类型的请求,刷新页面定位到返回玩家排行数据的接口,直接用常规HTTP请求库获取返回的JSON数据即可,效率比Selenium高一个数量级,也不会因为页面渲染波动拿不到目标数据。
- 必须使用Selenium时,不推荐固定时间等待:不要依赖
time.sleep()固定等待几秒的写法,网络波动时哪怕等再久也可能加载失败,网络通畅时固定等待纯属浪费时间。统一使用显式等待,判断目标DOM元素存在、可交互之后,再执行后续解析、提取源码的操作。 - 明确两个核心概念的边界:Chrome「检查元素」展示的是实时更新的DOM树,包含所有JS动态生成的内容;无等待读取的
page_source是浏览器收到的初始静态HTML源码,本身就不包含后续动态加载的内容,这是浏览器的基础运行机制,不是工具故障。
内容的提问来源于stack exchange,提问作者Syzygy
相关产品推荐
相关产品推荐

