Selenium无法获取warcraftlogs.com页面源码,如何爬取该站数据?
解决Warcraft Logs页面动态内容爬取问题
问题原因
该站点属于单页应用(SPA),核心数据完全依赖JavaScript动态渲染。你当前的代码在页面刚启动就抓取源码,此时动态内容还未生成;直接用requests请求也无法执行JS,自然拿不到实际数据。
解决方案1:优化Selenium等待逻辑
给Selenium添加显式等待,确保目标内容渲染完成后再获取源码:
- 安装依赖(兼容ChromeDriver版本):
pip install selenium webdriver-manager
- 修改后的代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome驱动(自动匹配版本) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.warcraftlogs.com/zone/rankings/29#boss=2512&metric=hps&difficulty=3&class=Priest&spec=Discipline") try: # 等待排行榜表格加载完成(选择器可通过浏览器开发者工具确认) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table.rankings-table")) ) # 此时页面内容已渲染,抓取源码 page_source = driver.page_source with open("page_source.html", "w", encoding='utf-8') as f: f.write(page_source) finally: driver.quit()
- 等待时间设为20秒,可根据网络情况调整;若目标元素选择器不对,自行在浏览器中检查修正。
解决方案2:直接调用站点API(更高效稳定)
这类数据驱动的站点通常会暴露后端API接口,直接请求API比爬页面更高效:
抓包找API:打开浏览器开发者工具(F12)→ 切换到
Network标签→ 刷新页面,筛选XHR/Fetch请求,找到返回排行榜数据的接口。比如你访问的页面,对应API可能类似https://www.warcraftlogs.com/v1/rankings/zone/29,参数包含boss、metric等。用
requests请求API示例:
import requests import json headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } params = { "boss": 2512, "metric": "hps", "difficulty": 3, "class": "Priest", "spec": "Discipline" # 部分API可能需要api_key,可从站点开发者文档申请或页面JS中查找 } response = requests.get("https://www.warcraftlogs.com/v1/rankings/zone/29", headers=headers, params=params) if response.status_code == 200: data = response.json() with open("rankings_data.json", "w", encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)
反爬注意事项
- 不要频繁请求,添加随机延时(如
time.sleep(random.uniform(1,3))) - 模拟真实浏览器的请求头,避免被识别为爬虫
- 若遇IP封禁,可使用代理IP轮换
内容的提问来源于stack exchange,提问作者llinux
相关产品推荐
相关产品推荐

