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

如何从指定ASPX网页爬取表格到Pandas?已试Requests/Request-HTML无效

解决方案:爬取动态渲染页面表格到Pandas DataFrame

问题根源

目标页面的表格是JavaScript动态渲染的,初始HTTP请求返回的HTML中没有完整表格数据,直接用requests或未启用渲染的requests-HTML无法获取到有效内容。

方案一:改进requests-HTML,启用页面渲染

通过调用render()方法让JavaScript执行,同时伪装浏览器请求头避免被反爬识别:

from requests_html import HTMLSession
import pandas as pd

def get_stats(name, year):
    with HTMLSession() as s:
        # 伪装浏览器请求头
        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'
        }
        url = 'https://www.perfectgame.org/College/CollegePlayerReports.aspx'
        response = s.get(url, headers=headers)
        # 渲染页面,等待JS执行完成(sleep参数可根据页面加载速度调整)
        response.html.render(sleep=3, timeout=10)
        # 定位目标表格
        table = response.html.find('table.Grid', first=True)
        
        if table:
            df = pd.read_html(table.html, header=0)[0]
            print(df)
        else:
            print("未找到class为Grid的表格,请检查页面元素选择器")

方案二:使用Selenium模拟真实浏览器(更稳定)

如果requests-HTML的渲染引擎被网站识别拦截,用Selenium调用真实浏览器内核渲染页面是更可靠的选择:

前置准备

  1. 安装Selenium:pip install selenium
  2. 下载对应浏览器的驱动(如ChromeDriver,需与浏览器版本匹配),并确保驱动路径在系统环境变量中。

代码实现

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pandas as pd
from time import sleep

def get_stats(name, year):
    # 配置Chrome无头模式(不显示浏览器窗口)
    chrome_options = Options()
    chrome_options.add_argument('--headless=new')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('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')
    
    # 初始化浏览器驱动
    with webdriver.Chrome(options=chrome_options) as driver:
        driver.get('https://www.perfectgame.org/College/CollegePlayerReports.aspx')
        # 等待页面动态内容加载完成
        sleep(3)
        # 读取页面中的表格
        dfs = pd.read_html(driver.page_source, attrs={'class': 'Grid'}, header=0)
        
        if dfs:
            df = dfs[0]
            print(df)
        else:
            print("未找到目标表格,请检查页面元素属性")

额外注意事项

  • 反爬拦截:如果仍无法获取数据,可能网站存在Cookie验证或IP限制。可尝试手动登录网站后复制Cookie,添加到请求头中;或使用代理IP分散请求来源。
  • 选择器验证:打开浏览器开发者工具,确认目标表格的class确实为Grid,若页面存在多个同名表格,可使用更精确的定位方式(如XPath)筛选目标表格。

内容的提问来源于stack exchange,提问作者sleepfreak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:49:06