如何高效抓取动态加载的网页内容:以BeautifulSoup与XHR请求为例

如何高效抓取动态加载的网页内容:以BeautifulSoup与XHR请求为例

本教程旨在解决使用beautifulsoup抓取网页时,因内容动态加载而导致目标标签为空的问题。文章将深入探讨传统静态抓取工具的局限性,指导读者利用浏览器开发者工具识别并直接请求隐藏在xhr(xmlhttprequest)中的真实数据源,并通过python的`requests`库处理json响应,从而实现对动态内容的精准抓取。

理解动态内容抓取的挑战

在使用Python进行网页抓取时,BeautifulSoup库因其强大的HTML/XML解析能力而广受欢迎。然而,当目标网页的内容是通过JavaScript动态加载时,仅依赖requests.get()获取的初始HTML文档往往无法包含所有期望的数据。此时,BeautifulSoup解析到的特定标签(例如一个带有id的

标签)可能会显示为空,即使在浏览器中查看时该标签下有丰富的内容。这是因为requests.get()只获取了服务器返回的原始静态HTML,而JavaScript在页面加载后才执行并填充了这些内容。

例如,尝试从一个动态加载内容的页面抓取id=”demoFour”的

标签,可能会得到一个空的标签:

import requestsfrom bs4 import BeautifulSoupurl = "https://www.parliament.lk/en/members-of-parliament/directory-of-members/?cletter=A"response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 尝试查找id为demoFour的ul标签ul_tag = soup.find('ul', id='demoFour')print(ul_tag)# 预期输出可能是:
    # 实际上,在浏览器中这个ul标签下有li列表项

    识别动态数据源:XHR请求

    要解决这个问题,关键在于识别并直接访问那些负责动态加载数据的幕后请求。这些请求通常是XHR(XMLHttpRequest)或Fetch API请求,它们在后台与服务器通信,获取JSON或XML格式的数据,然后由JavaScript渲染到页面上。

    使用浏览器开发者工具

    打开目标网页: 在Chrome、Firefox等浏览器中打开目标网页。打开开发者工具: 按F12键或右键点击页面选择“检查”。切换到“网络” (Network) 选项卡: 这个选项卡会显示浏览器加载页面时发出的所有请求。过滤XHR/Fetch请求: 在“网络”选项卡中,通常有一个过滤器选项,选择“XHR”或“Fetch/XHR”,这样可以只显示JavaScript发起的异步请求。刷新页面或触发内容加载: 如果内容是页面加载时自动填充的,刷新页面即可看到相关请求。如果内容是通过点击按钮、滚动等方式触发的,则需要执行相应的操作。检查请求: 仔细查看这些XHR请求的URL、请求方法(GET/POST)、请求头(Headers)、请求载荷(Payload)以及响应(Response)。通常,数据会以JSON格式在响应中返回。

    通过检查,我们会发现原页面中议员列表的数据并非直接嵌入HTML,而是通过一个POST请求发送到https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php?option=com_members&task=all&tmpl=component&letter={letter}&wordfilter=&search_district=这样的API端点,并以JSON格式返回。

    直接请求API并处理数据

    一旦找到了实际的数据API端点,我们就可以直接使用requests库向其发送请求,获取原始数据。

    示例代码

    以下代码演示了如何通过直接调用XHR API来获取斯里兰卡议会成员的列表数据:

    import requestsimport stringimport json # 导入json模块以更好地处理JSON数据# 存储所有议员数据的列表all_members_data = []# 遍历字母A-Z,因为议员列表是按字母分类加载的for letter in list(string.ascii_uppercase):    # 构建API请求URL。注意这里使用了POST请求    # 这个URL是通过浏览器开发者工具的XHR请求中发现的    api_url = f'https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php?option=com_members&task=all&tmpl=component&letter={letter}&wordfilter=&search_district='    try:        # 发送POST请求到API端点        # 实际的网页可能会在请求头中包含其他参数,例如User-Agent,        # 如果遇到反爬,可能需要模拟更多请求头        response = requests.post(api_url)        response.raise_for_status() # 检查请求是否成功(状态码200)        # 解析JSON响应        members_json = response.json()        # 遍历返回的每个议员数据项        for member_info in members_json:            # 提取所需信息并构建字典            member_details = {                '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']            }            all_members_data.append(member_details)    except requests.exceptions.RequestException as e:        print(f"请求字母 {letter} 时发生错误: {e}")    except json.JSONDecodeError as e:        print(f"解析字母 {letter} 的JSON响应时发生错误: {e}")# 打印获取到的部分数据作为示例print(json.dumps(all_members_data[:5], indent=2, ensure_ascii=False)) # 打印前5条数据,格式化输出# 如果需要,可以将所有数据保存到文件# with open('parliament_members.json', 'w', encoding='utf-8') as f:#     json.dump(all_members_data, f, indent=2, ensure_ascii=False)

    代码解析

    import requests, string, json: 导入必要的库。string用于生成字母列表,json用于处理API返回的JSON数据。all_members_data = []: 初始化一个空列表,用于存储所有抓取到的议员信息。for letter in list(string.ascii_uppercase):: 循环遍历所有大写字母(A到Z)。这是因为目标网站的议员列表是按姓氏首字母分类加载的,通过改变API请求中的letter参数来获取不同字母开头的议员。api_url = f’…’: 构建API请求的URL。这个URL是根据在浏览器开发者工具中分析XHR请求得到的。requests.post(api_url): 发送HTTP POST请求到API端点。注意,这里是post而不是get,因为开发者工具显示该请求是POST类型。response.raise_for_status(): 这是一个良好的实践,用于检查请求是否成功。如果HTTP状态码表示错误(如4xx或5xx),它会抛出一个requests.exceptions.HTTPError。members_json = response.json(): 将API响应体解析为Python字典或列表(如果响应是JSON格式)。数据提取与存储: 遍历members_json中的每个成员对象,提取mem_intranet_id和member_sname_eng等关键信息,并构造一个包含议员详情URL、ID和姓名的字典,然后将其添加到all_members_data列表中。错误处理: 使用try-except块捕获可能的requests请求错误和json解析错误,增强代码的健壮性。

    注意事项与总结

    动态内容是常态: 现代网页开发中,动态加载内容已成为主流。当BeautifulSoup抓取不到数据时,首先应怀疑是否为动态加载。开发者工具是利器: 熟练使用浏览器开发者工具是抓取动态网页的关键技能。特别是“网络”选项卡,能揭示所有HTTP请求的细节。API稳定性: 直接调用网站的内部API可能会受网站更新影响而失效。网站所有者随时可能更改API端点、参数或响应格式。请求头模拟: 有些网站会检查请求头,例如User-Agent。如果直接请求API被拒绝,尝试在requests.post()或requests.get()中添加headers参数来模拟浏览器行为。频率限制与道德: 抓取网站数据时,请务必遵守网站的robots.txt协议,并控制请求频率,避免对目标服务器造成过大负担。过高的请求频率可能导致IP被封禁。数据格式: 大多数动态内容API返回JSON格式数据,但也有可能是XML或其他格式。根据实际响应调整解析方法。

    通过上述方法,我们不仅解决了最初

    标签为空的问题,更掌握了抓取动态网页的核心技术。这种直接与后端API交互的方式,通常比模拟浏览器行为(如使用Selenium)更高效、资源消耗更低,是处理这类抓取任务的首选方案。

    以上就是如何高效抓取动态加载的网页内容:以BeautifulSoup与XHR请求为例的详细内容,更多请关注php中文网其它相关文章!

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

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年12月23日 12:56:21
    下一篇 2025年12月23日 12:56:41

    相关推荐

    • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

      如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

      2025年12月24日
      200
    • 使用 Mask 导入本地图片时,如何解决跨域问题?

      跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

      2025年12月24日
      200
    • 正则表达式在文本验证中的常见问题有哪些?

      正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

      2025年12月24日
      000
    • 为什么多年的经验让我选择全栈而不是平均栈

      在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

      2025年12月24日
      000
    • 姜戈顺风

      本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

      2025年12月24日
      000
    • 花 $o 学习这些编程语言或免费

      → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

      2025年12月24日
      000
    • 学会从头开始学习CSS,掌握制作基本网页框架的技巧

      从零开始学习CSS,掌握网页基本框架制作技巧 前言: 在现今互联网时代,网页设计和开发是一个非常重要的技能。而学习CSS(层叠样式表)是掌握网页设计的关键之一。CSS不仅可以为网页添加样式和布局,还可以为用户呈现独特且具有吸引力的页面效果。在本文中,我将为您介绍一些基本的CSS知识,以及一些常用的代…

      2025年12月24日
      200
    • 揭秘Web标准涵盖的语言:了解网页开发必备的语言范围

      在当今数字时代,互联网成为了人们生活中不可或缺的一部分。作为互联网的基本构成单位,网页承载着我们获取和分享信息的重要任务。而网页开发作为一门独特的技术,离不开一些必备的语言。本文将揭秘Web标准涵盖的语言,让我们一起了解网页开发所需的语言范围。 首先,HTML(HyperText Markup La…

      2025年12月24日
      000
    • 揭开Web开发的语言之谜:了解构建网页所需的语言有哪些?

      Web标准中的语言大揭秘:掌握网页开发所需的语言有哪些? 随着互联网的快速发展,网页开发已经成为人们重要的职业之一。而要成为一名优秀的网页开发者,掌握网页开发所需的语言是必不可少的。本文将为大家揭示Web标准中的语言大揭秘,介绍网页开发所需的主要语言。 HTML(超文本标记语言)HTML是网页开发的…

      2025年12月24日
      400
    • 常用的网页开发语言:了解Web标准的要点

      了解Web标准的语言要点:常见的哪些语言应用在网页开发中? 随着互联网的不断发展,网页已经成为人们获取信息和交流的重要途径。而要实现一个高质量、易用的网页,离不开一种被广泛接受的Web标准。Web标准的制定和应用,涉及到多种语言和技术,本文将介绍常见的几种语言在网页开发中的应用。 首先,HTML(H…

      2025年12月24日
      000
    • 网页开发中常见的Web标准语言有哪些?

      探索Web标准语言的世界:网页开发中常用的语言有哪些? 在现代社会中,互联网的普及程度越来越高,网页已成为人们获取资讯、娱乐、交流的重要途径。而网页的开发离不开各种编程语言的应用和支持。在这个虚拟世界的网络,有许多被广泛应用的标准化语言,用于为用户提供优质的网页体验。本文将探索网页开发中常用的语言,…

      2025年12月24日
      000
    • 深入探究Web标准语言的范围,涵盖了哪些语言?

      Web标准是指互联网上的各个网页所需遵循的一系列规范,确保网页在不同的浏览器和设备上能够正确地显示和运行。这些标准包括HTML、CSS和JavaScript等语言。本文将深入解析Web标准涵盖的语言范围。 首先,HTML(HyperText Markup Language)是构建网页的基础语言。它使…

      2025年12月24日
      000
    • 深入理解CSS框架与JS之间的关系

      深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

      2025年12月24日
      000
    • 项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结

      项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结 随着互联网的快速发展,网页设计已经成为了各行各业都离不开的一项技能。优秀的网页设计可以给用户留下深刻的印象,提升用户体验,增加用户的黏性和转化率。而要做出优秀的网页设计,除了对美学的理解和创意的运用外,还需要掌握一些基本的技能,如…

      2025年12月24日
      200
    • CSS 超链接属性解析:text-decoration 和 color

      CSS 超链接属性解析:text-decoration 和 color 超链接是网页中常用的元素之一,它能够在不同页面之间建立连接。为了使超链接在页面中有明显的标识和吸引力,CSS 提供了一些属性来调整超链接的样式。本文将重点介绍 text-decoration 和 color 这两个与超链接相关的…

      2025年12月24日
      000
    • 学完HTML和CSS之后我应该做什么?

      网页开发是一段漫长的旅程,但是掌握了HTML和CSS技能意味着你已经赢得了一半的战斗。这两种语言对于学习网页开发技能来说非常重要和基础。现在不可或缺的是下一个问题,学完HTML和CSS之后我该做什么呢? 对这些问题的答案可以分为2-3个部分,你可以继续练习你的HTML和CSS编码,然后了解在学习完H…

      2025年12月24日
      000
    • 聊聊怎么利用CSS实现波浪进度条效果

      本篇文章给大家分享css 高阶技巧,介绍一下如何使用css实现波浪进度条效果,希望对大家有所帮助! 本文是 CSS Houdini 之 CSS Painting API 系列第三篇。 现代 CSS 之高阶图片渐隐消失术现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式! 在上两篇中,我们…

      2025年12月24日 好文分享
      200
    • 巧用距离、角度及光影制作炫酷的 3D 文字特效

      如何利用 css 实现3d立体的数字?下面本篇文章就带大家巧用视觉障眼法,构建不一样的 3d 文字特效,希望对大家有所帮助! 最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特…

      2025年12月24日 好文分享
      000
    • CSS高阶技巧:实现图片渐隐消的多种方法

      将专注于实现复杂布局,兼容设备差异,制作酷炫动画,制作复杂交互,提升可访问性及构建奇思妙想效果等方面的内容。 在兼顾基础概述的同时,注重对技巧的挖掘,结合实际进行运用,欢迎大家关注。 正文从这里开始。 在过往,我们想要实现一个图片的渐隐消失。最常见的莫过于整体透明度的变化,像是这样: 立即学习“前端…

      2025年12月24日 好文分享
      000
    • 看看这些前端面试题,带你搞定高频知识点(一)

      每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:给定一个元素,如何实现水平垂直居中?…

      2025年12月24日 好文分享
      300

    发表回复

    登录后才能评论
    关注微信