新闻中心

Python获取动态网页数据:当pandas.read_html无法识别表格时

2025-11-06
浏览次数:
返回列表

Python获取动态网页数据:当pandas.read_html无法识别表格时

当`pandas.read_html`无法从网页中提取可见表格时,通常是因为数据通过j*ascript动态加载。本教程将演示如何利用浏览器开发者工具识别底层的api请求,然后使用`requests`库直接获取json数据,并将其转换为pandas dataframe,从而为提取此类动态web内容提供一个健壮的解决方案。

深入理解pandas.read_html的局限性

pandas.read_html是一个非常便捷的工具,用于从HTML页面中解析

标签并将其转换为DataFrame。然而,它的工作原理是解析页面的静态HTML源代码。如果网页中的表格内容是通过J*aScript在页面加载完成后动态生成或从后端API异步获取的,那么read_html在检查原始HTML时将无法找到这些表格,从而返回一个空列表。

即使尝试使用Selenium等工具来渲染页面,然后获取元素属性,如果目标表格的HTML内容本身也是通过J*aScript填充的,并且在检查时还未完全渲染或获取到数据,也可能导致获取到空内容。在这种情况下,最有效的方法是绕过前端渲染逻辑,直接与数据源API进行交互。

识别动态数据源:开发者工具的妙用

解决此类问题的关键在于找出网页在后台是如何获取这些动态数据的。现代浏览器都提供了强大的开发者工具,其中“网络”(Network)标签页是我们的主要战场。

  1. 打开开发者工具: 在目标网页上,按下F12键(或右键点击页面选择“检查”)。
  2. 切换到“网络”标签页: 清空(Clear)现有请求,然后刷新页面。
  3. 筛选XHR/Fetch请求: 在“网络”标签页中,通常有一个筛选器,选择“XHR”或“Fetch/XHR”可以只显示异步HTTP请求。这些请求通常是网页用于获取动态数据的。
  4. 分析请求: 仔细观察这些请求,寻找那些返回与表格数据相关内容的请求。对于本例,目标网站的表格数据是通过一个POST请求获取的。
    • 请求URL: 确定数据请求的实际API端点(例如,https://anex.us/grades/getData/)。
    • 请求方法: 是GET还是POST?(本例是POST)。
    • 请求头(Headers): 某些网站可能需要特定的请求头,例如User-Agent,以模拟浏览器行为。
    • 请求载荷(Payload/Form Data): 找出请求发送了哪些参数(例如,dept=ENGR&number=102)。

通过上述步骤,我们可以精确地模拟浏览器获取数据的过程。

使用requests和pandas获取并处理数据

一旦确定了API端点、请求方法、载荷和必要的请求头,就可以使用Python的requests库来模拟这个HTTP请求,并用pandas来处理返回的数据。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客110查看详情刺鸟创客

以下是实现此目标的Python代码示例:

import requests
import pandas as pd

# 1. 定义API端点
# 这是通过开发者工具识别出的实际数据接口URL,而不是显示表格的页面URL
url = 'https://anex.us/grades/getData/'

# 2. 定义请求载荷 (Payload)
# 这些参数是网站前端发送给后端API以获取特定数据所必需的
payload = {'dept': 'ENGR', 'number': '102'}

# 3. 定义请求头 (Headers)
# 模拟浏览器User-Agent可以帮助避免一些网站的反爬虫机制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0'}

# 4. 发送POST请求并获取响应
# 使用requests.post发送POST请求,并将载荷和请求头传递进去
try:
    response = requests.post(url, data=payload, headers=headers)
    response.raise_for_status()  # 检查HTTP请求是否成功 (200 OK)

    # 5. 解析JSON响应
    # 网站通常返回JSON格式的数据,使用.json()方法解析
    data = response.json()

    # 6. 将数据转换为pandas DataFrame
    # 根据JSON结构,提取包含实际表格数据的部分(例如,'classes'键)
    if 'classes' in data:
        df = pd.DataFrame(data['classes'])
        print(df.head()) # 打印前几行数据进行验证
        print(f"\n成功获取 {len(df)} 行数据。")
    else:
        print("JSON响应中未找到 'classes' 键。")

except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
except ValueError:
    print("无法解析JSON响应,可能响应内容不是有效的JSON格式。")
except Exception as e:
    print(f"发生未知错误: {e}")

输出示例:

   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

成功获取 491 行数据。

注意事项与最佳实践

  1. 动态载荷: 如果需要获取不同参数(如本例中的dept和number)的数据,可以将payload字典参数化,通过循环或函数调用来获取多组数据。
  2. 错误处理: 在实际应用中,务必添加健壮的错误处理机制,例如try-except块来捕获网络连接错误、HTTP状态码非200错误或JSON解析错误。
  3. User-Agent: 并非所有网站都需要设置User-Agent,但一些网站会检查它来阻止自动化脚本。模拟常见的浏览器User-Agent通常是一个好的实践。
  4. 频率限制与robots.txt: 在抓取数据时,请务必遵守网站的robots.txt协议,并尊重网站的访问频率限制,避免对服务器造成不必要的负担。过度或恶意抓取可能导致IP被封禁。
  5. 数据结构变化: 网站API的数据结构可能会随着时间而改变。如果脚本突然失效,请重新检查开发者工具以确认API端点或JSON结构是否有更新。

总结

当pandas.read_html无法满足动态网页数据抓取的需求时,直接与网站的后端API交互是更强大和灵活的解决方案。通过熟练运用浏览器的开发者工具,我们可以有效地识别数据来源,然后结合requests库模拟HTTP请求,并利用pandas库高效地将获取的JSON数据转换为结构化的DataFrame,从而克服动态网页数据提取的挑战。

以上就是Python获取动态网页数据:当pandas.read_html无法识别表格时的详细内容,更多请关注其它相关文章!


# 本例  # 民革衢州网站建设方案  # 谷歌SEO站群  # 奥迪网站建设方案模板图  # 手刷网站seo传播  # 宝鸡网站建设哪家更好  # 淄博seo推广哪家便宜  # 网站推广关键词怎么写的  # 西藏seo技巧  # 网站推广如何提高收录  # 黔南互联网推广营销  # 是一个  # 行数  # 无法识别  # 此类  # 我们可以  # linux  # 动态网页  # 转换为  # 数据结构  # 爬虫  # ai  # 后端  # 工具  # 浏览器  # json  # 前端  # js  # html  # java  # python  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: c++项目目录结构应该如何组织_c++工程化项目结构规范  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  cad如何更改注释性对象的比例_cad注释性比例调整方法  Typer应用中灵活处理命令行参数的令牌化与解析  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  高德地图沿途添加点失败如何解决 高德多点规划方法  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  如何在Promise链中优雅地中断后续then执行  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  免费抖音短视频入口_抖音网页版短视频免费通道  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  蛙漫移动版在线看 蛙漫手机浏览器直达入口  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  css绝对定位元素脱离父容器怎么办_确保父元素position非static  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  Discord Slash 命令响应超时问题的异步解决方案  poki免费入口快捷访问 poki人气小游戏直接玩站点  高德地图公交到站提醒失败如何解决 高德提醒权限设置  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  AngularJS $http POST请求数据传递与Go后端接收实践  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  vivo云服务网页版登录 怎么登录vivo云服务网页版  12306怎么选座位选到安静区_12306选座安静区域选择策略  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  马斯克:Optimus 人形机器人复数形式为 Optimi  在VS Code中配置和运行Dart程序的完整步骤  UC浏览器网页版登录入口官网 电脑版网址入口  Go语言中Map值调用指针接收器方法的限制与应对  曝R星经典之作开发图 设计简陋但信息密集!  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  如何在 Windows 11 中启动游戏手柄设置  126邮箱网页版官方入口 126邮箱账号在线登录平台  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  AO3官方可用镜像 Archive of Our Own网页版最新入口  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  在Pyomo中实现基于变量的条件约束:Big-M方法详解  使用Pandas转换并合并DataFrame:多列映射至统一结构  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  在Socket.IO连接中实现Access Token自动更新与动态重连  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程 

搜索