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


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

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

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

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

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

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

2. 识别目标API请求

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

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

Jaaz Jaaz

开源的AI设计智能体

Jaaz 216 查看详情 Jaaz
  1. 打开开发者工具: 在Chrome、Firefox等浏览器中,按下F12键或右键点击页面选择“检查”/“检查元素”。
  2. 切换到“网络”(Network)选项卡: 此选项卡会记录浏览器发出的所有HTTP请求。
  3. 清空并模拟操作: 清空网络请求记录,然后点击页面上显示隐藏电话号码的按钮(例如“التواصل”按钮)。
  4. 查找相关请求: 观察网络记录中新出现的请求。通常,这些请求的类型是XHR或Fetch。你需要查找与电话号码数据相关的请求,它们往往是POST请求,并且响应内容是JSON格式。
  5. 分析请求详情: 选中目标请求,查看其“请求头”(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 requests
import sys

def 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 None

if __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. 总结

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

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


# python  # seo视频拆解  # 医院网站站群建设  # 衡水网站建设意见  # 读seo有前途吗  # 小型健身俱乐部网站建设  # 清远网站建设哪家好  # 济宁模板网站优化公司  # 选项卡  # 抛出  # 后才  # 双击  # 所需  # 重构  # 这是  # javascript  # java  # html  # js  # json  # windows  # 网络爬虫  # 浏览器  # app  # 工具  # 加载  # 弹出  # 数据结构  # 国外免费网站推广大全有哪些  # 青岛企业网站建设便宜  # 武清区常规网站优化系统 


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


相关推荐: Go Goroutine调度与并发执行深度解析  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  批改网官网首页登录 批改网学生用户登录入口  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  excel怎么制作考勤表 excel考勤模板与函数公式讲解  AO3中文版手机快速通道_AO3最新稳定链接更新  红手指专业版app注册教程  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  申通快件单号查询平台 申通包裹物流动态跟踪  《微信》视频号原创声明开启方法  PHP中动态类名访问的类实例类型提示与静态分析实践  J*aScript装饰器_元编程实战  猫眼app抢票快还是小程序快  Symfony路由参数转换器:实体存在性验证与错误处理策略  sublime text 4如何安装_最新版sublime下载与汉化教程  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  京东快递包裹信息查询入口 京东快递官方查询平台入口  B站怎么快速升级 B站用户等级提升攻略【详解】  Retrofit根路径POST请求:@POST("/") 的应用与解析  《王者荣耀世界》英雄获取攻略  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  申通快递物流信息查询 申通快递包裹状态追踪  《伊瑟》凶影追缉库卢鲁boss攻略  全球各国上班时间表外贸邮件时间  鸿蒙单条备忘录如何加密  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  《sketchbook》选中部分图案移动方法  《虎扑》取消评分记录方法  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  J*aScript与HTML元素交互:图片点击事件与链接处理教程  《撕歌》会员开通方法  网页版网易云音乐入口_网易云音乐在线官网登录  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  todesk如何添加信任设备_todesk信任设备设置教程  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  c++如何链接Boost库_c++准标准库的集成与使用  C++ optional用法详解_C++17处理可能为空的返回值  Win10关闭UAC用户账户控制的方法 Win10降低安全提示等级【技巧】  如何取消数字签名  百度竞价WAP显示PC链接问题  Teambition网盘如何共享文件  2025SNH48年度青春盛典门票价格及购买方式  t3出行如何使用微信支付  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  解决VS Code中Python版本冲突与输出异常的指南 

 2025-11-03

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

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

点击免费数据支持

提交您的需求,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.