Python 进阶:在 n8n 中使用 pandas/requests 等第三方 Python 库处理数据

2026-01-26 16 0

兄弟们,我是 N8N大学 的主编。今天咱们聊点硬核的。

Python 进阶:在 n8n 中使用 pandas/requests 等第三方 Python 库处理数据

很多玩 n8n 的朋友,走到一定阶段都会遇到一个坎:n8n 自带的节点虽然丰富,但处理复杂数据、或者调用一些冷门 API 时,总感觉力不从心。你想写个正则匹配复杂的文本,或者用 pandas 算个加权平均,原生节点能把你配置到怀疑人生。

这时候,如果能直接在 n8n 里写 Python 代码,调用 `pandas`、`requests` 这些神库,那自动化效率直接起飞。今天,笔者就带大家手把手打通这个“任督二脉”,让你在 n8n 里也能享受 Python 生态的红利。

1. 为什么你需要这个“外挂”?

先说说痛点。假设你有一份 Excel 表格,里面有几千行销售数据,需要按日期汇总、计算环比增长率,还要剔除异常值。用 n8n 的原生节点?你可能需要拼凑 5 到 10 个节点,逻辑绕来绕去,维护起来简直是噩梦。

而在 Python 里,这可能就是 10 行代码的事。引入 `pandas`,数据透视表一拉,清洗一下,搞定。或者你想请求一个 API,但它的认证逻辑极其复杂,原生的 HTTP Request 节点配置起来很麻烦,用 `requests` 库配合自定义逻辑,灵活性天差地别。

一句话总结:**n8n 负责流程的编排,Python 负责处理复杂的脏活累活。** 两者结合,才是真正的自动化王者。

2. 核心武器:Code Node

在 n8n 中实现这一切,不需要你部署复杂的 Python 环境,也不需要 Docker 镜像。n8n 已经内置了一个神器——Code Node

这个节点默认支持 JavaScript,但它是可扩展的。我们需要做的是引入 Python 解释器(Pyodide),让 n8n 能够“听懂” Python。

准备工作:

  • 一个 n8n 工作流(废话)。
  • 确保你的 n8n 版本不是太老(建议 1.0 以上)。

3. 实战演练:调用 Pandas 处理数据

笔者带大家做一个真实的场景:接收一组 JSON 数据(模拟订单),使用 pandas 进行数据清洗和聚合。

步骤一:准备数据源

我们在工作流中先添加一个 Set 节点(或者叫 Manual Trigger),模拟输入以下 JSON 数据:

[
  {"product": "iPhone", "price": 6000, "date": "2023-10-01"},
  {"product": "iPhone", "price": 5800, "date": "2023-10-02"},
  {"product": "MacBook", "price": 12000, "date": "2023-10-01"},
  {"product": "iPad", "price": null, "date": "2023-10-03"}
]

步骤二:添加 Code Node

在数据源后面添加一个 Code 节点。关键点来了,点击 Code Node 右上角的 “Add Parameter”,选择 “Type: Python”。这一步是核心,它会把运行环境切换到 Python 模式。

步骤三:编写 Python 代码

在代码框中输入以下内容。注意,n8n 通过 `n8n` 这个内置对象来交换数据:

import pandas as pd

# 1. 获取 n8n 输入数据
# n8n.inputs.Item() 会返回工作流上游传来的所有数据
input_data = list(n8n.inputs.Item())

# 2. 使用 pandas 处理数据
# 将输入数据转换为 DataFrame
df = pd.DataFrame(input_data)

# 价格为 null 的填充为 0
df['price'] = df['price'].fillna(0)

# 按产品聚合,计算总价
result_df = df.groupby('product')['price'].sum().reset_index()

# 3. 将结果传回 n8n
# 必须将 DataFrame 转换为字典列表
result_data = result_df.to_dict('records')

# 逐条输出,n8n 会自动处理
for item in result_data:
    n8n.outputs.Item(item)

运行一下,你会发现输出的数据已经被完美清洗并聚合了。这就是 pandas 的威力!

4. 进阶实战:使用 Requests 发送异步请求

再来看一个场景:处理一批数据,每一条数据都需要调用一次外部 API 获取补充信息。如果用 HTTP Request 节点配合循环,配置起来很繁琐。用 Python 的 `requests` 库就简单多了。

同样是在 Code Node 中,切换到 Python 类型:

import requests

# 获取上游数据
items = list(n8n.inputs.Item())

for item in items:
    # 假设 item 里有一个 id 字段
    api_url = f"https://api.example.com/users/{item['id']}"
    
    try:
        response = requests.get(api_url)
        if response.status_code == 200:
            # 将 API 返回的数据合并到原数据中
            item['extra_info'] = response.json()
            n8n.outputs.Item(item)
    except Exception as e:
        # 错误处理,不要让整个流程挂掉
        print(f"Error fetching {item['id']}: {e}")
        n8n.outputs.Item(item) # 保持数据流转

注意: 在 n8n 的 Code Node 中运行 `requests`,底层是通过 Pyodide 转译的。对于非常复杂的 HTTPS 证书校验或者某些特殊的网络协议,可能会有兼容性问题。但在 99% 的 RESTful API 调用场景下,它是好用的。

5. 避坑指南:新手必看

在 N8N大学的社群里,关于 Code Node 的报问每天都有。这里总结两个最大的坑:

坑点一:Python 版本与库的支持

n8n 使用的是 Pyodide(WebAssembly 版本的 Python),它不是你电脑上那个完整的 CPython。这意味着你不能使用 `pip install` 随意安装任何库。目前支持的库主要是 numpy, pandas, requests, pyodide 等核心库。如果你需要冷门库,可能需要自己打包或者寻找替代方案。

坑点二:数据类型的隐式转换

Python 和 JavaScript 的数据类型处理有细微差别。比如 Python 的 `None` 传回 n8n 时,有时会被识别为 `null`,有时可能会引起类型错误。建议在 Python 代码的最后,显式地将数据转换为标准的 JSON 格式(字典、列表、字符串、数字),确保 n8n 能正确解析。

6. FAQ 问答

Q1: 在 n8n 里写 Python 代码,是免费的吗?
A: 是的。只要是使用 n8n 官方的 Code Node,不涉及额外的 Docker 镜像构建,都是免费的。但如果你要运行极其消耗资源的 Python 脚本,可能需要考虑 n8n 的执行资源是否足够。

Q2: 为什么我 import numpy 报错?
A: Pyodide 环境需要加载对应的 Module。第一次使用 numpy 或 pandas 时,n8n 可能会在后台下载几 MB 的 WASM 文件,请保持网络通畅。如果还是报错,检查你的 n8n 版本是否支持该库。

Q3: 处理大量数据时效率如何?

A: 对于成千上万行的数据,Pandas 在 Pyodide 中的性能肯定不如在本地服务器运行的原生 Python。但相比在 n8n 节点里拖拖拽拽,效率依然高出几个数量级。如果数据量达到百万级,建议还是通过 Webhook 调用外部 Python 服务处理。

7. 总结与资源

在 n8n 中使用 Python,是把低代码的“快”和代码的“强”结合在了一起。不要把 n8n 当作一个只能点点鼠标的玩具,把它当作一个容器,装入你的逻辑和代码,它就能变成真正的生产力工具。

推荐阅读:

  • n8n 官方 Code Node 文档:了解最新的 API 变动
  • Pyodide 官方文档:查看支持的 Python 库列表

我是 N8N大学 的主编,希望这篇教程能帮你解决数据处理的难题。如果卡住了,随时回来翻翻。

相关文章

安全加固:限制 n8n Code 节点访问文件系统与内网 IP (Sandbox 配置)
超越 SQLite:为什么生产环境必须连接 PostgreSQL 以及如何配置?
元数据获取:使用 $workflow.id 和 $execution.id 生成带追踪参数的回调链接
高并发架构:配置 Redis + n8n Worker 模式实现分布式任务处理
解决 OOM 崩溃:优化 n8n 大数据量处理时的内存占用 (Memory Leak) 技巧
多入口触发:如何让一个工作流同时支持 GET/POST 甚至多个不同路径的 Webhook?

发布评论