19.API数据采集:用requests自动拉取MES数据
一、问题背景每天点导出要疯掉了我们FAB的MES系统有个功能但99%的人只用了一种方式——**手动导出**1. 打开MES网页2. 填入查询条件日期、工站、产品3. 点击导出CSV4. 等5分钟下载5. 打开Excel看看数据每天要导10次每次5分钟一天花50分钟在等下载上。偶尔忙起来忘了导出第二天分析发现没数据。**更难受的是**数据自动化工具SPC控制图、异常检测做出来了但没人天天喂数据给它们。**其实MES有API接口**——给程序用的数据取餐口。直接调用API3秒拿到数据。**学完这一篇你能做到**1. 用Python给API发请求拿到数据2. 解析JSON格式的数据3. 把数据存下来给其他分析工具用────────────────────────────────────────二、技术原理API就是程序之间的对话2.1 什么是API你可以把API理解成**自动售货机**- 你投币发请求→ 售货机吐出饮料返回数据- 你手里不用有人不需要登录网页- 24小时工作不用等上班时间# 最基础的API调用import requests# 发请求就像按售货机的按钮url http://mes-api.fab.local/api/lotsresponse requests.get(url)# 看结果售货机吐出了什么print(response.status_code) # 200 成功print(response.json()) # 返回的数据JSON格式就这两行用数据了。2.2 认识HTTP状态码API调用结果好不好先看状态码。记住这4个就够了| 代码 | 意思 | 怎么办 ||------|------|--------|| **200** | 成功 ✅ | 拿数据 || **401** | 没权限Token过期 | 重新登录获取Token || **404** | 地址错了 | 检查URL拼写 || **500** | MES服务器崩了 | 等一会儿再试 |2.3 JSON格式长什么样API返回的数据一般是JSON长得像Python的字典和列表# 假设API返回了这样的数据data {status: success,count: 3,data: [{lot_id: FAB-001, process: ETCH,thickness: 1250.5, yield: 96.5},{lot_id: FAB-002, process: ETCH,thickness: 1248.2, yield: 95.8},]}# 解析取data字段lots data[data]print(f拿到了 {len(lots)} 批数据)for lot in lots:print(f {lot[lot_id]}: 厚度{lot[thickness]}, 良率{lot[yield]}%)**JSON和Python字典的区别**基本一样。JSON是字符串response.json() 把它转成Python的字典/列表。────────────────────────────────────────三、实战案例三步写出你的API采集器3.1 第一步带Token的请求大多数MES的API需要认证最常见的方式是**Bearer Token**——相当于你的工牌import requests# 你的Token从MES IT同事那里拿TOKEN eyJhbGciOiJIUzI1NiIs... # 一串很长的字符串# 把Token放到请求头里headers {Authorization: fBearer {TOKEN},Content-Type: application/json}# 发请求url http://mes-api.fab.local/api/lotsresponse requests.get(url, headersheaders)if response.status_code 200:data response.json()print(f成功获取 {len(data.get(data, []))} 条数据)else:print(f请求失败: {response.status_code})print(f错误信息: {response.text})**为什么这样写** headers 是HTTP请求的附加信息Bearer Token放这里服务端读到Token就知道你是谁、有什么权限。response.text 是原始响应内容调试的时候打印出来最快找到问题。3.2 第二步传参数筛选数据API一般支持按日期、工站等条件筛选用 params 参数# 筛选特定日期和工序的数据params {date: 2026-01-15, # 日期范围process: ETCH, # 工站limit: 100 # 每页最多返回100条}response requests.get(url, headersheaders, paramsparams)data response.json()lots data.get(data, [])total data.get(total, 0)print(f查询条件: 日期{params[date]}, 工站{params[process]})print(f符合条件的数据: {total} 条, 本次返回: {len(lots)} 条)**为什么这样写** params 会自动拼接到URL后面变成 /api/lots?date2026-01-15processETCHlimit100。用字典管理参数比直接拼字符串更安全requests会自动处理特殊字符编码。3.3 第三步自动处理分页如果数据量大API不会一次全部返回。需要翻页def collect_all_lots(date, process, headers):采集指定日期和工序的全部Lot数据自动翻页参数:date: 日期字符串 YYYY-MM-DDprocess: 工序名 ETCHheaders: 请求头含Token返回:list: 所有Lot数据的列表base_url http://mes-api.fab.local/api/lotsall_lots []offset 0limit 100while True:# 请求一页params {date: date, process: process,limit: limit, offset: offset}response requests.get(base_url, headersheaders, paramsparams)if response.status_code ! 200:print(f第{offset//limit1}页请求失败: {response.status_code})breakdata response.json()page_lots data.get(data, [])total data.get(total, 0)# 把这一页的数据加入总列表all_lots.extend(page_lots)print(f第{offset//limit1}页: 获取 {len(page_lots)} 条, f累计 {len(all_lots)}/{total} 条)# 如果已经拿完所有数据退出循环offset limitif offset total:breakreturn all_lots# 使用headers {Authorization: fBearer {TOKEN}}lots collect_all_lots(2026-01-15, ETCH, headers)print(f共采集 {len(lots)} 批Lot数据)**为什么这样写** 用 while True offset 翻页是API采集的标准模式——每次请求一批用完 offset limit 后继续直到 offset total 停止。all_lots.extend(page_lots) 比 append 更高效因为 extend 直接把列表展开添加。我把整个逻辑封装成一个函数以后调用就一行 collect_all_lots(2026-01-15, ETCH, headers)不用重复写翻页逻辑。3.4 加上异常处理def safe_collect(date, process, token):安全的数据采集函数自动处理网络超时、认证失败、服务器错误永不崩溃——出错就打印日志返回已经采集到的数据headers {Authorization: fBearer {token}}all_lots []try:all_lots collect_all_lots(date, process, headers)except requests.exceptions.Timeout:print(⚠ 请求超时网络连接不稳定)except requests.exceptions.ConnectionError:print(⚠ 连接失败请检查网络或MES服务是否正常)except requests.exceptions.RequestException as e:print(f⚠ 请求异常: {e})# 即使出错了也返回已成功采集的部分print(f最终采集结果: {len(all_lots)} 条)return all_lots# 使用token YOUR_TOKEN_HEREdata safe_collect(2026-01-15, ETCH, token)# 可以用采集到的数据做其他事了if data:yields [lot.get(yield, 0) for lot in data]print(f最低良率: {min(yields):.1f}%, f最高良率: {max(yields):.1f}%, f平均良率: {sum(yields)/len(yields):.1f}%)**为什么这样写** try-except 包裹整个采集过程让程序不管遇到什么网络问题都不会崩溃。requests.exceptions 下有好几种异常类型区分捕获方便针对性处理。最关键的是——**出错不要只报错要返回已有的数据**。采集到99批哪怕第100批失败了99批也能用。────────────────────────────────────────四、效果对比| 对比维度 | 手动导出 | API采集 | 提升 ||---------|---------|--------|------|| 单次耗时 | 5分钟 | 1-3秒 | **100倍** || 每日操作 | 重复10次手动操作 | 跑一次脚本 | **全自动** || 数据完整性 | 容易忘记或漏选条件 | 固定参数、100%覆盖 | **零遗漏** || 出错处理 | 手动重新操作 | 自动重试异常处理 | **省心** || 后续扩展 | 再分析要重新导出 | 存了数据直接给分析工具用 | **一次采集多次使用** |────────────────────────────────────────五、自己动手# 练习这里有一个模拟的API不需要真的MESimport requests# 模拟API公开的测试接口url https://jsonplaceholder.typicode.com/posts# 练习1用GET请求获取数据# 练习2筛选出userId1的数据用params# 练习3把数据存到本地CSV文件# ✏️ 下面写你的代码**思考题**1. 如果API返回了500错误你的程序会不会崩溃if语句和try-except哪个更好2. 如果你每天要采集5个不同工序的数据怎么设计代码不重复3. 采集的数据怎么保存存CSV、JSON、还是SQLite────────────────────────────────────────六、常见误区| 问题 | 表现 | 解决方法 ||------|------|---------|| **忘了加Token** | 一直返回401 | 检查headers里有没有Authorization字段 || **URL末尾多了一个/或少了** | 返回404 | 跟API文档核对URL || **以为一次能拿完** | 只拿到100条 | 检查有没有分页参数limit/offset/cursor || **params传了列表** | requests参数编码异常 | 用 params{ids: [1,2,3]} 会自动处理 || **没做异常处理** | 网络波动直接崩溃 | 加try-except即使错也要有返回值 || **请求太频繁** | 被MES封IP | 每次请求之间加 time.sleep(1) 降速 |──────────────────────────────────────── **你们MES有API接口吗你对接时踩过什么坑评论区聊聊** **收藏点赞后面讲到数据清洗和预处理会用到这里采集的数据**

相关新闻

深入解析ColdFire硬件调试模块:从硬件断点原理到BDM通信实战

深入解析ColdFire硬件调试模块:从硬件断点原理到BDM通信实战

1. 项目概述与调试模块的价值 在嵌入式开发,尤其是涉及实时控制、电机驱动或复杂状态机的项目中,软件一旦跑飞或者出现偶发性数据错误,传统的“打印日志”或软件断点调试方式往往力不从心。打印日志会破坏代码执行时序,软件断点需…

2026/6/26 11:03:57阅读更多 →
ViGEmBus完全指南:5步掌握Windows虚拟游戏控制器驱动终极方案

ViGEmBus完全指南:5步掌握Windows虚拟游戏控制器驱动终极方案

ViGEmBus完全指南:5步掌握Windows虚拟游戏控制器驱动终极方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过心爱的游戏手柄无…

2026/6/26 11:03:57阅读更多 →
MPC8323E USB驱动开发:TxBD与TrBD描述符深度解析与实战

MPC8323E USB驱动开发:TxBD与TrBD描述符深度解析与实战

1. 项目概述:从寄存器手册到驱动实战如果你正在开发基于MPC8323E这类集成通信处理器的USB主机或设备端驱动,那么你肯定在手册里见过TxBD和TrBD这两个数据结构。它们通常出现在“USB控制器”章节的寄存器描述部分,以表格和位域图的形式呈现&am…

2026/6/26 10:58:55阅读更多 →
Vivante GPU性能调优实战:从数据采集到瓶颈定位

Vivante GPU性能调优实战:从数据采集到瓶颈定位

1. 项目概述:从“感觉卡顿”到“数据说话”的GPU性能调优之路在嵌入式图形应用开发里,最让人头疼的往往不是功能实现,而是性能问题。界面滑动不跟手、动画掉帧、复杂场景渲染卡顿……这些“感觉上”的卡顿,背后是CPU、GPU、内存、…

2026/6/26 12:19:39阅读更多 →
i.MX平台Vulkan与OpenCL实战:GPU配置、多GPU策略与性能调优

i.MX平台Vulkan与OpenCL实战:GPU配置、多GPU策略与性能调优

1. 项目概述与核心价值 在嵌入式开发领域,尤其是在像NXP i.MX系列这样资源受限但又对图形性能有高要求的平台上,如何高效地“压榨”GPU的每一分算力,是每个底层开发者都会面临的挑战。我接触过不少项目,从简单的UI界面到复杂的实时…

2026/6/26 12:19:39阅读更多 →
基于4G与LoRa的远程风速监测系统设计与优化

基于4G与LoRa的远程风速监测系统设计与优化

1. 项目概述 这个开源项目实现了一个基于4G和LoRa技术的远程风速监测系统,核心创新点在于将传统气象监测设备与物联网云平台无缝对接,并通过小程序提供便捷的数据访问入口。整套方案特别适合分布式环境监测场景,比如风力发电场、农业大棚群或…

2026/6/26 12:19:39阅读更多 →
2026眉山纸箱包装新趋势:环保与创新的完美结合

2026眉山纸箱包装新趋势:环保与创新的完美结合

随着环保意识的增强和技术创新的不断推进,眉山纸箱包装行业正迎来一个全新的发展阶段。在这个过程中,环保化、定制化、轻量化以及智能化成为推动行业发展的关键力量。以下是几个重要趋势的具体分析及实操建议。趋势一:从“通用纸箱”转向“定…

2026/6/26 12:19:39阅读更多 →
3PEAK思瑞浦 TPA132A1Q-SO1R-S SOP8 电流信号检测放大器

3PEAK思瑞浦 TPA132A1Q-SO1R-S SOP8 电流信号检测放大器

特性符合汽车应用AEC-Q100标准 – 等级1:-40C至125C环境温度增强型PWM抑制 – 工作电压:-4V至80V – 耐受电压:-10V至85V宽共模电压范围电源电压:3.0V至5.5V优异的共模抑制比 – 150dB直流共模抑制比 – 50kHz时115dB交流共模抑制…

2026/6/26 12:19:39阅读更多 →
ZigBee 3.0与NXP无线MCU实战:构建稳定低功耗物联网网络

ZigBee 3.0与NXP无线MCU实战:构建稳定低功耗物联网网络

1. 项目概述:为什么低功耗无线网络是物联网的基石在智能家居和工业物联网领域,我们常常面临一个核心矛盾:设备需要“永远在线”以响应指令,但又必须“极度省电”以维持数年的电池寿命或依赖微弱的能量采集。这个矛盾催生了以ZigBe…

2026/6/26 12:14:38阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →