自动化不想再堆脚本?用 n8n 把 AI、网页抓取和远程触发串成工作流
前言
我对自动化最怕的一件事,不是任务多,而是脚本越写越散:一个负责抓数据,一个负责发通知,另一个再处理接口,半年后连自己都要先翻目录才能想起它们怎么串起来。n8n 吸引我的地方,正是把这些原本藏在脚本里的执行关系直接摆到画布上,用节点把触发、处理和输出连起来。它不是为了让人彻底告别代码,而是把能标准化的部分先交给节点,需要自定义时再补代码,这种方式对我更顺手。
这次我先从最基础的本地部署开始:准备 Docker,启动 n8nio/n8n:latest,确认 5678 页面能访问;然后真正搭两条流程,一条接入 DeepSeek 做 AI 对话,一条用 HTTP Request 和 HTML 节点抓取网页内容。每条流程都不是“配置完就算成功”,而是要实际执行,看节点有没有正常返回结果。等本地流程都能跑通,再通过 cpolar 把 5678 映射到公网,并换成固定二级子域名 n8n。这样以后再接 Webhook、数据库、通知平台或更多 AI 节点时,扩展的是一条已经看得见、能测试的工作流,而不是继续往目录里堆新的孤立脚本。

1. n8n 的价值,不是“不写代码”,而是把流程关系摆出来
n8n 是一款开源、可自托管、低代码的自动化工作流工具。它通过节点把触发器、应用、数据库、Webhook 和自定义逻辑连接起来,让一条自动化流程不再只存在于几份脚本和注释里。
这类工具最适合几种场景:
- 表单提交后写入数据库,再发送通知;
- 监控状态变化后触发告警;
- 在不同系统之间同步数据;
- 把 AI 模型接进现有工作流;
- 接收 Webhook 后继续执行后续节点;
- 在可视化画布里组合 HTTP、HTML、数据库和代码节点。
它同样支持自定义代码,所以“低代码”并不等于“不能写代码”。更准确地说,是能用现成节点解决的部分就直接连接,需要自定义时再补代码。
2. 先把 Docker 环境准备好
这次使用 CentOS 环境部署。
2.1 如果有旧版 Docker,先执行卸载
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

2.2 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

2.3 添加 Docker 软件源
yum-config-manager –add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.4 安装并启动 Docker
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker # 开机自启
docker –version # 显示版本即成功

这一步同时完成 Docker 安装、启动、开机自启和版本检查。
2.5 配置镜像源
创建 /etc/docker/daemon.json,写入:
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech"
]
}
2.6 重新加载并重启 Docker
systemctl daemon-reload
systemctl restart docker

到这里,Docker 这一层先确认正常,再继续拉 n8n 镜像。
3. 部署 n8n
3.1 拉取镜像
先手动拉取最新镜像,方便直接看到下载进度:
docker pull n8nio/n8n:latest

3.2 创建数据目录
mkdir -p ~/.n8n
chmod -R 777 ~/.n8n # 赋予读写权限

这里把 ~/.n8n 挂载到容器里的 /home/node/.n8n,避免容器删除以后配置和数据一起丢掉。
3.3 启动 n8n 容器
这次使用的启动命令是:
docker run -d –name n8n -p 5678:5678 -v ~/.n8n:/home/node/.n8n -e N8N_BASIC_AUTH_ACTIVE=true -e N8N_BASIC_AUTH_USER=admin -e N8N_BASIC_AUTH_PASSWORD=root@1234 -e TZ=Asia/Shanghai -e N8N_COOKIE_SECURE=false -e N8N_SECURE_COOKIE=false –restart always n8nio/n8n:latest
几个关键参数包括:
- 容器名:n8n
- 端口:5678:5678
- 数据目录:~/.n8n:/home/node/.n8n
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=root@1234
- TZ=Asia/Shanghai
- N8N_COOKIE_SECURE=false
- N8N_SECURE_COOKIE=false
- –restart always
- 镜像:n8nio/n8n:latest

启动后检查容器:
docker ps | grep n8n

然后访问:
http://服务器IP:5678

页面能打开,说明 n8n 的本地 Web 服务已经正常运行。
4. 完成 n8n 初始化
第一次进入时,根据页面填写邮箱、用户名和密码。

登录以后继续填写基础信息。

随后页面提供永久免费密钥获取入口。

进入 settings,在 Usage and plan 中添加获取到的密钥。


完成以后,就可以开始真正搭工作流。
5. 第一条工作流:把 DeepSeek 接进 n8n
我不太喜欢部署完就停在首页,所以第一条流程直接用 AI 对话做验证。
先准备 DeepSeek API Key:登录 DeepSeek 开放平台,在 API 密钥页面创建新的密钥,并在创建后及时保存。
新建工作流在n8n仪表板点击"Create Workflow",添加作为触发器节点:
在 n8n 仪表板点击 Create Workflow。

添加触发器节点。

继续完成触发器配置。

然后在触发器后面添加 AI Agent。

接着配置 AI 模型。



选择 DeepSeek,并填入 API Key。
选择deepseek,填入密钥:


回到工作流画布,打开聊天窗口进行测试。

发送一条消息。

能收到有效回复以后,这条链路才算真正成立:
触发器 → AI Agent → DeepSeek → 返回结果。
对我来说,这比“API Key 保存成功”更重要,因为最终要验证的是工作流真的跑了一遍。
6. 第二条工作流:抓取网页内容
第二个例子换一种思路,不再只和 AI 对话,而是让 n8n 处理网页请求。
新建工作流。

添加触发节点。

继续按页面完成触发器配置。

接着进入节点选择。

搜索 http 并添加 HTTP Request 节点。

把 HTTP 请求节点连接到触发节点,请求方法设置为 GET,目标网址按教程填写:
https://scrapeme.live/shop/

随后添加 HTML 节点,并选择“提取 HTML 内容”。


回到主界面点击执行工作流。

执行成功后,节点会显示为成功状态;如果出现错误,再按节点参数和目标网页结构逐步检查。
这一条流程展示的是另一类自动化:
触发器 → HTTP 请求 → HTML 内容提取。
它和上一条 AI 对话放在一起,正好能看出 n8n 的核心并不是某一个具体功能,而是把不同类型的节点按流程连接起来。
7. 为什么本地工作流还需要公网入口?
只在浏览器里手动打开 n8n 时,本地 5678 已经够用。
但自动化真正开始和外部系统连接以后,Webhook、远程触发、异地管理这类场景都会遇到同一个问题:外部服务需要一个能够访问到 n8n 的公网入口。
这时候再加 cpolar,职责会比较清楚:
n8n 负责编排工作流,cpolar 只负责把本地 5678 Web 服务映射到公网。
这样网络入口和自动化逻辑不会混在一起。
8. 安装 cpolar
执行:
sudo curl https://get.cpolar.sh | sh

安装完成后检查服务:
sudo systemctl status cpolar

通过主机 IP + 9200 访问 cpolar Web UI。

登录以后开始创建 n8n 隧道。
9. 先用随机域名验证 5678
进入【隧道管理 → 创建隧道】,配置为:
- 隧道名称:n8n
- 协议:http
- 本地地址:5678
- 域名类型:随机域名
- 地区:China Top

创建完成后,到在线隧道列表查看公网地址。

从其他设备访问。

页面能够正常打开,说明:
本地 n8n 5678 → cpolar 随机公网地址
这条访问链已经跑通。
10. 长期使用,再配置固定二级子域名
随机地址适合测试,但如果后面要持续使用远程入口或配置外部触发,地址长期不变会更方便。
进入预留功能。

地区选择:
china Top
这次保留的二级子域名是:
n8n

然后回到【隧道管理 → 隧道列表】,找到对应隧道并编辑。

修改为:
- 域名类型:二级子域名
- Sub Domain:填写已经保留的名称
- 地区:China Top
点击更新。

更新以后,在线隧道列表里的地址会切换为固定二级子域名。

最后再通过固定地址访问。

页面可以正常打开。
总结
真正让我觉得 n8n 比“再写一个脚本”更顺手的地方,是自动化的结构终于能直接看见了:触发器在哪里、下一步调哪个节点、数据往哪流、哪一步失败,都能顺着画布查。
这次实际跑通的链路包括:
CentOS → Docker → n8nio/n8n:latest → 5678 → 初始化 → DeepSeek AI 工作流 → HTTP Request + HTML 抓取工作流 → cpolar → 随机公网地址 → 固定二级子域名 n8n。
关键配置也都落到了具体位置:
- Docker 安装与镜像源;
- ~/.n8n:/home/node/.n8n
- 5678:5678
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=root@1234
- TZ=Asia/Shanghai
- N8N_COOKIE_SECURE=false
- N8N_SECURE_COOKIE=false
- –restart always
- AI Agent
- DeepSeek API Key
- HTTP Request
- GET
- HTML 内容提取
- cpolar 9200
- 隧道名 n8n
- 本地地址 5678
- China Top
- 固定二级子域名 n8n
自动化并不会因为换成可视化工具就自动变简单,但它至少把原本散落在脚本、接口和定时任务里的关系收到了同一个工作流里。后面再接数据库、Webhook、通知平台或更多 AI 节点时,扩展的是已有流程,而不是继续往目录里堆新的孤立脚本。





