新闻中心

解决动态加载内容爬取问题:利用XHR请求获取隐藏数据

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

解决动态加载内容爬取问题:利用XHR请求获取隐藏数据

本教程旨在解决使用beautifulsoup爬取网页时,因内容动态加载而无法获取目标数据的问题。当页面元素通过j*ascript的xhr请求异步加载时,直接解析初始html将失败。文章将详细阐述如何通过浏览器开发者工具识别这些xhr请求,并利用python的`requests`库直接调用api接口,从而成功获取并处理动态生成的数据。

在进行网页数据抓取时,开发者常会遇到一个常见问题:尽管在浏览器中能看到完整的页面内容,但使用BeautifulSoup等解析工具获取到的HTML却缺少部分目标数据。这通常是由于网站采用了动态加载技术,即页面内容并非一次性从服务器加载,而是通过J*aScript在页面加载完成后,通过XMLHttpRequest (XHR) 或 Fetch API 异步请求数据并更新DOM。

理解动态加载与XHR请求

当您尝试从https://www.parliament.lk/en/members-of-parliament/directory-of-members/?cletter=A这样的页面抓取

    标签下的
  • 内容,但soup.find('ul', id='demoFour')返回空标签时,这正是动态加载的典型表现。页面上的成员列表很可能是在初始HTML加载完毕后,通过J*aScript向后端发送了一个API请求,然后将返回的数据渲染到id="demoFour"的
      中。

      要解决这个问题,关键在于识别并模拟这些幕后的XHR请求。您可以使用浏览器的开发者工具(通常按F12打开)来检查这些请求:

    1. 打开目标网页。
    2. 打开开发者工具,切换到“网络 (Network)”标签页。
    3. 刷新页面,或者在页面上进行任何可能触发数据加载的操作(例如点击分页、筛选等)。
    4. 在“网络”标签页中,筛选“XHR”或“Fetch/XHR”类型,观察是否有请求返回了您想要的数据。通常这些请求的URL会包含api、data或与页面内容相关的关键词,并且响应类型多为JSON。

    通过分析,我们可以发现,该网站的成员列表数据实际上是通过向https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php发送一个POST请求获取的,该请求的参数包括了字母筛选(letter)等信息,并返回JSON格式的数据。

    解决方案:直接调用API接口

    一旦确定了数据源的API接口,我们就可以绕过前端渲染过程,直接使用Python的requests库向该接口发送请求,获取原始数据。

    语鲸 语鲸

    AI智能阅读辅助工具

    语鲸 314 查看详情 语鲸

    以下是实现这一策略的Python代码示例:

    from bs4 import BeautifulSoup
    import requests
    import string
    import json # 导入json库用于处理JSON响应
    
    # 存储抓取到的数据
    data = []
    
    # 遍历所有大写字母,模拟页面按字母筛选的功能
    for letter in list(string.ascii_uppercase):
        # 构建API请求URL和POST请求体
        api_url = 'https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php'
        # 注意:这里是一个POST请求,需要传递form data
        payload = {
            'option': 'com_members',
            'task': 'all',
            'tmpl': 'component',
            'letter': letter,
            'wordfilter': '',
            'search_district': ''
        }
    
        try:
            # 发送POST请求获取数据
            # 实际的请求是POST,并且参数在请求体中
            result = requests.post(api_url, data=payload)
            result.raise_for_status() # 检查HTTP请求是否成功 (状态码200)
    
            # 解析JSON响应
            members_json = result.json()
    
            # 遍历返回的成员列表
            for member_info in members_json:
                # 提取所需信息并添加到数据列表中
                data.append({
                    'url': f"https://www.parliament.lk/en/members-of-parliament/directory-of-members/viewMember/{member_info['mem_intranet_id']}",
                    'id': member_info['mem_intranet_id'],
                    'name': member_info['member_sname_eng']
                })
        except requests.exceptions.RequestException as e:
            print(f"请求字母 '{letter}' 时发生错误: {e}")
        except json.JSONDecodeError as e:
            print(f"解析字母 '{letter}' 的响应时发生JSON错误: {e}")
    
    # 打印抓取到的数据
    print(data)

    代码解析:

    1. 导入必要的库:requests用于发送HTTP请求,string用于生成字母列表,json用于解析API返回的JSON数据。
    2. 遍历字母表:网站的成员目录是按字母分类的,因此我们通过遍历string.ascii_uppercase来模拟按字母筛选的操作,确保获取所有成员的信息。
    3. 构建API请求
      • api_url是实际提供成员数据的后端接口地址。
      • payload是一个字典,包含了POST请求所需的表单数据(form data),这些参数是从开发者工具中分析XHR请求的“负载 (Payload)”或“表单数据 (Form Data)”部分获取的。
    4. 发送POST请求:使用requests.post()方法发送POST请求,并将payload作为data参数传递。
    5. 错误处理:result.raise_for_status()用于在HTTP请求返回错误状态码时抛出异常。try-except块用于捕获网络请求和JSON解析可能发生的错误,提高程序的健壮性。
    6. 解析JSON响应:result.json()方法将HTTP响应体解析为Python字典或列表。
    7. 提取并存储数据:遍历解析后的JSON数据,提取每个成员的ID、英文名等信息,并构建一个包含成员详情URL的字典,最后将其添加到data列表中。

    抓取结果示例

    执行上述代码后,data列表将包含一个结构化的字典列表,每个字典代表一个议会成员,包含其URL、ID和姓名,例如:

    [{'url': 'https://www.parliament.lk/en/members-of-parliament/directory-of-members/viewMember/3266',
      'id': '3266',
      'name': 'A. Ar*indh Kumar'},
     {'url': 'https://www.parliament.lk/en/members-of-parliament/directory-of-members/viewMember/50',
      'id': '50',
      'name': 'Abdul Haleem'},
     {'url': 'https://www.parliament.lk/en/members-of-parliament/directory-of-members/viewMember/3325',
      'id': '3325',
      'name': 'Ajith Rajapakse'},
     ...]

    注意事项与进阶

    • User-Agent和Headers:某些网站可能会检查请求头中的User-Agent。如果直接请求API被拒绝,尝试在requests.post()中添加headers参数,模拟浏览器行为。
    • 频率限制与IP封锁:频繁的请求可能会触发网站的频率限制或IP封锁。考虑添加time.sleep()在请求之间设置延迟,或使用代理IP池。
    • 动态参数:本例中的letter参数是显而易见的。在更复杂的场景中,API请求的参数可能包含动态生成的令牌(token)、时间戳或其他加密信息。这需要更深入的分析J*aScript代码来理解其生成逻辑。
    • 详细页面抓取:本教程只获取了成员的基本信息。如果需要每个成员的详细资料,您可以使用抓取到的url字段,进一步对每个成员的详情页发送requests.get()请求,并使用BeautifulSoup解析这些详情页。

    总结

    当传统的BeautifulSoup解析方法无法获取到网页上的内容时,很可能是因为内容通过J*aScript动态加载。解决之道在于利用浏览器开发者工具分析网络请求,找到数据源的API接口,并直接使用requests库模拟这些XHR请求来获取原始数据。这种方法更直接、高效,并且能获取到结构化的JSON数据,极大地简化了数据处理过程。掌握这一技巧,将使您在面对现代动态网页时,能够更有效地进行数据抓取。

以上就是解决动态加载内容爬取问题:利用XHR请求获取隐藏数据的详细内容,更多请关注php中文网其它相关文章!


# 河南新品seo代运营  # 是一个  # 这一  # 您可以  # 所需  # 很可能  # 配置文件  # 石家庄藁城区网站优化  # 商丘网站建设知识点总结  # 表单  # 延庆网站平台建设  # 自贡seo虾哥网络  # 江苏网站建设方案表  # 产品营销推广方案ppt内容推荐  # 锦州网站优化团队  # 伊春网站关键词建设  # 抖音带货关键词排名  # php  # 遍历  # 加载  # 关键词  #   # 工具  # app  # 浏览器  # json  # 前端  # js  # html  # java  # python  # word  # javascript 


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


相关推荐: Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  如何使用纯J*aScript判断Input元素是否在特定类容器内  解决Python单元测试中Mock异常方法调用计数为零的问题  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  AO3官网镜像链接 Archive of Our Own同人文在线浏览  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  C++ map遍历方法大全_C++ map迭代器使用总结  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Linux如何构建多环境配置管理_Linux多环境配置方案  CSS布局中意外空白:解决padding-top导致的顶部间距问题  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  不同用户不同价格! 索尼开启账户个性化定价测试  学习通网页版快速入口 学习通官网网页版直接打开  照顾宝贝2小游戏免费秒玩入口  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  outlook中文官网入口地址 outlook官方中文版直达首页链接  c++ 获取系统当前时间 c++时间戳获取方法  漫蛙网页登录入口 漫蛙漫画官方授权网址  在VS Code中配置和运行Dart程序的完整步骤  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  J*a中实现Go语言select通道多路复用机制  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  在WordPress中通过REST API获取BasicAuth保护的远程文章  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  深入理解J*a链表中的IPosition接口与使用  零跑汽车11月交付量达70327台 实现连续9个月正增长  深入理解J*a合成构造器:何时以及为何阻止其生成  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  msn官网入口地址手机版 msn官方网站手机最新链接  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  《刺客信条:影》PS5 Pro和Switch 2画面对比  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  单射、满射与双射的关系 一文理清所有逻辑  蛙漫移动版在线看 蛙漫手机浏览器直达入口  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  Discord Slash 命令响应超时问题的异步解决方案  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程 

搜索