You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium无法获取warcraftlogs.com页面源码,如何爬取该站数据?

解决Warcraft Logs页面动态内容爬取问题

问题原因

该站点属于单页应用(SPA),核心数据完全依赖JavaScript动态渲染。你当前的代码在页面刚启动就抓取源码,此时动态内容还未生成;直接用requests请求也无法执行JS,自然拿不到实际数据。

解决方案1:优化Selenium等待逻辑

给Selenium添加显式等待,确保目标内容渲染完成后再获取源码:

  1. 安装依赖(兼容ChromeDriver版本):
pip install selenium webdriver-manager
  1. 修改后的代码:
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比爬页面更高效:

  1. 抓包找API:打开浏览器开发者工具(F12)→ 切换到Network标签→ 刷新页面,筛选XHR/Fetch请求,找到返回排行榜数据的接口。比如你访问的页面,对应API可能类似https://www.warcraftlogs.com/v1/rankings/zone/29,参数包含boss、metric等。

  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:40:46