如何从指定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调用真实浏览器内核渲染页面是更可靠的选择:
前置准备
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(如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
相关产品推荐
相关产品推荐

