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

网页爬取故障:Python爬取梦幻橄榄球排名遇JS渲染及元素定位失败

解决梦幻橄榄球排名数据爬取问题

方案一:直接提取页面JS变量(无需Selenium,更适合零基础)

你提到用BeautifulSoup解析时只得到var ecrData,这其实是突破口——页面的排名数据大概率存在这个JS变量里,不用费劲解析渲染后的表格,直接提取这个变量的内容即可:

  1. 用requests获取页面源码
  2. 用正则匹配出ecrData对应的JSON字符串
  3. 转成Python可处理的字典,再导出为CSV

代码示例:

import requests
import re
import json
import pandas as pd

# 替换成你要爬的目标网页URL
target_url = "你的目标网页地址"
page_html = requests.get(target_url).text

# 匹配var ecrData后面的JSON数据
data_pattern = re.compile(r'var ecrData = (.*?);', re.DOTALL)
match_result = data_pattern.search(page_html)

if match_result:
    # 提取并转成Python字典
    raw_json = match_result.group(1)
    ranking_data = json.loads(raw_json)
    # 这里的'players'是假设的键名,实际要根据ecrData的结构调整
    df = pd.DataFrame(ranking_data['players'])
    # 导出CSV
    df.to_csv('梦幻橄榄球排名.csv', index=False, encoding='utf-8-sig')
    print("数据已成功导出为CSV!")
else:
    print("未找到ecrData变量,请检查正则表达式或页面结构")

方案二:修复Selenium定位失败问题

你遇到的NoSuchElementException和页面结构不一致问题,主要是页面未完全渲染就操作或定位器不准确导致的,按下面步骤调整:

核心解决点:

  • 用显式等待替代直接定位,确保元素加载完成
  • 避免用绝对XPATH,改用相对定位或属性模糊匹配
  • 检查元素是否在iframe中,若有需先切换iframe

代码示例:

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
import pandas as pd

# 初始化浏览器驱动(需提前安装对应浏览器的驱动,如ChromeDriver)
driver = webdriver.Chrome()
driver.get("你的目标网页URL")

try:
    # 显式等待表格加载,最长等待10秒,替换成实际的表格定位器
    ranking_table = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'ranking-table')]"))
    )
    
    # 提取表格行和列数据
    table_rows = ranking_table.find_elements(By.TAG_NAME, "tr")
    table_content = []
    for row in table_rows:
        cols = row.find_elements(By.TAG_NAME, "td")
        row_text = [col.text.strip() for col in cols]
        if row_text:  # 跳过空行
            table_content.append(row_text)
    
    # 转成DataFrame并导出
    df = pd.DataFrame(table_content[1:], columns=table_content[0])  # 第一行作为表头
    df.to_csv('梦幻橄榄球排名.csv', index=False, encoding='utf-8-sig')
    print("CSV导出成功!")
except Exception as e:
    print(f"爬取出错:{str(e)}")
finally:
    driver.quit()

额外注意事项:

  • Selenium驱动版本必须和浏览器版本一致,否则会报错
  • 如果浏览器检查元素时看到的结构和page_source输出不同,说明页面是动态加载的,必须等待渲染完成再获取源码
  • 若元素在iframe内,需先执行driver.switch_to.frame("iframe_id_or_name"),操作完后切回主文档:driver.switch_to.default_content()

内容的提问来源于stack exchange,提问作者Kevin O'Keefe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:57:27