新闻中心
解决动态加载内容爬取问题:利用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打开)来检查这些请求:
- 打开目标网页。
- 打开开发者工具,切换到“网络 (Network)”标签页。
- 刷新页面,或者在页面上进行任何可能触发数据加载的操作(例如点击分页、筛选等)。
- 在“网络”标签页中,筛选“XHR”或“Fetch/XHR”类型,观察是否有请求返回了您想要的数据。通常这些请求的URL会包含api、data或与页面内容相关的关键词,并且响应类型多为JSON。
通过分析,我们可以发现,该网站的成员列表数据实际上是通过向https://www.parliament.lk/members-of-parliament/directory-o
f-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)代码解析:
- 导入必要的库:requests用于发送HTTP请求,string用于生成字母列表,json用于解析API返回的JSON数据。
- 遍历字母表:网站的成员目录是按字母分类的,因此我们通过遍历string.ascii_uppercase来模拟按字母筛选的操作,确保获取所有成员的信息。
-
构建API请求:
- api_url是实际提供成员数据的后端接口地址。
- payload是一个字典,包含了POST请求所需的表单数据(form data),这些参数是从开发者工具中分析XHR请求的“负载 (Payload)”或“表单数据 (Form Data)”部分获取的。
- 发送POST请求:使用requests.post()方法发送POST请求,并将payload作为data参数传递。
- 错误处理:result.raise_for_status()用于在HTTP请求返回错误状态码时抛出异常。try-except块用于捕获网络请求和JSON解析可能发生的错误,提高程序的健壮性。
- 解析JSON响应:result.json()方法将HTTP响应体解析为Python字典或列表。
- 提取并存储数据:遍历解析后的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消息教程


2025-11-25
浏览次数:次
返回列表
f-members/index2.php发送一个POST请求获取的,该请求的参数包括了字母筛选(letter)等信息,并返回JSON格式的数据。