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


解决动态加载内容爬取问题:利用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库向该接口发送请求,获取原始数据。

    乾坤圈新媒体矩阵管家 乾坤圈新媒体矩阵管家

    新媒体账号、门店矩阵智能管理系统

    乾坤圈新媒体矩阵管家 219 查看详情 乾坤圈新媒体矩阵管家

    以下是实现这一策略的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中文网其它相关文章!


# javascript  # word  # python  # php  # 您可以  # 宁德淘宝网店营销推广培训  # 所需  # 很可能  # 并与  # 天津网上营销推广公司  # 郑州网站建设进度  # 岳阳网站建设和推广  # 汶上线上营销推广  # 推广变现网站  # 深圳全网营销推广思路  # 软文发稿知名乐云seo  # 固安网络优化师招聘网站  # 通辽网站推广优化  # 这一  # 是一个  # 后端  # 遍历  # 加载  # 关键词  #   # 工具  # app  # 浏览器  # json  # 前端  # js  # html  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  使用Python和NLTK从文本中高效提取名词的实用教程  J*aScript对象中深度嵌套URL键的查找与更新策略  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  search中maxlength属性用法解析  解决CSS background 属性中 cover 关键字的常见误用  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤  如何外贸网站设计-能留住客户提升用户体验!  猫眼app抢票快还是小程序快  路由器DNS怎么设置最快 优化DNS提升上网速度教程  中通快递官网指定查询 中通快递单号查询平台入口  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  Win10怎么设置快速启动 Win10开启快速启动设置方法  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  Three.js中动态更换3D模型纹理的教程  Go语言中方法接收器的选择:值类型还是指针类型?  使用AI在VS Code中将代码从一种语言翻译成另一种  mysql如何管理数据库账户_mysql数据库账户管理技巧  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  Linux如何优化系统启动流程_Linux启动项优化方案  虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  b站网页版入口 哔哩哔哩官方网站直接进入  解决异步Python机器人中同步操作的阻塞问题  招商淘客入门指南  电子白板帮助菜单使用指南  支付宝登录刷脸不是本人如何解决  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  Final Cut Pro视频加EQ教程  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  创建您的便携版VS Code:让配置随身携带  C++ switch case字符串_C++如何实现字符串switch匹配  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  《火影忍者:木叶高手》快速升级攻略  抖音号升级成企业资质怎么弄?有什么好处?  J*aScript桌面应用_Electron多进程架构实战  小米倒班助手添加日历提醒  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  汽水音乐车机版 汽水音乐车机版官方入口  PySimpleGUI中实现键盘按键与按钮事件绑定教程  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  申通快递物流信息查询 申通快递包裹状态追踪  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  申通快递查询 申通物流快递单实时查询入口  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  汽水音乐网页版登录 汽水音乐网页端官方入口  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  J*aScript类型数组_TypedArray使用 

 2025-11-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.