低代码 + AI 驱动:基于 n8n 与 Crawl4AI 的高效自动化爬虫工作流构建(Docker版)
n8n 是一款开源、可视化的自动化工作流引擎,支持低代码方式集成数百种常见服务和应用。用户可以通过拖拽节点的方式快速搭建数据处理、通知推送、系统集成、自动化运维等场景的流程,无需深入编写后端代码。n8n 支持高度的自定义扩展,既适合个人高效自动化,也能满足企业复杂的数据流转与自动化需求。
Crawl4AI 则是一款面向开发者与数据工程师的智能爬虫平台,内置 AI 能力,简化了网页数据采集、结构化提取和自动识别等繁琐环节。通过简单配置或 API 接口,用户即可快速实现大规模网页抓取、动态页面解析等功能,大幅提升数据采集效率。Crawl4AI 既适合自动化集成场景,也适用于需要高质量数据采集的企业级项目。
附上两款工具的github链接:
截至写稿时间(25.06.04)两款工具在github上分别收获了 103K和44.9K的⭐。是两款非常强大的现代化工具。
这篇稿子从0开始手把手教会使用这两款工具创建一个工作流帮我们自动来进行一些爬虫任务。
一. docker安装镜像(images)
# 分别安装n8n和Crawl4ai的docker镜像
docker pull docker.n8n.io/n8nio/n8n
docker pull unclecode/crawl4ai:all-amd64
# 注意“all-amd64”是镜像的标签 需要根据自己的电脑芯片选择适合的版本(因为我的电脑是amd64架构,所以选择all-amd64)
# https://hub.docker.com/r/unclecode/crawl4ai/tags 这个链接可以查看不同的版本
该处两条命令是使用docker安装两款工具的镜像,安装完后运行docker image ls 会看到以下两个镜像就是成功。
二.为镜像构建一个容器(container)
新建一个文件 docker-compose.txt
version: "3.8" # docker compose版本
services:
n8n: # 需要启动的服务
image: docker.n8n.io/n8nio/n8n # 第一步下载好的镜像
container_name: n8n # 容器的名称
ports:
- "5678:5678" # 映射的本地端口 如果本地5678端口被占用了可以更改为 5679:5678
volumes:
- D:\workstation\02.work_space\n8n\n8n_data:/home/node/.n8n # 挂载到本地的磁盘卷 做一个映射
environment:
- TZ=Asia/Shanghai # 环境变量
restart: unless-stopped
networks: # 确保两个服务在同一个网络下
- mynetwork
crawl4ai:
image: unclecode/crawl4ai:all-amd64
container_name: crawl4ai
environment:
- CRAWL4AI_API_TOKEN=test
ports:
- "11235:11235"
restart: unless-stopped
networks:
- mynetwork
networks:
mynetwork: # 需要启动的网络
driver: bridge
然后重命名为 docker-compose.yml
在这个文件的同级目录打开cmd,运行:
docker-compose up -d
出现这个界面即是成功。
如果想查看容器内服务的运行日志则可以运行:
docker-compose logs -f n8n
结束服务运行:
docker-compose down
注意
这些命令都需要在docker-compose.yml同级目录的cmd下运行。
浏览器输入:localhost:11235
localhost:5678
分别是上面的界面则代表成功。
三.n8n开始构建工作流
工作流整体流程如下:
用户输入网页的sitemap
-> 请求到网站及所有子页面的url -> 将子页面的url传给crawl4ai创建任务 -> 等待crawl4ai完成爬虫任务 -> 将获取到的网页内容传给AI agent分析后返回markdown数据 -> 将返回的数据写入磁盘
3.1 聊天框触发器(chat trigger)
这里需要一个聊天的入口用于获取用户想要爬取的网站的内容sitemap
3.2 请求(http request)
这里以crawl4ai的官方网站为例子:docs.crawl4ai.com/sitemap.xml
sitemap.xml是网站作者给网站做的一个导航,分别列出了该页面及其子页面的url。该处列出的url一般不会违法爬虫协议。
爬虫前请查看爬虫协议,请遵循爬虫协议,合法合规爬虫。
爬虫协议一般位于网页根目录下的robots.txt
将chatinput
拖到URL处点击execute step
可以测试是否成功。
3.3 xml转换成json(XML)
3.4 分割(split out)
将左边的url
拖到fields to split out
点击 execute step
。后续都是该流程,点击测试这步后续会省略。
3.5 限制(limit)
由于该网页下有52个url 测试阶段可以不爬这么多,限制每次只爬一条。
3.6 循环节点(loop over item)
由于我们在3.5做了一个限制,但是其实一个网站肯定是不止1个url这么简单,所有后续我们放开限制后会有多条url,这里需要添加一个循环来处理多个url的请求情况。
到这一步,整体的工作流长这样。
3.7 请求(http request)
将replace me
替换成一个http request
,这个http用于将爬虫任务交给crawl4ai生成任务,由工具帮我们进行爬虫任务。
可以打开http://localhost:11235 查看具体的用法,该处列举在docker环境下调用api生成爬虫任务。
根据文档可以得知这里发送的是post请求,请求头是我们启动docker容器的时候设置的一个api_token,需要带过去的参数有urls
priority
这两个,其中urls是我们需要爬取的网页的地址,priority取默认的10即可。
所以这里的请求选择post
,URL直接填写为http://crawl4ai:11235/crawl即可,由于之前启动容器的时候设置了两个服务的网络处于同一个网络下,所以这里直接用容器的名称代替localhost,如果没有设置同一个网段需要用`host.docker.internal`代替localhost,直接使用localhost是不能访问到启动的服务的,因为服务是启动在docker容器中。
然后选择一个请求头验证(header Auth),填入对应的值。
最后选择发送请求体(send body),测试即可,如图生成了一个task_id即为成功。
3.8 等待(wait)
该处需要一个等待时间,防止请求频率过快请求网站得不到数据。
3.9 请求(http request)
根据任务ID执行任务获取爬虫的数据。
文档如下:
url按照文档填写,将localhost替换成crawl4ai,仍然是一个header验证。测试如果能成功,则返回了像右边的数据。最终会将所有的html文档获取回来。
3.10 判断(if)
判断任务是否执行成功,成功则进行下一步,失败则重试。
3.11 处理失败的情况
添加一个set节点,然后添加一个task_id
字段,将原本的task_id值填入,返回wait
之前即可重新执行任务。
3.12 AI agent
添加一个ai agent,让ai帮我们提取内容,生成文档。
Chat Model
这里的大模型是必选,其他有条件可以添加如数据库,MCP服务器等。
这里我们选择deep seek的api服务。
填入api_key后,会自动测试是否成功,有 test successfully则是成功。
最后返回画布,双击AI Agent
编写我们的提示词。这里简单写一下提示词,左边有ai工具帮我们整理好的数据,有原生html,有清洗好的cleaned_html,有图片有音频,有链接,我们将cleaned_html拖到提示词中即可。测试后等待api返回内容给我们
3.13 内容写入文件(convert to file)
添加一个convert to file
节点,将内容写入文件,operation选择convert to text file,写入为文本文件,将Agent返回的output拖到input field中,然后指定一下文件名称和编码,这里我们都使用之前生成的task_id作为名称,具有唯一性。如果采集的内容有中文,要指定一下gbk
编码。
3.14 文件写入磁盘(write file to disk)
在写入磁盘之前还要进入容器中创建一个data文件夹。如果不想创建这步可以省略,后面的路径也要相应改变一下。
docker exec -it n8n # 进入容器内部
mkdir data # 创建data目录
chmod -R 777 ./data # 修改目录权限
ls -l # 查看目录详情
我们需要把文件的路径指定为这个./data/xxxx.md
(个人习惯数据都放在data目录下,文件也是markdown格式。),然后文件名字和字段同样指定为之前的task_id,防止重名。
接下来我们就可以去容器内查看是否成功写入了文件。
cd data # 进入data目录
ls # 查看当前目录下的文件
可以发现已经成功写入了。
3.15 复制文件
由于我们启动容器的时候挂载的路径是D:\workstation\02.work_space\n8n\n8n_data -> /home/node/.n8n,是将本地的D:\workstation\02.work_space\n8n\n8n_data映射到容器中的/home/node/.n8n,所以如果我们想要在本地环境即宿主机(Windows/Linux/Mac)看到文件,还需要将data目录下的文件复制到/home/node/.n8n下面。
添加一个execute command节点,执行复制文件的命令,同样需要在/home/node/.n8n下创建一个data文件夹。
cp ./data/* ./.n8n/data
运行完成后到宿主机查看结果:
可以发现已经成功将文件写到宿主机的磁盘中了。
有的同学会疑问,为什么不直接写到挂载的目录。因为我的是windows11环境,直接写会报一个权限错误,是docker的一个安全策略引起的。所以新建了一个目录做中转站。
最后整体工作流的内容如下:
后续要使用就在limit节点处放开限制即可。