使用Python绕过动态加载:从弹出按钮中抓取隐藏电话号码的API方法

使用Python绕过动态加载:从弹出按钮中抓取隐藏电话号码的API方法

本文将指导读者如何使用python从动态加载的网页弹出按钮中抓取隐藏的电话号码。针对beautifulsoup无法处理javascript动态内容的局限性,我们将采用直接模拟浏览器底层api请求的方法,通过分析网络流量,重构post请求,并解析json响应,高效地获取目标数据,避免了使用重量级自动化工具如selenium的复杂性。

1. 动态内容抓取的挑战与传统方法的局限性

网络爬虫实践中,我们经常会遇到内容并非直接嵌入在初始HTML中的情况。许多现代网站利用JavaScript动态加载数据,例如通过点击按钮弹出的对话框、无限滚动页面或异步更新的内容。对于这类场景,传统的HTML解析库如BeautifulSoup仅能处理请求获得的静态HTML内容,而无法执行JavaScript来渲染或加载动态数据。

例如,当尝试抓取一个只有在点击“联系方式”或“查看电话”按钮后才显示电话号码的网站时,如果仅使用BeautifulSoup,你可能会发现按钮对应的HTML元素中并不包含电话号码,而是一个占位符或触发JavaScript函数的代码。此时,BeautifulSoup的输出将只包含按钮本身,而无法获取到点击后才出现的信息。

虽然Selenium等工具可以模拟完整的浏览器行为,包括执行JavaScript和点击元素,但对于仅需获取特定动态加载数据的情形,Selenium往往显得过于重量级,会增加额外的开销和复杂性。更高效的方法是直接识别并模拟浏览器用于获取这些动态数据的底层API请求。

2. 识别目标API请求

获取动态加载数据的关键在于理解浏览器在后台是如何获取这些数据的。通常,当用户在网页上进行交互(如点击按钮)时,浏览器会向服务器发送一个异步请求(XHR/Fetch请求),服务器返回数据(通常是JSON格式),然后JavaScript再将这些数据渲染到页面上。

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

要识别这些API请求,你需要使用浏览器的开发者工具:

打开开发者工具: 在Chrome、Firefox等浏览器中,按下F12键或右键点击页面选择“检查”/“检查元素”。切换到“网络”(Network)选项卡: 此选项卡会记录浏览器发出的所有HTTP请求。清空并模拟操作: 清空网络请求记录,然后点击页面上显示隐藏电话号码的按钮(例如“التواصل”按钮)。查找相关请求: 观察网络记录中新出现的请求。通常,这些请求的类型是XHR或Fetch。你需要查找与电话号码数据相关的请求,它们往往是POST请求,并且响应内容是JSON格式。分析请求详情: 选中目标请求,查看其“请求头”(Request Headers)、“请求载荷”(Request Payload)或“表单数据”(Form Data)以及“响应”(Response)内容。请求URL: 这是API的实际端点。请求方法: 通常是GET或POST。对于动态内容,POST请求携带数据的情况很常见。请求头: 包含User-Agent、Content-Type等,有时需要模拟。请求载荷/请求体: 这是最关键的部分,包含了API调用所需的参数,例如本例中的postId和GraphQL查询语句。响应: 查看API返回的数据结构,确认电话号码在哪个字段中。

通过分析,你会发现本例中电话号码数据是通过向 https://graphql.haraj.com.sa 发送一个POST请求,并携带一个GraphQL查询作为请求体来获取的。

3. 使用Python模拟API请求

一旦识别出API请求的所有细节,我们就可以使用Python的requests库来模拟这个请求。

import requestsimport sysdef scrape_phone_number(post_id: int):    """    通过模拟API请求从Haraj网站抓取指定帖子的电话号码。    Args:        post_id (int): 帖子的唯一标识符。    Returns:        str: 提取到的电话号码,如果失败则返回None。    """    # GraphQL API的端点URL    url = "https://graphql.haraj.com.sa"    # 请求参数 (query string parameters)    # 示例中这些参数可以为空,表示API可能对它们不敏感或有默认值    params = {        "queryName": "postContact",        "token": "",        "clientId": "",        "version": ""    }    # 请求头,模拟浏览器行为    headers = {        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"    }    # 请求体 (payload),包含GraphQL查询和变量    # 注意:'postId' 是动态获取电话号码的关键参数    payload = {           "query": "query postContact($postId: Int!) {postContact(postId: $postId){contactText}}",        "variables": {            "postId": post_id        }    }    try:        # 发送POST请求,requests库会自动将payload转换为JSON格式        response = requests.post(url, params=params, headers=headers, json=payload)        # 检查HTTP状态码,如果不是2xx则抛出异常        response.raise_for_status()        # 解析JSON响应        data = response.json()        # 从JSON数据中提取电话号码        contact_text = data.get('data', {}).get('postContact', {}).get('contactText')        if contact_text:            print(f"成功获取电话号码: {contact_text}")            return contact_text        else:            print("未在响应中找到电话号码。")            return None    except requests.exceptions.RequestException as e:        print(f"请求失败: {e}")        return None    except ValueError as e:        print(f"JSON解析失败: {e}")        return Noneif __name__ == "__main__":    # 示例帖子ID,这个ID通常需要从原始网页URL或HTML中提取    # 例如,如果原始URL是 https://haraj.com.sa/1194697687,则 postId 可能是 94697687    example_post_id = 94697687     phone_number = scrape_phone_number(example_post_id)    if phone_number:        print(f"最终提取的电话号码是: {phone_number}")    else:        print("未能提取电话号码。")    sys.exit(0)

4. 代码解析与注意事项

requests.post(): 这是发送POST请求的关键函数。url:API的完整URL。params:对应URL中的查询字符串参数。headers:自定义请求头,User-Agent是常见的模拟浏览器行为的头。json:当请求体是JSON格式时,可以直接传入Python字典,requests会自动将其序列化为JSON字符串并设置Content-Type: application/json。response.raise_for_status(): 这是一个良好的实践,用于检查请求是否成功(HTTP状态码为2xx)。如果请求失败,它会抛出一个requests.exceptions.RequestException异常。response.json(): 将API返回的JSON响应解析成Python字典。数据提取: 通过字典的get()方法安全地访问嵌套数据,避免因键不存在而引发KeyError。postId: 在这个特定的API中,postId是一个至关重要的变量。它通常需要从你最初访问的页面URL(例如https://haraj.com.sa/1194697687中的94697687部分)或其他HTML元素中动态提取。在实际应用中,你需要编写额外的代码来解析原始页面以获取这个ID。错误处理: 使用try-except块捕获可能的requests.exceptions.RequestException(网络错误、HTTP错误)和ValueError(JSON解析错误),增强代码的健壮性。User-Agent: 模拟一个常见的浏览器User-Agent可以降低被网站识别为爬虫的风险。API限制: 频繁或过快的API请求可能会触发网站的IP封禁或速率限制。在实际爬取时,应考虑添加延迟(time.sleep())或使用代理IP池。

5. 总结

当面对JavaScript动态加载内容的网站时,BeautifulSoup等静态HTML解析器会力不从心。此时,直接模拟浏览器底层的API请求是一种更高效、更直接的解决方案。通过熟练运用浏览器开发者工具分析网络流量,识别API端点、请求方法、请求头和请求体,我们可以精确地使用Python的requests库重构这些请求,从而绕过复杂的页面渲染过程,直接获取所需数据。这种方法不仅避免了Selenium的额外开销,也为处理各种动态网页爬取任务提供了强大的工具。

以上就是使用Python绕过动态加载:从弹出按钮中抓取隐藏电话号码的API方法的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Electron应用中Div元素宽高设置无效的解决方案
上一篇 2025年12月23日 06:57:46
CSS & 符号与嵌套选择器:理解预处理器与原生CSS的差异及正确用法
下一篇 2025年12月23日 06:57:57

相关推荐

  • 剪映pc版怎么添加贴纸_剪映PC版视频贴纸添加教程

    首先通过贴纸面板添加内置贴纸,其次可导入本地GIF或图片作为自定义贴纸,最后调整贴纸的透明度、旋转、播放速度等属性以适配视频风格。 如果您在剪辑视频时希望增加趣味性或强调某些画面内容,可以通过添加贴纸来实现。贴纸可以是表情、图标或动态元素,能有效提升视频的视觉表现力。以下是使用剪映PC版为视频添加贴…

    2026年8月26日
    000
  • java中文乱码在线转换 在线工具解决编码问题

    java中文乱码可以通过在线工具解决。1) 使用编码转换工具如convertio,将文件从一种编码转换为另一种。2) 使用编码检测工具如fileformat.info,识别未知编码的文件。3) 统一编码标准,使用版本控制和定期检查,确保编码一致性。 提到Java中文乱码在线转换和解决编码问题,我们首…

    2026年8月26日
    100
  • 微信怎么搜索公众号_微信内公众号搜索与关注教程

    首先通过微信“发现”页面搜索框输入公众号名称或关键词,选择“公众号”标签后关注;若搜索不到,检查名称准确性或确认是否被注销;为提升公众号被搜到概率,应在名称、简介及文章中合理布局相关关键词;高级搜索技巧包括组合关键词、使用筛选功能、微信号直搜及借助第三方工具。 微信搜索公众号,其实很简单,主要就是通…

    2026年8月26日
    000
  • 什么是java Java编程语言全面介绍

    java是一个强大的编程语言,适用于从小型应用到大型企业级系统的开发。其核心特点包括:一次编写,到处运行:通过jvm实现跨平台运行。面向对象编程:支持类、对象、继承和多态,增强代码组织和灵活性。集合框架:提供如arraylist等工具,简化数据处理。丰富的生态系统:包括异常处理、多线程、lambda…

    2026年8月26日
    000
  • VSCode报错怎么显示中文_VSCode错误信息本地化教程

    安装中文语言包并重启VSCode即可实现错误信息中文显示,具体步骤为:打开扩展商店搜索“Chinese (Simplified) Language Pack”并安装,通过命令面板执行“Configure Display Language”选择“zh-cn”,最后重启编辑器。若仍为英文,需检查loca…

    2026年8月26日
    000
  • MAC电脑的内置摄像头打不开权限在哪里设置_MAC设置内置摄像头权限方法

    首先检查系统隐私权限设置,确保应用已授权访问摄像头;若问题未解决,可尝试重启摄像头服务、重置NVRAM/PRAM、确认用户账户权限并更新系统与应用至最新版本。 如果您尝试使用视频会议软件或拍照应用时发现MAC电脑的内置摄像头无法启动,可能是由于系统权限未正确配置。以下是解决此问题的步骤: 本文运行环…

    2026年8月26日
    000
  • MySQL分区表功能详解_大数据量管理与查询效率提升方案

    MySQL分区表功能详解_大数据量管理与查询效率提升方案MySQL分区表功能详解_大数据量管理与查询效率提升方案MySQL分区表功能详解_大数据量管理与查询效率提升方案MySQL分区表功能详解_大数据量管理与查询效率提升方案

    mysql分区表通过将大表按规则拆分为多个物理片段,实现查询性能提升。1.核心机制是“分区裁剪”,使查询仅扫描相关分区;2.降低i/o负载,减少磁盘访问;3.优化范围和等值查询效率;4.局部索引提升写操作效率并增强缓存命中率。常见应用于时间序列数据、历史订单表等场景,选择策略包括合理分区键、类型(r…

    2026年8月26日 用户投稿
    100
  • 电脑java怎么安装 Windows系统Java环境搭建详细步骤

    在windows系统上搭建java环境需要两步:1)安装jdk:从oracle官网下载适合的版本,安装时选择安装jre,安装后用“java -version”验证;2)配置环境变量:设置java_home为jdk路径,将%java_home%bin添加到path中,配置后用“java -versio…

    2026年8月26日
    100
  • 如何使用PHPUnit测试Laravel应用?

    使用phpunit测试laravel应用可以通过单元测试、功能测试和集成测试来确保代码质量和可靠性。1. 单元测试:测试单个方法或类的功能。2. 功能测试:测试整个功能流程,模拟用户操作。3. 集成测试:测试不同模块之间的交互。使用laravel的测试工具和方法,可以轻松编写和运行这些测试,提高开发…

    2026年8月26日
    100
  • win7系统无法识别生物识别设备_win7指纹/面部识别失效的处理

    win7系统无法识别生物识别设备_win7指纹/面部识别失效的处理win7系统无法识别生物识别设备_win7指纹/面部识别失效的处理win7系统无法识别生物识别设备_win7指纹/面部识别失效的处理win7系统无法识别生物识别设备_win7指纹/面部识别失效的处理

    win7系统无法识别生物识别设备的主要原因包括驱动问题、相关服务未启动以及硬件故障。要确定是否为驱动问题,可打开设备管理器查看是否有黄色感叹号,若有则需更新驱动或下载最新版本。其次,生物识别服务未启动也会导致识别失败,可通过服务管理器检查“windows biometric service”是否运行…

    2026年8月26日 用户投稿
    000
  • 如何高效解决Spryker开发中的重复代码生成问题?SprykerSpryk助你一键搞定!

    可以通过一下地址学习composer:学习地址 Spryker开发者的痛点:重复与繁琐的“体力活” 作为一名spryker开发者,你是否曾被无休止的重复性代码生成工作所困扰?每当需要创建一个新的模块、一个业务facade、一个命令或者一个transfer对象时,你都需要手动创建一系列文件和目录:定义…

    用户投稿 2026年8月26日
    000
  • 微信公众号怎么登录_微信公众号电脑与手机登录教程

    登录微信公众号需通过电脑或手机访问mp.weixin.qq.com并扫码,一个微信号绑定一个公众号,多人管理可设运营者;扫码失败可检查网络、更新微信、刷新二维码、清理缓存或更换设备;切换账号需退出当前登录后重新扫码;修改密码实际为修改微信账号密码,路径为“我”-“设置”-“账号与安全”-“微信密码”…

    2026年8月26日
    100
  • Win10系统录屏游戏功能怎么关闭?

    作为windows系列操作系统的最新版本,win10引入了许多实用的新特性,其中录屏功能便是其中之一。对于许多游戏玩家而言,这项功能在记录游戏过程时显得尤为便利,但有时也可能对游戏性能造成一定影响。如果你希望禁用这一功能,本文将详细介绍具体的操作步骤。 对于热衷于游戏直播或制作游戏素材的玩家而言,W…

    2026年8月26日
    100
  • Win7电脑自动关机怎么设置?

    Win7电脑自动关机怎么设置?Win7电脑自动关机怎么设置?Win7电脑自动关机怎么设置?Win7电脑自动关机怎么设置?

    自动关机是一项常见的电脑功能,用户可以通过输入特定命令或者使用相关软件来实现这一操作。如今,市场上有许多专门用于设置自动关机的工具,但手动输入命令也是一种简便且高效的方式。接下来,我将为大家详细介绍如何在win7系统中设置自动关机。 win7系统以其简洁的设计和人性化的体验受到广泛好评。它不仅具备强…

    2026年8月26日 用户投稿
    200
  • Safari收藏夹图标不显示_Safari书签网站小图标如何恢复正常

    首先清除Safari缓存和网站数据,重启浏览器;若无效则删除并重新添加书签以强制加载图标;检查网络连接、关闭内容拦截器,确认系统设置中图标显示已开启;最后可尝试重置Safari设置。 如果Safari收藏夹中的网站小图标(favicon)不显示,可以尝试以下几种方法来恢复。这个问题通常与缓存、系统设…

    2026年8月26日
    100
  • java中的实例是什么意思 实例与对象的概念辨析

    在java中,”实例”是某个类的具体实现,而”对象”是任何可以操作的实体。1.实例是通过new关键字创建的,如string s = new string(“hello”)中的s。2.对象包括所有实例和基本数据类型,如int sp…

    2026年8月26日
    100
  • 夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧

    夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧

    要实现夸克AI多轮对话,需先开启深度对话模式,在设置中启用“记住对话上下文”功能,并在同一会话内连续提问,使用“刚才说的”等引导词明确上下文,避免切换窗口或模糊指代,若对话混乱可长按消息选择“清除本会话记忆”重置对话链路。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年8月26日 用户投稿
    000
  • PaperBench— OpenAI 开源的 AI 智能体评测基准

    openai开源的ai智能体评测基准paperbench,能够评估ai智能体根据顶级学术论文复现结果的能力。paperbench要求智能体完整地完成从理解论文到编写代码、运行实验的全过程,以此全面考察其理论与实践能力。该基准包含8316个评分节点,采用分层评分标准和自动化评分系统,显著提升了评估效率…

    2026年8月26日
    1000
  • 手机怎么开微信公众号_手机端微信公众号创建与管理教程

    手机端可高效辅助微信公众号运营,但注册认证需电脑完成。通过“微信公众号助手”App,可实现内容发布、数据查看、用户互动及群发消息等日常操作,尤其适合碎片化时间管理。App支持图文编辑、定时发布、留言回复与数据监控,提升响应效率。然而,复杂排版、高级功能设置(如菜单配置、流量主开通)及认证流程仍依赖P…

    2026年8月26日
    1000
  • 大数据量分库分表(Sharding)策略

    大数据量的分库分表策略主要是为了解决单一数据库在面对海量数据时的性能瓶颈,通过将数据分散到多个数据库或表中,提升系统的读写性能和扩展性。具体策略包括:1. 水平分表:将同一个表的数据按照规则拆分到多个表中,如根据用户id模运算决定存放表。2. 垂直分表:将一个表的字段拆分到多个表中,减少主表数据量。…

    2026年8月26日
    500

发表回复

登录后才能评论
关注微信