影刀RPA 网络请求拦截:捕获Ajax数据的正确姿势
title: “影刀RPA 网络请求拦截:捕获Ajax数据的正确姿势”
date: 2026-07-01
author: 林焱
影刀RPA 网络请求拦截:捕获Ajax数据的正确姿势
很多网站的数据不直接写在HTML里,而是页面加载完后通过Ajax异步请求获取。直接抓HTML拿不到数据,用XPath也定位不到。这时候要拦截网络请求,直接拿API返回的JSON,比解析HTML干净100倍。
什么情况用什么
必须用请求拦截的场景:
页面数据通过异步Ajax加载,HTML里只有骨架
商品价格、库存、评论等数据是动态渲染的
分页数据通过XHR请求获取,URL不变只换参数
想拿到完整未经截断的原始数据
普通页面抓取就够的场景:
- 数据直接写在HTML里(服务端渲染)
- 只需要静态文本内容
拼多多店群自动化上架方案
怎么做
方法1:监听网络响应(最常用)
启动浏览器时开启网络监听,捕获特定URL的响应数据。
【影刀操作】
- 新建流程「拦截Ajax数据」
- 添加【Python】指令(先要找到目标请求URL)
# 思路:先用浏览器开发者工具(F12→Network)# 过滤XHR/Fetch类型的请求# 找到包含目标数据的那个请求URL# 记录下URL和请求参数print('请先用开发者工具分析目标网站的网络请求') - 添加【打开网页】指令
- URL:
https://目标网站.com - 开启请求监听:是
- URL:
- 添加【Python】指令(Playwright方式拦截)
importjson captured_data=[]# 监听响应事件defhandle_response(response):# 只处理包含目标数据的接口if'api/product/list'inresponse.url:try:data=response.json()captured_data.append(data)print(f'捕获到数据:{len(data.get("data", {}).get("list", []))} 条')except:passpage.on('response',handle_response)# 触发页面操作,让Ajax请求发出去page.goto('https://目标网站.com/products')page.wait_for_load_state('networkidle')# 取消监听page.remove_listener('response',handle_response)# 保存到变量yda.set_variable('raw_data',json.dumps(captured_data,ensure_ascii=False))print(f'共捕获{len(captured_data)}次响应')
方法2:直接重放API请求
分析到目标接口后,不通过浏览器,直接用Python发HTTP请求,效率更高。
【影刀操作】
- 添加【Python】指令
importrequestsimportjson# 从浏览器开发者工具里复制的请求头(右键请求→Copy as cURL→转换成Python)headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Referer':'https://目标网站.com/products','Cookie':'your_session_cookie_here','X-Requested-With':'XMLHttpRequest'}all_data=[]page_num=1whileTrue:params={'page':page_num,'pageSize':20,'category':'electronics'}resp=requests.get('https://目标网站.com/api/product/list',headers=headers,params=params,timeout=10)result=resp.json()items=result.get('data',{}).get('list',[])ifnotitems:breakall_data.extend(items)print(f'第{page_num}页,获取{len(items)}条,累计{len(all_data)}条')page_num+=1# 判断是否还有下一页total_pages=result.get('data',{}).get('totalPages',1)ifpage_num>total_pages:breakyda.set_variable('product_list',json.dumps(all_data,ensure_ascii=False))print(f'采集完成,共{len(all_data)}条数据')
方法3:拦截并修改请求(高级用法)
不只是监听,还能修改请求参数或响应内容。
【影刀操作】
# 拦截请求并修改参数defhandle_route(route):request=route.requestif'api/search'inrequest.url:# 修改请求,去掉某个限制参数new_headers=dict(request.headers)new_headers['X-Page-Size']='100'# 强制每页100条route.continue_(headers=new_headers)else:route.continue_()page.route('**/*',handle_route)page.goto('https://目标网站.com/search?keyword=test')有什么坑
坑1:接口有签名校验
很多电商网站的接口带有sign参数,是时间戳+密钥的MD5,直接重放会报"签名错误"。
分析思路:
TEMU店群如何管理运营?
- 在Network里找到请求,看sign参数的规律
- 搜索页面JS源码里sign的生成逻辑(全局搜索"sign =")
- 用Python复现签名逻辑
坑2:接口需要登录态才能访问
没带登录Cookie,接口返回401或者空数据。
解决方法:参考Cookie管理那篇,先登录获取Cookie,在请求头里带上Cookie。
坑3:数据量太大,响应超时
一次性请求几千条,服务器超时或者返回错误。
解决方法:分页请求,每页不超过50条,在请求间加0.5-1秒随机延时。
坑4:动态加密的接口参数
有些接口的参数经过加密,Base64或者AES加密,直接看不出规律。
解决方法:这类接口用Selenium/Playwright直接操作浏览器更省事,别死磕接口逆向。
总结
网络请求拦截能拿到比HTML解析干净得多的结构化数据。核心流程:开发者工具分析接口 → 找到目标请求URL和参数 → 用Python直接重放 → 处理分页和异常。掌握这个技能,80%的动态网站数据采集问题都能解决。