0

0

Python Requests处理JavaScript动态加载内容的策略

碧海醫心

碧海醫心

发布时间:2025-12-08 16:00:57

|

220人浏览过

|

来源于php中文网

原创

python requests处理javascript动态加载内容的策略

在使用Python的requests和BeautifulSoup库进行网页数据抓取时,经常会遇到无法获取JavaScript动态加载内容的问题。本文将深入探讨这一挑战,并提供两种高效的解决方案:直接调用网站的后端API,以及通过正则表达式从初始HTML中提取嵌入数据。这些方法能帮助开发者绕过BeautifulSoup的局限性,实现对动态网页数据的精准抓取,从而构建更健壮、更灵活的数据采集脚本。

在开发网页数据抓取脚本时,开发者常面临一个挑战:某些网页内容并非在服务器端渲染后直接返回,而是通过JavaScript在客户端动态加载。当尝试使用requests库获取页面HTML,并用BeautifulSoup解析时,这些动态内容往往会缺失,导致无法提取到目标数据,例如返回None或空列表。这正是因为requests仅获取原始HTML响应,而不会执行页面中的JavaScript。

为了有效解决这一问题,我们可以采取以下两种策略:

策略一:识别并调用后端API(推荐)

许多动态加载内容的网站,其数据实际上是从后端API接口获取的。通过直接调用这些API,我们可以绕过前端的JavaScript渲染过程,直接获取到结构化的数据(通常是JSON格式)。

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

如何发现API接口? 使用浏览器的开发者工具(通常按F12打开),切换到“Network”(网络)选项卡。刷新页面,观察加载过程中发出的XHR/Fetch请求。这些请求往往就是网站用来获取动态数据的API调用。分析请求的URL、请求方法、请求头和响应内容,可以帮助我们找到目标API。

示例:获取最新的交易数据

假设我们需要从一个区块链地址页面获取最新的交易金额,而该金额是通过JavaScript加载的。通过开发者工具分析,我们可能会发现一个类似以下结构的API接口:

import requests
import json

def get_recent_transaction_from_api(address):
    """
    通过调用后端API获取指定地址的最新交易数据。
    """
    # 构造API URL,其中包含动态的地址参数
    api_url = f"https://ltc.tokenview.io/api/address/balancetrend/ltc/{address}"

    try:
        # 发送GET请求到API接口
        response = requests.get(api_url)
        response.raise_for_status()  # 检查HTTP请求是否成功

        # 解析JSON响应
        data = response.json()

        # 提取并打印最新的交易信息
        if data and data.get("data"):
            # API响应通常是一个列表,第一个元素代表最新的数据
            latest_transaction = data["data"][0]
            print(f"最新交易数据: {latest_transaction}")
            return latest_transaction
        else:
            print("API响应中未找到交易数据。")
            return None
    except requests.exceptions.RequestException as e:
        print(f"请求API时发生错误: {e}")
        return None
    except json.JSONDecodeError:
        print("无法解析API响应为JSON格式。")
        return None

# 示例调用
address_to_check = "M8T1B2Z97gVdvmfhQcAtYbEepune1tzGua"
get_recent_transaction_from_api(address_to_check)

输出示例:

最新交易数据: {'2024-01-06': '2504667.37296058'}

优点:

YXPHP企业网站管理系统4.0
YXPHP企业网站管理系统4.0

支持静态模板,支持动态模板标签,支持图片.SWF.FLV系列广告标签.支持百万级海量数据,绑定内置URL伪装策略(URL后缀名随你怎么写),绑定内置系统升级策略(暂不开放升级),绑定内置模板付费升级策略(暂不开放更新)。支持标签容错处理,绑定内置攻击防御策略,绑定内置服务器优化策略(系统内存释放的干干净净)。支持离线运行,支持次目录,兼容U主机。支持会员功能,支持文章版块权限阅读,支持会员自主注册

下载
  • 高效且精确: 直接获取结构化数据,避免了HTML解析的复杂性。
  • 稳定: API接口通常比HTML结构更稳定,不易因前端改动而失效。
  • 数据丰富: API通常会返回比页面显示更详细的数据。

缺点:

  • 需要手动发现API接口。
  • API可能需要认证、特定的请求头或参数。
  • API接口也可能发生变化。

策略二:从初始HTML中提取嵌入数据(备选)

在某些情况下,动态加载的数据可能并非通过独立的API请求获取,而是作为JavaScript变量或JSON对象直接嵌入在初始HTML响应的

示例:使用正则表达式提取交易金额

假设交易金额数据以特定模式嵌入在页面的某个JavaScript代码块中:

import requests
import re

def get_transaction_from_embedded_html(address):
    """
    从初始HTML文本中,使用正则表达式提取嵌入的交易金额。
    """
    url = f"https://ltc.tokenview.io/en/address/{address}"

    try:
        response = requests.get(url)
        response.raise_for_status()
        html_text = response.text

        # 使用正则表达式匹配特定的模式来提取输入和输出值
        # 这里假设数据以 'value:"([^"]+)' 形式出现
        match = re.search(r'value:"([^"]+)".*?value:"([^"]+)', html_text)

        if match:
            inp_value = match.group(1)
            out_value = match.group(2)
            print(f"输入交易金额 (inp): {inp_value}")
            print(f"输出交易金额 (out): {out_value}")
            return inp_value, out_value
        else:
            print("未在HTML中找到匹配的交易金额。")
            return None, None
    except requests.exceptions.RequestException as e:
        print(f"请求网页时发生错误: {e}")
        return None, None

# 示例调用
address_to_check = "M8T1B2Z97gVdvmfhQcAtYbEepune1tzGua"
get_transaction_from_embedded_html(address_to_check)

输出示例:

输入交易金额 (inp): 0.02387814
输出交易金额 (out): 0.02319739

优点:

  • 如果数据确实嵌入在初始HTML中,则无需额外的网络请求。
  • 对于简单且模式固定的嵌入数据,操作相对直接。

缺点:

  • 脆弱: 网页HTML结构或JavaScript代码稍有改动,正则表达式就可能失效。
  • 复杂性: 编写和维护复杂的正则表达式可能很困难。
  • 局限性: 仅适用于数据以可解析的文本形式嵌入的情况。

总结与注意事项

  • BeautifulSoup的局限: BeautifulSoup是一个优秀的HTML/XML解析库,但它不执行JavaScript。因此,对于JavaScript动态加载的内容,它“看不到”也无法解析。
  • 优先API调用: 当遇到动态内容时,首选策略是检查浏览器开发者工具,尝试发现并直接调用网站的后端API。这通常是最稳定、高效且能获取最详细数据的方法。
  • 正则表达式作为备选: 如果无法找到合适的API,或者确认数据以可解析的文本形式嵌入在初始HTML中,可以考虑使用正则表达式。但请注意其脆弱性。
  • Selenium作为终极方案: 如果上述两种方法都无法奏效,或者网页的动态性极其复杂(例如,需要用户交互、复杂的DOM操作才能显示数据),那么使用Selenium等自动化测试工具模拟浏览器行为,执行JavaScript并等待内容加载,将是最终的解决方案。但Selenium资源消耗较大,运行速度较慢。
  • 爬虫伦理与反爬机制: 在进行数据抓取时,请务必遵守网站的robots.txt协议,尊重网站的使用条款,并注意设置合理的请求间隔,避免给目标网站带来过大压力,触发反爬机制。

通过灵活运用上述策略,开发者可以更有效地处理Python requests在抓取动态网页数据时遇到的挑战,从而构建出更强大、更适应现代网页结构的爬虫程序。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1345

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号