当前位置: 首页 > article >正文

智能嗅探AJAX触发:机器学习在动态渲染中的创新应用

爬虫代理

一、问题描述:数据加载变“隐形”,采集举步维艰

随着Web技术不断发展,越来越多网站采用了AJAX、动态渲染等技术来加载数据。以今日头条(https://www.toutiao.com)为例,用户打开网页时并不会一次性加载所有信息,而是通过JavaScript触发异步请求分批加载新闻数据。

对于传统爬虫,这种动态加载的数据变得“隐形”:

  • 页面初始HTML并无完整数据
  • 请求路径是JavaScript动态拼接
  • 请求频率稍高就触发反爬策略

于是,如何精准嗅探出这些AJAX请求路径、参数及触发方式,成了采集中的新难题。


二、场景再现:爬取关键词“AI”的头条新闻

设定任务:从 https://www.toutiao.com 中搜索关键词“AI”,采集相关新闻的标题、简介、作者和发布时间。初看HTML源代码,会发现结构复杂、数据嵌入 JavaScript 中,无法直接提取。

我们尝试用传统 BeautifulSoup + requests 抓取,发现返回结果中并无新闻数据,失败告终。


三、多种尝试:模拟浏览器?分析XHR?依旧低效

面对这种问题,我们尝试以下三种方法:

  1. 浏览器自动化(如Selenium):虽然可以加载全部页面内容,但执行效率低,无法大规模采集。
  2. 抓包分析(Chrome DevTools):定位XHR请求路径并手动拼接参数,但路径容易改变、无法适应动态规则。
  3. 静态逆向接口:部分API参数存在签名校验或时间戳校验,逆向成本高。

因此,我们需要一种更智能的方式让爬虫“学会”识别页面中的AJAX行为并自动推测请求方式


四、解决方法:引入机器学习,智能识别AJAX触发点

借助机器学习+页面行为特征提取,我们构建了一个智能嗅探器,流程如下:

  1. 输入关键词构造URL,加载HTML页面
  2. 用正则+特征匹配分析页面中潜在的AJAX触发入口
  3. 基于训练集模型识别出真实数据接口路径
  4. 构造Headers,使用爬虫代理请求真实数据
  5. 解析JSON结构,抽取标题、简介、作者和时间并分类存储

以下是核心代码实现部分:


五、核心代码

import requests
import json
import time
import random
from urllib.parse import quote# 爬虫代理IP配置(以亿牛云代理为例 www.16yun.cn)
proxy_host = "proxy.16yun.cn"   #your-proxy-domain
proxy_port = "31000"   #your-port
proxy_user = "16YUN"   #your-username
proxy_pass = "16IP"    #your-password# 构造代理格式
proxies = {"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}","https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}# 设置User-Agent和cookie,模拟真实用户访问
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36","cookie": "tt_webid=1234567890abcdef; other_cookies=xxx"
}# 关键词搜索
keyword = "AI"
encoded_keyword = quote(keyword)# 模拟 AJAX 请求接口(来自浏览器F12提取的接口,带关键词参数)
def fetch_news(keyword):url = f"https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword={encoded_keyword}&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab"try:response = requests.get(url, headers=headers, proxies=proxies, timeout=10)data = response.json()result = []for item in data.get("data", []):if not item.get("title"):continuenews = {"标题": item.get("title", ""),"简介": item.get("abstract", ""),"作者": item.get("media_name", "未知"),"时间": item.get("datetime", "未知")}result.append(news)return resultexcept Exception as e:print(f"抓取出错:{e}")return []# 分类存储(按作者存为独立文件)
def save_by_author(news_list):from collections import defaultdictimport osgrouped = defaultdict(list)for news in news_list:grouped[news["作者"]].append(news)if not os.path.exists("output"):os.mkdir("output")for author, items in grouped.items():filename = f"output/{author}.json"with open(filename, "w", encoding="utf-8") as f:json.dump(items, f, ensure_ascii=False, indent=2)if __name__ == "__main__":news_data = fetch_news(keyword)print(f"共抓取到 {len(news_data)} 条资讯")save_by_author(news_data)

六、原理分析:从规则硬编码 → 学习预测接口结构

这类动态接口的一个关键特征是:参数格式、接口路径在用户行为驱动下形成。因此,通过对已知接口路径(如 /api/search/content)进行归纳、训练,可以构建轻量型预测器(如基于TF-IDF+随机森林分类器),识别新页面中是否存在可用AJAX接口。

当然,本文采用了简化版“人工辅助+规则模板”识别方式。在实际大型项目中,可以扩展为:

  • 使用 Puppeteer/Playwright 获取完整DOM+XHR调用记录
  • 使用 LLM 模型预测数据加载源
  • 构建接口路径聚类系统,自动适应接口变更

七、结语:未来已来,采集正逐步“智能化”

面对复杂的前端动态渲染,靠写死的路径早已无法应对日益频繁的页面结构变动。通过引入机器学习和行为识别,我们能让爬虫具备“嗅觉”和“判断力”,甚至主动适应页面的变化。

相关文章:

智能嗅探AJAX触发:机器学习在动态渲染中的创新应用

一、问题描述:数据加载变“隐形”,采集举步维艰 随着Web技术不断发展,越来越多网站采用了AJAX、动态渲染等技术来加载数据。以今日头条(https://www.toutiao.com)为例,用户打开网页时并不会一次性加载所有…...

【计算机网络】Linux下简单的UDP服务器(超详细)

套接字接口 我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。 🌎socket函数 这是Linux中创建套接字的系统调用,函数原型如下: int socket(int domain, int typ…...

Java并发编程实战 Day 3:volatile关键字与内存可见性

【Java并发编程实战 Day 3】volatile关键字与内存可见性 开篇 欢迎来到《Java并发编程实战》系列的第3天!本系列旨在带领你从基础到高级逐步掌握Java并发编程的核心概念和最佳实践。 今天我们将重点探讨volatile关键字及其在多线程程序中确保内存可见性的作用。我…...

华为OD机试真题——报文回路(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

K8s工作流程与YAML实用指南

K8s 工作流程 K8s 采用声明式管理(用户说"要什么",K8s 负责"怎么做")方式,通过 YAML 文件描述期望的状态,K8s控制平面会自动确保实际状态与期望状态一致。 核心工作流程如下: 用户提交…...

功能丰富的PDF处理免费软件推荐

软件介绍 今天给大家介绍一款超棒的PDF工具箱,它处理PDF文档的能力超强,而且是完全免费使用的,没有任何限制。 TinyTools(PC)这款软件,下载完成后即可直接打开使用。在使用过程中,操作完毕后&a…...

Java补充(Java8新特性)(和IO都很重要)

一、Lambda表达式 1.1、为什么使用Lambda表达式 Lambda表达式起步案例 下面源码注释是传统写法,代码是简写表达式写法 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.function.Consumer;/* * 学什么…...

pycharm debug的时候无法debug到指定的位置就停住不动了

报错大致是这样的,但是直接run没有问题,debug就停住不动了 Traceback (most recent call last): File "/home/mapengsen/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 467, in start_client s.connect((host, port)) Timeou…...

分布式流处理与消息传递——Kafka ISR(In-Sync Replicas)算法深度解析

Java Kafka ISR(In-Sync Replicas)算法深度解析 一、ISR核心原理 #mermaid-svg-OQtnaUGNQ9PMgbW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQtnaUGNQ9PMgbW0 .error-icon{fill:#55222…...

极大似然估计例题——正态分布的极大似然估计

设总体 X ∼ N ( μ , σ 2 ) X \sim N(\mu, \sigma^2) X∼N(μ,σ2),其中 μ \mu μ 和 σ 2 \sigma^2 σ2 是未知参数,取样本观测值为 x 1 , x 2 , ⋯ , x n x_1, x_2, \cdots, x_n x1​,x2​,⋯,xn​,求参数 μ \mu μ 和 σ 2 \sigma^2 σ…...

Pull Request Integration 拉取请求集成

今天我想要把我创建的项目,通过修改yaml里面的内容,让我在main分支下的其他分支拉取请求的时候自动化测试拉取的内容,以及将测试结果上传到控制台云端。 首先我通过修改yaml文件里面的内容 name: Build and Teston:push:branches:- mainjobs:…...

OS10.【Linux】yum命令

目录 1.安装软件的几种方法 直接编译源代码,得到可执行程序 使用软件包管理器 2.yum yum list命令 参数解释 yum install命令 yum remove命令 下载链接存放的位置 扩展yum源 实验:安装sl小火车命令 sl命令的选项 方法1:man sl 方法2:读源代码 3.更新yum源 查看…...

头歌数据库课程实验(角色管理)

第1关:创建角色 任务描述 本关任务:创建角色 role1localhost。 相关知识 为了完成本关任务,你需要掌握MySQL的角色管理。 角色信息存放在数据库 mysql 的 user 表中。 user 表中字段: Host:可以登陆数据库的主机地…...

【android bluetooth 协议分析 03】【蓝牙扫描详解 1】【扫描关键函数 btif_dm_search_devices_evt 分析】

1. 背景 本篇我们来对 btif_dm_search_devices_evt 函数进行分析. 这是系统性分析 Bluetooth 协议栈中的设备扫描流程时必须厘清的一环。 1. 为什么要单独分析 btif_dm_search_devices_evt 函数: btif_dm_search_devices_evt 是 BTIF 层中处理设备扫描&#xff0…...

SpringBoot使用ThreadLocal保存登录用户信息

Java 多线程,系列文章: 《Java多线程》 《Java创建多线程的3种方法:继承Thread类、实现Runnable接口、实现Callable接口》 《Java多线程的同步:synchronized关键字、Lock接口、volatile关键字》 《Java线程池》 《Java线程池实现秒杀功能》 《SpringBoot使用ThreadLocal保存…...

多模态大语言模型arxiv论文略读(102)

Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文标题:Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文作者:Can Wang, Hongliang Zhong, Menglei Chai, Mingming He, Dongdong Chen, Ji…...

Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署)

Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署) 一、安装docker(ubuntu系统版本20.4) 1、更新apt sudo apt-get update2、安装必要的依赖包 sudo apt-get install ca-certificates curl gnupg lsb-release3、添加 Docker 官方 GPG 密钥(清化大学源) # 添加Docke…...

python常用库-pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))

文章目录 python常用库pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))背景什么是JSONL(JSON Lines)通过pandas读取和保存JSONL文件pandas读取和保存JSONL文件 Hugging Face的datasets库Hugg…...

高端装备制造企业如何选择适配的项目管理系统提升项目执行效率?附选型案例

高端装备制造项目通常涉及多专业协同、长周期交付和高风险管控,因此系统需具备全生命周期管理能力。例如,北京奥博思公司出品的 PowerProject 项目管理系统就是一款非常适合制造企业使用的项目管理软件系统。 国内某大型半导体装备制造企业与奥博思软件达…...

【Dv3Admin】工具权限配置文件解析

接口级权限控制是后台系统安全防护的核心手段。基于用户角色、请求路径与方法进行细粒度授权,可以有效隔离不同用户的数据访问范围,防止越权操作,保障系统整体稳定性。 本文解析 dvadmin/utils/permission.py 模块,重点关注其在匿…...

AI炼丹日志-22 - MCP 自动操作 Figma+Cursor 自动设计原型

MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、AutoScraper概述1.1 AutoScraper介绍1.2 安装1.3 注意事项二、基本使用方法2.1 创建 AutoScraper 实例2.2 训练模型2.3 保存和加载模型2.4 数据提取方法2.5 自定义规则三、高级功能3.1 多规则抓取3.2 分页抓取3.3 代…...

2025.6.1总结

今天又上了一天课,假期三天,上了两天的课,明天还得刷题。利用假期时间上课学习,并没有让我感到有多充实,反而让我感到有些小压抑。 在下午的好消息分享环节,我分享了毕业工作以来的一些迷茫。我不知道自己…...

[嵌入式实验]实验四:串口打印电压及温度

一、实验目的 熟悉开发环境在开发板上读取电压和温度信息使用串口和PC通信在PC上输出当前电压和温度信息 二、实验环境 硬件:STM32开发板、CMSIS-DAP调试工具 软件:STM32CubeMX软件、ARM的IDE:Keil C51 三、实验内容 配置相关硬件设施 &…...

LVS+Keepalived 高可用

目录 一、核心概念 1. LVS(Linux Virtual Server) 2. Keepalived 二、高可用架构设计 1. 架构拓扑图 2. 工作流程 三、部署步骤(以 DR 模式为例) 1. 环境准备 2. 主 LVS 节点配置 (1)安装 Keepali…...

Linux正则三剑客篇

一、历史命令 history 命令 :用于输出历史上使用过的命令行数量及具体命令。通过 history 可以快速查看并回顾之前执行过的命令,方便重复操作或追溯执行过程。 !行号 :通过指定历史命令的行号来重新执行该行号对应的命令。例如,若…...

HTML5 视频播放器:从基础到进阶的实现指南

在现代Web开发中,视频播放功能是许多网站的重要组成部分。无论是在线教育平台、视频分享网站,还是企业官网,HTML5视频播放器都扮演着不可或缺的角色。本文将从基础到进阶,详细介绍如何实现一个功能完善的HTML5视频播放器&#xff…...

鸿蒙HarmonyOS (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…...

函数栈帧深度解析:从寄存器操作看函数调用机制

文章目录 一、程序运行的 "舞台":内存栈区与核心寄存器二、寄存器在函数调用中的核心作用​三、函数调用全流程解析:以 main 调用 func 为例阶段 1:main 函数栈帧初始化**阶段 2:参数压栈(右→左顺序&#x…...

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 (一)可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心:滑…...