【爬虫学习】动态网页数据抓取实战:Ajax逆向与浏览器自动化

article/2025/8/5 23:20:47

【爬虫学习】动态网页数据抓取实战:Ajax逆向与浏览器自动化

在这里插入图片描述


摘要

针对现代网站的动态化趋势,本文深入解析Ajax接口逆向与浏览器自动化技术。通过微博热搜实时数据抓取、知乎无限滚动内容采集等实战案例,演示如何突破动态渲染壁垒,实现结构化数据提取。

一、Ajax接口逆向实战:微博热搜数据采集

动态网页的核心特征是通过JavaScript异步加载数据,需绕过前端渲染直接获取原始API数据。

1.1 接口捕获全流程解析

工具链:Chrome开发者工具 + Postman

  1. 开启抓包:F12打开开发者工具,切换至Network面板,勾选Preserve log
  2. 触发数据加载:刷新页面或滚动触发XHR请求
  3. 筛选请求:通过XHR/fetch类型过滤,定位包含关键词(如hotfeed)的请求
  4. 分析请求
    • Headers:重点关注RefererUser-AgentX-Requested-With
    • Params:识别分页参数(如max_id)、加密参数(如签名)
    • Response:验证数据结构是否包含目标内容

典型微博热搜接口

https://weibo.com/ajax/statuses/hot_band?containerid=106003type%3D25%26t%3D3%26disable_hot%3D1%26filter_type%3Drealtimehot
1.2 参数加密逆向分析

常见加密手段:

  1. 时间戳签名:如_rnd参数为当前时间戳,用于防止重放攻击
    params["_rnd"] = str(int(time.time() * 1000))
    
  2. Cookie依赖:部分接口需验证SUBCookie(用户身份标识)
    headers["Cookie"] = "SUB=_2A25JsExample; SUBP=Example;"
    
  3. 动态签名:复杂场景需逆向JS生成签名(如gsid参数)
    • 使用js2pyPyExecJS执行浏览器环境JS代码
1.3 完整采集代码实现
import requests
import time
import jsonclass WeiboHotScraper:def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36","X-Requested-With": "XMLHttpRequest","Referer": "https://weibo.com/hot"}self.api_url = "https://weibo.com/ajax/statuses/hot_band"self.max_id = 0  # 分页标识def get_hot_list(self):params = {"containerid": "106003type%3D25%26t%3D3%26disable_hot%3D1%26filter_type%3Drealtimehot","max_id": self.max_id,"_rnd": int(time.time() * 1000)}response = requests.get(self.api_url, headers=self.headers, params=params)if response.status_code != 200:raise RequestError("API request failed")data = response.json()if not data.get("data"):return Nonehot_items = data["data"]["band_list"]self.max_id = data["data"]["max_id"]  # 更新下一页标识return hot_itemsdef run(self):all_hot = []while True:items = self.get_hot_list()if not items:breakall_hot.extend(items)time.sleep(2)  # 模拟人类操作间隔return all_hot# 使用示例
scraper = WeiboHotScraper()
hot_data = scraper.run()
json.dump(hot_data, open("weibo_hot.json", "w", encoding="utf-8"), ensure_ascii=False)

二、浏览器自动化进阶:知乎无限滚动内容抓取

对于依赖JavaScript动态渲染的页面(如无限滚动加载),需借助浏览器自动化工具模拟用户行为。

2.1 Selenium反检测技术

现代网站通过navigator.webdriver等属性检测自动化程序,可通过以下手段规避:

  1. 修改浏览器指纹
    options = webdriver.ChromeOptions()
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument(f"user-agent={generate_random_user_agent()}")
    
  2. 注入自定义JS
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """delete window.cdc_adoQpoasnfa76pfcZLmcfl_;Object.defineProperty(navigator, 'webdriver', {get: () => undefined});"""
    })
    
2.2 动态加载内容捕获

无限滚动处理三步骤

  1. 定位加载容器:通过driver.find_element(By.CSS_SELECTOR, ".List")确定内容区域
  2. 模拟滚动行为
    def scroll_to_bottom(driver, scroll_pause=2):last_height = driver.execute_script("return document.body.scrollHeight")while True:driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(scroll_pause)new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:break  # 到达底部last_height = new_height
    
  3. 显式等待优化
    from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
    wait.until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "ContentItem")))
    
2.3 知乎回答采集完整流程
from selenium import webdriver
from selenium.webdriver.common.by import By
import timeclass ZhihuScraper:def __init__(self):self.options = webdriver.ChromeOptions()self.options.add_argument("--headless=new")  # 无界面模式self.options.add_argument("--disable-gpu")self.driver = webdriver.Chrome(options=self.options)def open_question(self, question_id):url = f"https://www.zhihu.com/question/{question_id}"self.driver.get(url)time.sleep(3)  # 等待初始加载def scroll_and_collect(self):scroll_to_bottom(self.driver)  # 执行滚动加载answers = self.driver.find_elements(By.CSS_SELECTOR, ".QuestionAnswer-content")return [answer.text for answer in answers]def close(self):self.driver.quit()# 使用示例
scraper = ZhihuScraper()
scraper.open_question("456789")
answers = scraper.scroll_and_collect()
scraper.close()

三、动态反爬应对策略与性能优化

3.1 反爬应对矩阵
反爬手段应对方案
IP封禁代理池+IP轮换策略
User-Agent检测随机UA生成+浏览器指纹模拟
验证码第三方打码平台(如极验、12306)
请求频率限制随机延迟+请求间隔抖动
JS动态加密逆向分析+模拟加密逻辑
3.2 性能优化技巧
  1. 无头模式options.add_argument("--headless=new")减少资源占用
  2. 隐式等待替代:避免time.sleep()固定延迟,使用WebDriverWait智能等待
  3. 批量元素定位:通过find_elements一次性获取所有元素,减少DOM查询次数
  4. 懒加载处理:对未可见元素使用driver.execute_script("arguments[0].scrollIntoView();", element)触发加载

总结

动态网页采集需综合运用接口逆向、浏览器自动化、反检测等技术。实际项目中应优先分析是否存在未加密的API接口,避免直接与前端对抗。对于必须使用浏览器自动化的场景,需平衡采集效率与反爬风险,通过代理池、请求间隔控制等手段构建可持续的采集方案。


http://www.hkcw.cn/article/FgEpWCAvXi.shtml

相关文章

【Spring Cloud Alibaba】:Nacos 使用全详解

目录 一、服务注册发现1、nacos-provider服务提供者创建2、nacos-consumer服务消费者创建 二、配置管理1、添加配置文件2、拉取配置3、读取配置4、配置热更新方式一:添加 RefreshScope 注解方式二:使用ConfigurationProperties注解代替Value注解。 5、多…

【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路

摘要:本文围绕学校 AI 数字人项目从 Sql Server 数据库替换至 KingbaseES 数据库的实践展开,涵盖迁移背景、两种数据库对比、替换实施步骤、应用效果展示、问题与解决措施等多方面内容,为教育领域类似项目提供了详实参考。 目录 1.背景与需求…

前端框架大对决:uni-app、taro、flutter、RN 哪家强?

文章目录 一、引言二、框架初印象三、开发语言与环境搭建3.1 开发语言特色3.2 环境搭建流程四、跨平台能力4.1 适配平台情况4.2 平台专有功能调用与界面适配特点五、性能表现5.1 渲染机制剖析5.2 性能测试数据六、组件与插件生态6.1 内置组件丰富度6.2 插件市场活跃度七、开发体…

rpcsx-ui-android:打造 RPCSX 模拟器原生态 Android UI

rpcsx-ui-android:打造 RPCSX 模拟器原生态 Android UI rpcsx-ui-android 项目地址: https://gitcode.com/gh_mirrors/rp/rpcsx-ui-android 项目介绍 rpcsx-ui-android 是一款为 RPCSX 模拟器量身定制的原生 Android 用户界面。该项目的目标是为用户提供流…

Android 15强制edge-to-edge全面屏体验

一、背景 Edge-to-edge 全面屏体验并非 Android 15 才有的新功能,早在 Android 15 之前系统就已支持。然而,该功能推出多年来,众多应用程序依旧未针对全面屏体验进行适配。因此,在 Android 15 的更新中,Google 终于决…

MacOS上如何运行内网穿透详细教程

本文以市面常见、好用的内网穿透为例,一款为开源内网穿透工具Frp;另一款为国产新锐软件ZeroNews。 一、Frp(开源工作、使用自由) 1. 下载 FRP 访问 FRP 的 GitHub 发布页: https://github.com/fatedier/frp/releases 选择适合 …

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上,Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径,可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…

iOS uni-app 原生插件开发

下面以创建一个物体检测插件为例。 开发环境: XCode 16.3 SDK包 ,4.45 HBuilderX 4.45 1. 解压 SDK 2. 创建一个插件,放到 HBuilder-uniPluginDemo 目录下 3. 配置依赖 打开 HBuilder-uniPlugin.xcodeproj 将 ObjectDetector.xcodeproj 拖…

生产力工具|vscode for mac的安装python库和使用虚拟环境(一)

一、在vscode中运行python代码(mac或windows) (一)在vscode中安装Python插件 若想在vscode中高效率的编辑Python代码,需要安装Python插件,点击下图中红框内的按钮: 然后在左上角的搜索框中输入…

【超适合小白】苹果电脑MAC——抓包工具-Charles使用超详细教程!!!适合小白!!!

一、Charles是什么? Charles是一个HTTP代理服务器,是类似于一个监视器,简单来说可以直接抓取手机或者浏览器中的接口,当手机/浏览器连接Charles的代理访问互联网时,Charles可以监控浏览器发送和接收的所有数据。它允许…

在macOS上安装MySQL

macOS的MySQL有多种不同的形式: 1、本机包安装程序,它使用本机macOS安装程序(DMG)引导您完成MySQL的安装。有关详细信息,请参阅第2.4.2节,“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…

2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望

目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实(AR)与虚拟现实(VR)的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …

中兴B862AV3.2M刷机包晨星MSO9385_2+8_安卓9_免拆机免打开ADB固件包

在开始刷机之前,请务必确认你的设备型号为中兴 B862AV3.2M 且搭载晨星处理器,同时备份好设备中的重要数据,刷机有风险,操作需谨慎!以下是详细的刷机步骤: 一、准备工作 下载刷机固件:从可靠的来…

计算机网络:TCP/IP协议(从 MAC 地址到 VLAN 标签:数据链路层如何重构网络拓扑逻辑)

目录 前言数据链路层MAC地址共享介质型网络争用方式令牌传递方式 非共享介质网络根据MAC地址进行转发环路检测技术生成树源路由法 VLAN以太网帧格式 总结写在文末 前言 本期开始将分层进行讲解OSI参考模型或者TCP/IP参考模型,从数据链路到应用层,本期先…

基于 LLM 的商城智能客服助理开发实战

参考LLM开源文档 Datawhale LLM教程🌐📚 文章目录 💡实现思路🚀实现步骤📊 数据集介绍⚙️ 数据处理📝 评估输入🔍 提取商品关键词🔍 检索商品信息📝 生成并评估回答✨ …

电子电器架构 --- OTA测试用例分析(中)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

安卓逆向篇LSP 模块HOOK 添加技术绕过检测算法解密逻辑验证

前置解释: 0 、 Magisk : 是当前 Android 社区用来获取 root 权限的主流方式开源工具 1 、 LSP 框架: XPosed 框架因只支持安卓 8 及以下,故高版本应使用 MagiskLSPosed 2 、 HOOK 技术: 钩子技术&…

网络攻防技术一:绪论

文章目录 一、网络空间CyberSpace1、定义2、基本四要素 二、网络空间安全1、定义2、保护对象3、安全属性4、作用空间 三、网络攻击1、攻击分类2、攻击过程 四、网络防护1、定义2、安全模型3、安全服务5类4、特定安全机制8种5、普遍性安全机制5种 五、网络安全技术发展简史1、第…

李臻20242817_安全文件传输系统项目报告_第14周

安全文件传输系统项目报告(第 14 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: SecureFileTransfer/ ├── client/ # 客户端主目…

分布式流处理与消息传递——Paxos Stream 算法详解

Java 实现 Paxos Stream 算法详解 一、Paxos Stream 核心设计 #mermaid-svg-cEJcmpaQwLXpEbx9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cEJcmpaQwLXpEbx9 .error-icon{fill:#552222;}#mermaid-svg-cEJcmpaQw…