Python爬取动态网页数据:绕过JavaScript渲染直接调用API的策略

python爬取动态网页数据:绕过javascript渲染直接调用api的策略

在处理由JavaScript动态加载内容的现代网页时,传统的BeautifulSoup解析HTML可能无法获取到完整数据。本教程将介绍一种更高效、稳定的方法:通过分析浏览器网络请求,识别并直接调用网站后端API,从而获取结构化的JSON数据,并使用Pandas进行便捷处理,有效解决动态内容抓取难题。

动态网页爬取挑战与API调用策略

许多现代网站,特别是金融交易平台或社交媒体,其核心数据并非直接嵌入在初始加载的HTML中。相反,这些数据通常通过JavaScript在浏览器端异步请求(AJAX)获取,然后动态渲染到页面上。当尝试使用requests库获取页面HTML并结合BeautifulSoup进行解析时,往往只会得到一个包含加载动画、样式定义(如标签)或空占位符的“骨架”页面,而实际业务数据则缺失。

解决这一问题的有效策略是绕过前端渲染过程,直接与网站后端提供数据的API进行交互。通过这种方式,我们可以直接获取到结构化的JSON或XML数据,避免了复杂的HTML解析,且通常更稳定、效率更高。

识别目标API请求

要实现API调用,首先需要识别出网页加载数据时所调用的具体API。这通常通过浏览器的开发者工具完成:

立即学习“Java免费学习笔记(深入)”;

打开开发者工具: 在Chrome、Firefox等浏览器中,右键点击页面并选择“检查”或按F12。切换到“网络”(Network)选项卡: 刷新页面,观察网络请求列表。筛选XHR/Fetch请求: 大多数动态数据请求会显示为XHR (XMLHttpRequest) 或 Fetch 类型。定位数据请求: 仔细查看请求的URL、请求方法(GET/POST)、请求头(Headers)和请求载荷(Payload)。通常,数据请求的响应类型会是JSON。以Binance P2P为例,通过观察发现,当页面加载价格数据时,会向https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search发送一个POST请求。这个请求包含了content-type、accept-language、User-Agent等请求头,以及一个JSON格式的请求体,其中定义了查询条件,如asset (USDT)、fiat (RUB)、tradeType (BUY) 等。

构建API请求与数据解析

一旦识别出目标API及其请求参数,就可以使用Python的requests库来模拟这个请求。对于JSON响应,pandas库的json_normalize函数是处理嵌套JSON数据的强大工具。

示例代码

以下是使用Python模拟Binance P2P API请求并解析数据的示例:

import requestsimport pandas as pdfrom fake_useragent import UserAgent # 用于生成随机User-Agent,模拟真实浏览器行为# 1. 初始化Requests会话和请求头# 使用requests.Session()可以保持会话,并在所有请求中重用相同的TCP连接和请求头,提高效率s = requests.Session()# 模拟浏览器请求头,避免被网站识别为爬虫# User-Agent是关键,可以从浏览器开发者工具中复制,或使用fake_useragent库生成ua = UserAgent(verify_ssl=False)headers = {    'content-type': 'application/json', # 明确告诉服务器发送的是JSON数据    'accept-language': 'en-US,en;q=0.9',    'User-Agent': ua.random # 使用随机User-Agent}# 2. 定义API请求的URL和载荷(Payload)# 载荷是POST请求体中的JSON数据,同样从浏览器开发者工具中复制payload = {    "proMerchantAds": False,    "page": 1,    "rows": 10,    "payTypes": [],    "countries": [],    "publisherType": None,    "asset": "USDT",    "fiat": "RUB",    "tradeType": "BUY"}# 目标API的URLurl = 'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search'# 3. 发送POST请求# 更新会话的请求头s.headers.update(headers)# 发送POST请求,data参数需要是JSON字符串,requests会自动处理json=payload# 或者使用json=payload,requests会自动将字典序列化为JSON字符串并设置Content-Typer = s.post(url, json=payload) # 使用json=payload更简洁# 4. 处理API响应# 检查请求是否成功if r.status_code == 200:    # 解析JSON响应数据    json_data = r.json()    # 检查'data'字段是否存在且不为空    if 'data' in json_data and json_data['data']:        # 使用pandas.json_normalize将嵌套的JSON数据展平为DataFrame        # 'data'字段通常包含列表形式的记录        df = pd.json_normalize(json_data['data'])        print(df.head()) # 打印DataFrame的前几行        # 进一步提取所需数据,例如价格和交易方法        # 假设我们需要提取价格和所有交易方法        # price_data = df[['adv.price', 'advertiser.nickName', 'adv.tradeMethods']]        # print("n提取的价格和交易方法数据:")        # print(price_data.head())    else:        print("API响应中没有找到'data'字段或'data'字段为空。")        print(json_data) # 打印完整JSON响应以供调试else:    print(f"请求失败,状态码:{r.status_code}")    print(f"响应内容:{r.text}")

代码说明

requests.Session(): 创建一个会话对象,用于在多个请求之间保持参数(如headers)和底层TCP连接,提高效率。headers: 包含User-Agent、content-type等HTTP头信息。User-Agent是模拟浏览器行为的关键,content-type: application/json则告知服务器请求体是JSON格式。payload: 这是一个Python字典,它会被requests库自动序列化为JSON字符串,并作为POST请求的请求体发送。其内容与在浏览器开发者工具中看到的请求载荷一致。s.post(url, json=payload): 发送POST请求。json参数会自动将Python字典转换为JSON格式的请求体,并设置正确的Content-Type头。r.json(): 将API响应体解析为Python字典。pd.json_normalize(r.json()[‘data’]): 这是处理嵌套JSON的关键。它能够将复杂的JSON结构(特别是包含列表和字典嵌套的)展平为一个Pandas DataFrame,方便后续的数据分析和处理。例如,原始JSON中adv和advertiser下的字段会被展平为adv.price、advertiser.nickName等列名。

注意事项与最佳实践

动态载荷: 有些网站的API请求载荷或请求头可能包含动态生成的值(如时间戳、签名、CSRF token)。在这种情况下,需要进一步分析JavaScript代码或使用Selenium等工具模拟浏览器行为来获取这些动态值。频率限制与反爬机制: 频繁的API请求可能触发网站的反爬机制,导致IP被封禁。建议:设置合理的请求间隔(time.sleep())。使用代理IP池。轮换User-Agent。错误处理: 始终检查HTTP响应状态码(r.status_code)以确保请求成功,并对可能出现的异常(如网络错误、JSON解析失败)进行处理。数据字段变化: 网站API接口可能会更新,导致字段名或结构发生变化。定期检查API文档或重新分析网络请求是必要的。隐私与合规性: 在爬取数据时,务必遵守网站的服务条款和相关法律法规,避免非法获取或滥用数据。

总结

对于数据由JavaScript动态加载的现代网页,直接通过requests和BeautifulSoup解析初始HTML往往无法奏效。通过利用浏览器开发者工具分析网络请求,识别并直接调用网站后端API,可以高效、稳定地获取到结构化的JSON数据。结合Pandas的json_normalize功能,可以轻松将这些数据转换为易于处理的DataFrame格式,为后续的数据分析奠定基础。这种方法不仅解决了动态网页的爬取难题,也通常比模拟完整浏览器渲染(如使用Selenium)更加高效和轻量。

以上就是Python爬取动态网页数据:绕过JavaScript渲染直接调用API的策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1596645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
React中获取下拉菜单选中值的方法详解
上一篇 2025年12月23日 11:21:02
在Vanilla JavaScript中动态创建与操作SVG:从XML到DOM
下一篇 2025年12月23日 11:21:15

相关推荐

  • 大数据量下的批量导入/导出优化

    在大数据环境下优化批量导入/导出的方法包括:1. 使用批处理技术分批导入/导出数据,减少系统资源压力;2. 采用数据流技术如apache kafka进行实时处理,降低内存占用;3. 利用并行处理技术分配任务到多个处理器或节点,提高处理速度;4. 通过性能监控和调优识别并解决瓶颈点,以提升整体效率。 …

    2026年9月21日
    200
  • vivo Y77充电时间太长怎么解决 vivo Y77快充功能讲解

    vivo Y77充电变慢应先排查配件、设置和环境因素。1.确认使用原装44W充电器和完好数据线;2.清洁充电口灰尘,避免接触不良;3.更换墙插测试,避免电源问题;4.开启【设置>电池>充电设置】中的“默认超快充电模式”;5.避免边充边用,减少发热;6.关闭后台应用,提升充电效率;7.观察…

    2026年9月21日
    200
  • VSCode的代码格式化快捷键是什么?

    VSCode代码格式化快捷键为Shift+Alt+F(Windows/Linux)或Shift+Option+F(macOS),需安装对应语言的格式化工具;若无效,可能是未安装扩展、文件类型不支持或快捷键冲突;可右键选择“格式化文档”或通过命令面板执行,也可在键盘快捷方式中自定义。 VSCode的代…

    2026年9月21日
    000
  • 抖音电商橱窗带货技巧:如何有效提高转化率

    一、引言 近年来,随着短视频内容生态的蓬勃发展,抖音已成为电商营销的重要阵地。其中,电商橱窗作为连接用户与商品的核心工具,被越来越多商家和创作者广泛使用。在竞争日益激烈的环境中,掌握有效的带货技巧,提升转化效率,成为实现销售增长的关键。本文将深入解析如何通过科学策略提升抖音电商橱窗的运营效果。 二、…

    2026年9月21日
    100
  • Linux怎么踢出指定的登录用户

    要踢出指定登录用户,首先使用w或who命令识别其TTY或会话ID,再通过pkill -KILL -t 强制终止会话,或用loginctl terminate-session 优雅结束;若需防止重新登录,可临时锁定账户(passwd -l)或将用户shell改为/sbin/nologin。 在Linu…

    2026年9月21日
    000
  • edge浏览器如何安装Chrome网上应用店的扩展_edge浏览器安装Chrome扩展方法

    答案:可通过四种方法在Edge浏览器中安装Chrome扩展。1、直接从Chrome网上应用店添加扩展,Edge会自动识别并安装;2、手动下载CRX或ZIP文件,通过开启开发者模式加载已解压的扩展程序;3、从Crx4Chrome等第三方平台下载兼容扩展并按手动方式安装;4、对扩展的manifest.j…

    2026年9月21日
    000
  • 如何在Java中实现简单的输入输出

    使用Scanner类读取键盘输入,需导入java.util.Scanner并创建实例;2. 调用nextInt、nextLine等方法获取不同类型数据,注意nextInt不读取换行符可能导致nextLine读取空字符串;3. 推荐使用后关闭Scanner;4. 输出通过System.out.prin…

    2026年9月21日
    000
  • 自定义组件(Component)的开发方法

    开发自定义组件的步骤包括:1. 使用html和css定义组件结构和样式;2. 用javascript实现动态效果和状态管理;3. 确保跨浏览器和设备兼容性;4. 采用模块化设计和外部状态管理工具;5. 进行性能优化和测试驱动开发。通过这些步骤,可以创建出优雅且高效的自定义组件,提升用户体验。 在开发…

    2026年9月21日
    000
  • Safari浏览器弹窗频繁怎么办 Safari浏览器弹窗拦截设置方法

    先设置全局拦截再允许特定网站弹窗。打开Safari设置→网站→弹出式窗口,将“访问其他网站时”设为“阻止”,再针对需使用弹窗的网站单独设为“允许”;iOS端在设置App中开启“阻止弹出式窗口”即可,必要时临时关闭。 如果你在使用 Safari 浏览器时被频繁弹窗打扰,可以按需设置全局或针对特定网站的…

    2026年9月21日
    000
  • mac怎么用命令行定时关机_Mac命令行定时关机方法

    使用shutdown命令可设定Mac在指定时间或相对分钟后关机;2. 通过pmset命令能创建每周重复的定时关机任务;3. 可用pmset -g sched查看计划,sudo pmset repeat cancel取消重复任务,kill终止一次性关机。 如果您希望在离开电脑后让Mac在特定时间自动关…

    2026年9月21日
    100
  • iPhone SE如何录制屏幕带声音的教程

    先添加录屏到控制中心并开启麦克风,再开始录制。打开设置→控制中心,添加屏幕录制按钮;录屏前长按录屏图标开启麦克风(变红),点击开始录制,倒计时3秒后启动,操作画面与声音同步记录,结束时点红色状态栏选停止,视频自动保存至照片App。 iPhone SE录制屏幕并带上声音,操作其实很简单。关键在于正确设…

    2026年9月21日
    000
  • 抖音扫码点单小程序介绍及使用方法解析

    抖音扫码点单小程序在哪里 引言: 在移动互联网迅猛发展的背景下,小程序已深度融入人们的日常生活。作为抖音生态中的重要一环,抖音扫码点单小程序为线下消费场景注入了新的活力,搭建起商家与用户之间高效互动的桥梁。本文将围绕其核心功能、具体操作流程以及市场数据表现等方面进行全面解读,助力用户和商户更好地掌握…

    2026年9月21日
    000
  • Linux如何查看默认网关

    使用ip route命令可查看默认网关,如ip route | grep default显示default via 192.168.1.1 dev eth0,其中192.168.1.1为网关地址。 在Linux系统中,查看默认网关是网络排查中的常见操作。可以通过命令行工具快速获取当前系统的默认路由信…

    2026年9月21日
    200
  • VSCode的快捷键映射冲突怎么办?

    首先查看快捷键绑定情况,通过Ctrl+K再Ctrl+S打开键盘快捷方式界面,搜索目标键组合如Ctrl+Shift+P,查看并识别冲突命令;接着右键冲突命令选择“更改键绑定”设置新组合或删除多余绑定;为精确定位,可查看命令ID如workbench.action.quickOpen区分相似命令;若调整较…

    2026年9月21日
    000
  • mysql如何排查磁盘IO瓶颈

    首先检查系统级磁盘IO,使用iostat、iotop等工具分析磁盘利用率和进程IO行为;再通过MySQL慢查询日志、sys.schema视图及SHOW ENGINE INNODB STATUS排查高IO消耗的SQL与内部等待事件;接着评估innodb_buffer_pool_size、innodb_…

    2026年9月21日
    000
  • 在Java中如何创建一个天气查询小应用

    注册OpenWeatherMap获取API密钥;2. 使用Java 11+的HttpClient发送HTTP请求;3. 构造带城市参数的URL并调用天气接口;4. 解析返回的JSON数据提取温度和天气描述;5. 在控制台输出结果,支持中文城市需URL编码。 在Java中创建一个天气查询小应用,核心是…

    2026年9月21日
    000
  • MAC怎么查询硬件序列号_Mac查找本机序列号与保修信息

    首先可通过“关于本机”查看Mac序列号,依次点击苹果菜单→“关于本机”即可获取;也可通过“系统信息”或“终端”命令ioreg -l | grep IOPlatformSerialNumber查找;若无法操作设备,可登录Apple ID账户在线查询;最后访问苹果官网保修查询页面输入序列号,即可验证保修…

    2026年9月21日
    200
  • 在VSCode中如何安全地切换分支而不丢失当前修改?

    先处理未提交修改再切换分支。可通过提交更改、使用Stash保存临时修改,或选择性暂存部分文件来安全切换,并在切换后恢复贮藏的更改,避免代码丢失。 在 VSCode 中切换分支时,如果当前有未提交的修改,直接切换可能会导致冲突或代码丢失。要安全切换分支,关键是先处理好当前的更改。以下是几种稳妥的方法。…

    2026年9月21日
    100
  • win11右下角操作中心图标点击无反应怎么办_Win11操作中心图标无反应修复方法

    1、重启Windows资源管理器可解决因进程异常导致的操作中心无响应问题;2、运行DISM和SFC命令修复系统文件损坏;3、通过Windows更新安装最新补丁;4、在组策略中确保“删除通知和操作中心”未被启用;5、使用系统恢复选项重新安装系统组件以排除配置冲突,适用于专业版或企业版用户。 如果您尝试…

    2026年9月21日
    200
  • Safari浏览器下载中断怎么办 Safari浏览器下载失败问题修复方法

    先检查下载状态和权限设置,确认网站未被限制下载;通过无痕模式测试排除缓存或插件干扰;清理部分下载文件并更换网络环境;最后更新系统以确保兼容性。 遇到 Safari 下载中断或失败,别急着重启电脑。先确认下载是否真的卡住,有时只是速度慢。点按浏览器右下角的“显示所有下载”按钮(箭头方框图标),查看列表…

    2026年9月21日
    300

发表回复

登录后才能评论
关注微信