影刀RPA 网页动态内容采集:AJAX数据拦截
影刀RPA 网页动态内容采集AJAX数据拦截作者林焱什么情况用什么现在大部分网站的数据不在HTML源码里而是通过AJAX异步加载。用requests获取的HTML是空壳真正数据要等JS执行后才出现。在影刀RPA里有三种方式处理直接请求API接口、用浏览器等待渲染后提取、拦截AJAX响应数据。适用场景SPA单页应用数据采集、动态加载的列表/图表、AJAX分页数据、需要JS计算才能显示的数据。怎么做方式一直接请求API最高效店群矩阵自动化突破运营极限importrequestsimportjsondefscrape_via_api():直接请求AJAX接口# 1. 先在浏览器F12 → Network → XHR中找到数据接口# 2. 分析请求参数# 3. 直接请求APIapi_urlhttps://example.com/api/data/listheaders{User-Agent:Mozilla/5.0...,Accept:application/json,Referer:https://example.com/list,}params{page:1,size:20,type:all}responserequests.get(api_url,paramsparams,headersheaders,timeout10)dataresponse.json()# 解析JSON数据itemsdata.get(data,{}).get(list,[])results[]foriteminitems:results.append({名称:item.get(name,),价格:item.get(price,0),库存:item.get(stock,0),})returnresults# 分页采集所有数据defscrape_all_pages(api_url,headersNone,page_size20):采集所有分页数据all_data[]page1whileTrue:params{page:page,size:page_size}responserequests.get(api_url,paramsparams,headersheaders,timeout10)ifresponse.status_code!200:breakdataresponse.json()itemsdata.get(data,{}).get(list,[])ifnotitems:breakall_data.extend(items)print(f第{page}页:{len(items)}条, 累计{len(all_data)}条)# 检查是否最后一页totaldata.get(data,{}).get(total,0)iflen(all_data)total:breakpage1time.sleep(1)returnall_data方式二影刀浏览器等待渲染【打开网页】→ 目标页面URL 【等待元素出现】→ 数据容器选择器超时15秒 【提取相似元素数据】→ 提取渲染后的数据 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a70ad18ae29743bea6dc8338fde8cccc.png#pic_center) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/000abe4babf44287803b192ec40ef616.png#pic_center)# 在影刀中等待AJAX数据渲染完成后再提取# 1. 等待特定元素出现表示数据已加载# 影刀指令【等待元素出现】→ .data-item → 超时15秒# 2. 等待数据数量稳定defwait_for_data_stable(selector,max_wait15):等待数据加载稳定importtime prev_count0stable_count0for_inrange(max_wait):time.sleep(1)# 在影刀中用【获取相似元素数量】current_countget_element_count(selector)ifcurrent_countprev_countandcurrent_count0:stable_count1ifstable_count2:returncurrent_countelse:stable_count0prev_countcurrent_countreturnprev_count方式三拦截AJAX响应在影刀浏览器中用JavaScript拦截XHR/Fetch响应// 影刀【执行JavaScript代码】节点// 在页面加载前注入拦截代码// 拦截XMLHttpRequestvaroriginalXHROpenXMLHttpRequest.prototype.open;varoriginalXHRSendXMLHttpRequest.prototype.send;window._capturedAPIs[];XMLHttpRequest.prototype.openfunction(method,url){this._urlurl;this._methodmethod;returnoriginalXHROpen.apply(this,arguments);};XMLHttpRequest.prototype.sendfunction(body){varselfthis;this.addEventListener(load,function(){if(self._urlself._url.includes(/api/)){try{varresponseDataJSON.parse(self.responseText);window._capturedAPIs.push({url:self._url,method:self._method,status:self.status,data:responseData});}catch(e){}}});returnoriginalXHRSend.apply(this,arguments);};// 拦截FetchvaroriginalFetchwindow.fetch;window.fetchfunction(){varurlarguments[0];if(typeofurlstringurl.includes(/api/)){returnoriginalFetch.apply(this,arguments).then(function(response){varclonedresponse.clone();cloned.json().then(function(data){window._capturedAPIs.push({url:url,method:GET,data:data});}).catch(function(){});returnresponse;});}returnoriginalFetch.apply(this,arguments);};然后在影刀中获取拦截到的数据# 影刀【执行JavaScript代码】# 获取拦截到的API数据js_get_capturedreturn JSON.stringify(window._capturedAPIs);# 执行后得到JSON字符串# 在Python中解析importjson captured_datajson.loads(captured_json)forapiincaptured_data:print(fURL:{api[url]})ifdatainapiandlistinapi[data]:itemsapi[data][list]print(f 数据量:{len(items)})foriteminitems:print(f -{item})SPA应用数据采集defscrape_spa_data(url,wait_selector,extract_func): SPA单页应用数据采集 wait_selector: 数据加载完成后的元素选择器 extract_func: 数据提取函数 # 影刀中# 1. 【打开网页】url# 2. 【等待元素出现】wait_selector → 超时15秒# 3. 【提取数据】# 对于SPA路由切换不需要重新打开页面# 只需点击导航链接然后等待新内容加载# 【点击元素】→ 导航链接# 【等待元素出现】→ 新页面特征元素# 【提取数据】pass# SPA路由切换采集defscrape_spa_routes(base_url,routes):采集SPA多个路由页面all_data{}![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e073ef408fc54e5c81cc8b8f319bed7d.png#pic_center)# 第一次打开页面# 【打开网页】base_urlforroute_name,route_pathinroutes.items():# SPA不需要重新打开页面只需修改URL# 影刀中【执行JavaScript代码】js_navigatefwindow.history.pushState(null, , {route_path});# 触发路由更新js_dispatchwindow.dispatchEvent(new PopStateEvent(popstate));# 等待新页面数据加载# 【等待元素出现】→ route_name对应的选择器# 提取数据# 【提取相似元素数据】all_data[route_name]extracted_datareturnall_dataPOST请求采集defscrape_via_post(api_url,payload,headersNone):POST方式请求数据ifheadersisNone:headers{User-Agent:Mozilla/5.0...,Content-Type:application/json,}responserequests.post(api_url,jsonpayload,# JSON格式headersheaders,timeout10)[video(video-4ALNERVS-1784736628485)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]returnresponse.json()# 很多网站的搜索接口是POSTdatascrape_via_post(api_urlhttps://example.com/api/search,payload{keyword:RPA,page:1,filters:{category:software,price_min:0}})有什么坑坑1API需要特定请求头# 问题直接请求API返回403或空数据# 原因缺少必要的请求头# 解决从浏览器复制完整请求头headers{User-Agent:Mozilla/5.0...,Accept:application/json, text/plain, */*,Accept-Language:zh-CN,zh;q0.9,Referer:https://example.com/list,X-Requested-With:XMLHttpRequest,# 关键头Authorization:Bearer token...,# 如果需要认证Cookie:session_idxxx;,# 如果需要登录}# 在影刀中可以从浏览器获取Cookie# 【获取浏览器Cookie】→ 传给Python坑2数据加密传输# 问题API返回的数据是加密的# 如response {data: AES加密字符串}# 解决1找前端解密代码# F12 → Sources → 搜索decrypt → 找到解密函数# 解决2放弃API用浏览器渲染后提取# 影刀中【打开网页】→ 【等待渲染】→ 【提取DOM数据】# 解决3在浏览器中执行JS解密![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7ed4048290b2417e8a2f98772abc39ad.png#pic_center)# 影刀【执行JavaScript代码】# 先找到页面上的解密函数然后调用它js_decrypt var encryptedData arguments[0]; // 使用页面的解密函数 return decryptFunction(encryptedData); 坑3AJAX请求有频率限制# 问题快速请求API返回429Too Many Requests# 解决降低频率 重试defsafe_api_request(url,paramsNone,max_retries3):带重试的API请求forattemptinrange(max_retries):responserequests.get(url,paramsparams,headersheaders,timeout10)ifresponse.status_code200:returnresponse.json()elifresponse.status_code429:wait_time(attempt1)*5# 5, 10, 15秒递增print(f被限流等待{wait_time}秒...)time.sleep(wait_time)else:print(f请求失败:{response.status_code})time.sleep(2)returnNone坑4数据加载有延迟# 问题点击翻页后立即提取数据拿到的是旧数据# 解决等待新数据加载# 方案1等待特定元素变化# 影刀中# 【点击元素】→ 下一页# 【等待元素消失】→ .loading-spinner加载动画消失# 【等待元素出现】→ .data-item新数据出现# 【等待】1秒额外等待# 方案2比较数据指纹![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3368335041cd4af2b8d7997f172c5a3e.png#pic_center)defwait_for_data_change(old_fingerprint,timeout10):等待数据变化for_inrange(timeout):time.sleep(1)# 获取当前数据指纹如第一条数据的IDcurrent_fpget_first_item_id()ifcurrent_fp!old_fingerprint:returnTruereturnFalse坑5GraphQL接口采集# 问题网站用GraphQL一个接口查所有数据# 请求格式和REST不同# GraphQL请求示例defscrape_graphql(endpoint,query,variablesNone):GraphQL接口采集payload{query:query,variables:variablesor{}}responserequests.post(endpoint,jsonpayload,headers{Content-Type:application/json,...},timeout10)returnresponse.json()![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/64ec0c19e2554d19bbf82847740a597c.png#pic_center)# 使用query query GetProducts($page: Int, $size: Int) { products(page: $page, size: $size) { id name price stock } } datascrape_graphql(https://example.com/graphql,query,variables{page:1,size:20})productsdata[data][products]

相关新闻

C++实战:从算法竞赛题到图形化黑白棋游戏开发全解析

C++实战:从算法竞赛题到图形化黑白棋游戏开发全解析

1. 项目概述:从一道经典赛题到可玩的游戏如果你接触过信息学奥赛(NOI/NOIP)或者刷过《信息学奥赛一本通》这类经典教材,大概率对“黑白棋”这个题目有印象。它通常出现在“模拟”或“搜索”章节,编号可能是1317或者类似…

2026/10/17 18:11:02 阅读更多 →
CDN技术如何优化抖音视频流畅体验

CDN技术如何优化抖音视频流畅体验

1. 为什么你的抖音视频从不卡顿? 上周朋友聚会时,小李突然问我:"为什么我在地铁上用4G刷抖音从来不卡,但看B站偶尔会转圈?"这个问题让我意识到,大多数普通用户并不了解,那些丝滑的视频…

2026/10/15 15:19:38 阅读更多 →
Cortex-M3 NVIC与SysTick寄存器实战:从原理到中断配置全解析

Cortex-M3 NVIC与SysTick寄存器实战:从原理到中断配置全解析

1. 从寄存器手册到实战代码:Cortex-M3中断管理的核心逻辑 如果你曾经对着ARM Cortex-M3的技术参考手册(TRM)里那几十页的NVIC和SysTick寄存器描述发呆,感觉每个字都认识但连起来不知道在说什么,那么这篇文章就是为你写…

2026/10/15 15:20:09 阅读更多 →

最新新闻

数据链路层核心原理:MAC地址、以太网帧与交换机转发机制解析

数据链路层核心原理:MAC地址、以太网帧与交换机转发机制解析

十年前我第一次在模拟器里敲下 show mac address-table,看着那几行 MAC 和端口映射,并不觉得数据链路层有什么特别。直到后来排障时发现,很多网络“通了却不对”的问题,根源都藏在这一层。数据链路层是连接物理传输与网络逻辑之间…

2026/10/20 5:22:05 阅读更多 →
信呼OA v1.9.1部署与流程实战:中小团队生产级协同底座

信呼OA v1.9.1部署与流程实战:中小团队生产级协同底座

简介:信呼协同办公OA系统v1.9.1是一款面向中小企业及IT运维/开发人员的开源办公平台解决方案,旨在解决多终端协作、流程标准化与系统可定制化等核心管理需求。资源包共1256个文件,主体为606个PHP后端逻辑文件、231个GIF/79个PNG/3个JPG等前端…

2026/10/20 5:22:05 阅读更多 →
jstat实战:用JDK自带工具监控JVM内存与GC

jstat实战:用JDK自带工具监控JVM内存与GC

在Java服务卡顿、内存飙高、接口超时的时候,绝大多数人第一反应是抓一把jstack看线程,或者拉一份heap dump慢慢分析。但很多时候,问题的根源根本不在某个线程卡在哪行代码,而是整个堆的“新陈代谢”出了问题——对象疯狂创建、回收…

2026/10/20 5:22:05 阅读更多 →
Yume1.5交互式世界生成实战:单卡12FPS实时渲染与部署全解析

Yume1.5交互式世界生成实战:单卡12FPS实时渲染与部署全解析

第一次在某个开源项目页里看到“单卡 12 FPS 实时交互渲染”这句话,我还以为是拿预渲染视频抽帧充数。直到自己把提示词敲进去,生成出一片雨夜小巷,拖动路灯,地上的积水反光跟着偏移角度的那一刻,我才确定:…

2026/10/20 5:22:05 阅读更多 →
c++11学习

c++11学习

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 5:22:05 阅读更多 →
视觉模型重塑时间序列分析:从离散Token到连续视觉的范式转换

视觉模型重塑时间序列分析:从离散Token到连续视觉的范式转换

1. 从离散Token到连续视觉:时间序列分析的新思路拆解时间序列分析这个领域,做的人多,但真正让人眼前一亮的突破少。传统方法从统计模型一路走到深度学习,Transformer架构进来之后,大家发现一个尴尬的事实:文…

2026/10/20 5:21:04 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →