
当`pandas.read_html`无法识别网页表格时,通常是由于表格内容通过JavaScript动态加载。本教程将指导您使用浏览器开发者工具定位数据源的XHR请求,并通过Python的`requests`库模拟该请求,直接获取原始JSON数据,最终利用`pandas`库将其转换为结构化的DataFrame,从而高效、准确地提取动态网页表格数据。
pandas.read_html是一个非常便捷的函数,用于从HTML页面中解析<table>标签并将其转换为DataFrame列表。然而,它的工作原理是解析页面的原始HTML源代码。现代网页为了提供更丰富的交互体验,常常使用JavaScript在页面加载完成后动态地从后端API获取数据并渲染表格。在这种情况下,当read_html执行时,原始HTML中可能只包含一个空的<div>或<table>容器,实际的数据内容尚未被JavaScript注入,因此read_html会返回一个空列表。
即使使用Selenium等自动化工具模拟浏览器行为,如果只是简单地获取元素的outerHTML属性,也可能因为数据是通过独立的API请求获取并渲染的,导致获取到的HTML字符串仍不包含实际数据,或者只包含一个空的表格结构。解决这类问题的关键在于绕过HTML解析,直接与数据源进行交互。
要成功抓取动态加载的表格数据,核心步骤是找到网页背后获取数据的API请求。这通常可以通过浏览器的开发者工具(Developer Tools)来完成。
通过分析这些请求,您将能够确定数据请求的URL、请求方法(GET或POST)、需要发送的任何参数以及响应数据的格式。
一旦识别出数据源的API请求,我们就可以使用Python的requests库来模拟这个请求,直接获取原始数据。
根据开发者工具中观察到的XHR请求信息,提取以下关键参数:
以本例为例,通过开发者工具分析,我们发现数据是通过一个POST请求发送到https://anex.us/grades/getData/,并带有一些表单数据。
import requests
import pandas as pd
# 1. 定义数据请求的URL
url = 'https://anex.us/grades/getData/'
# 2. 定义请求的载荷(payload),对应开发者工具中看到的Form Data
# 在本例中,查询ENGR 102的成绩数据
payload = {'dept': 'ENGR', 'number': '102'}
# 3. 定义请求头,模拟浏览器行为
# 包含User-Agent通常能有效避免部分反爬机制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0'}
# 4. 发送POST请求并获取响应
# 对于GET请求,使用 requests.get(url, params=payload, headers=headers)
response = requests.post(url, data=payload, headers=headers)
# 5. 检查请求是否成功
response.raise_for_status() # 如果请求失败(例如4xx或5xx状态码),会抛出HTTPError
# 6. 解析JSON响应数据
# 大多数动态数据API返回JSON格式
data = response.json()
# 7. 将JSON数据转换为Pandas DataFrame
# 根据JSON结构,提取包含表格数据的部分。
# 在本例中,数据位于 'classes' 键下
df = pd.DataFrame(data['classes'])
# 打印DataFrame的前几行以验证数据
print(df.head())dept number section A B C D F I S U Q X prof year semester gpa 0 ENGR 102 20 18 17 8 2 3 0 0 0 1 0 AMINI N 2018 FALL 2.9375 1 ENGR 102 21 18 31 15 4 1 0 0 0 0 0 KOOLA P 2018 FALL 2.88405797101449 2 ENGR 102 22 10 28 16 2 3 0 0 0 0 0 SHAW S 2018 FALL 2.67796610169492 3 ENGR 102 26 9 24 10 4 6 0 0 0 0 0 SUBRAMANIAN R 2018 FALL 2.49056603773585 4 ENGR 102 201 21 12 1 1 0 0 0 0 0 0 IJAZ M 2018 FALL 3.51428571428571
当pandas.read_html无法满足动态网页表格抓取的需求时,最有效的方法是深入其背后,通过浏览器开发者工具识别并直接调用数据接口(XHR请求)。利用requests库模拟这些请求,获取原始结构化数据(通常是JSON),再结合pandas进行数据清洗和分析,可以高效、准确地提取所需信息。掌握这一技巧,将极大地扩展您从网络获取数据的能力。
以上就是如何高效抓取动态加载的网页表格数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号