影刀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]

相关新闻

自动化新闻播报系统:核心技术架构与实现

自动化新闻播报系统:核心技术架构与实现

1. 项目概述:自动化新闻播报系统的核心价值 每天早上被新闻唤醒是什么体验?作为一个坚持做了三年个人新闻简报的媒体从业者,我开发了一套自动化新闻播报系统。这个系统每天凌晨5点自动抓取全网热点,经过智能筛选和语音合成&#x…

2026/7/23 8:50:08阅读更多 →
UE5 C++基础框架设计:事件系统、数据管理与对象池实战

UE5 C++基础框架设计:事件系统、数据管理与对象池实战

1. 项目概述:为什么UE5 C项目需要一套基础功能框架? 如果你是从蓝图转向C的UE开发者,或者刚接触UE5 C的新手,大概率会遇到一个困境:每次开新项目,都要从零开始搭建那些“轮子”。比如,怎么优雅地…

2026/7/23 8:50:08阅读更多 →
C++实现卡尔曼滤波:原理、代码与工程实践指南

C++实现卡尔曼滤波:原理、代码与工程实践指南

1. 项目概述与核心价值最近在做一个机器人定位相关的项目,不可避免地要跟传感器数据打交道。无论是IMU的角速度、加速度,还是GPS的经纬度,甚至是视觉里程计给出的位姿,这些数据都带着“噪声”和“不确定性”。直接拿来用&#xff…

2026/7/23 8:50:08阅读更多 →
OC角色动画制作:水仙走路Meme风格全流程解析

OC角色动画制作:水仙走路Meme风格全流程解析

这次我们来看一个关于 OC(原创角色)和水仙走路 meme 的有趣项目。这个项目主要围绕"约的"这个主题展开,涉及原创角色的创作和特定 meme 风格的结合。对于喜欢二次元文化、角色设计和网络 meme 创作的爱好者来说,这是一个…

2026/7/23 10:04:18阅读更多 →
Claude Code 使用限额提升50%:安装配置与高效使用全指南

Claude Code 使用限额提升50%:安装配置与高效使用全指南

最近在开发过程中,很多同学反馈 Claude Code 的使用额度经常不够用,特别是在项目密集迭代阶段。好消息是,官方刚刚宣布将周使用限额提升了 50%,这一政策将持续到 8 月 19 日。作为一款强大的 AI 编程助手,Claude Code …

2026/7/23 10:04:18阅读更多 →
舞蹈视频AI分析工具:从动作识别到场景分割的本地部署实践

舞蹈视频AI分析工具:从动作识别到场景分割的本地部署实践

这次我们来看一个特别的本地部署项目——二点五次元哈尔滨随机舞蹈路演视频的AI处理方案。这个项目不是传统的AI模型,而是针对特定舞蹈视频内容的智能分析工具,能够实现舞蹈动作识别、人物跟踪、场景分割等核心功能。 对于喜欢二次元文化和舞蹈视频处理…

2026/7/23 10:04:18阅读更多 →
AI大模型入门:从原理到应用的通俗指南

AI大模型入门:从原理到应用的通俗指南

1. 为什么普通人需要了解AI大模型? 最近两年,AI大模型突然成为街头巷尾热议的话题。从能写诗的ChatGPT到会画画的Midjourney,这些看似"聪明"的AI应用背后,都离不开大模型技术的支撑。但一提到"模型"、"算…

2026/7/23 10:04:18阅读更多 →
uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白

uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白

上个月同事跑过来问了我一个问题:“uni-app 鸿蒙端跳页面传了个对象过去,接收端打出来是 [object Object],你有遇到过吗?” 我当时正在改一个鸿蒙端商品列表的瀑布流布局,头也没抬回了句:“URL 参数没序列化…

2026/7/23 10:04:18阅读更多 →
2026年AI平民化时代:开源大模型技术选型与本地部署实战指南

2026年AI平民化时代:开源大模型技术选型与本地部署实战指南

如果你是一名开发者,最近可能已经感受到了AI领域的暗流涌动。从去年开始,国内开源大模型如雨后春笋般涌现,而最新的评测数据显示,中国顶尖开源模型在多项关键指标上已经逼近甚至在某些细分领域超越了美国同类产品。 这不仅仅是技…

2026/7/23 10:02:18阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →