ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

maxun:开源无代码爬虫机器人,录制操作即可自动抓取网页数据

maxun:开源无代码爬虫机器人,录制操作即可自动抓取网页数据 做爬虫这几年我接过不少需求查竞品价格、抓商品评论、收集行业名录……每次都是先写Python脚本再处理IP封禁和页面改版一套下来累得够呛。所以第一次看到maxun这个开源项目时我第一反应是总算有个能替我“跑腿”的东西了。maxun是一个开源的、无需写代码的网页数据抓取工具官方管它叫“爬虫机器人”。它的核心玩法很有意思你在浏览器里像正常上网一样操作一遍网页它把你点击、输入、滚动、选中数据这些动作全部录下来然后自动生成一个可以重复执行的抓取流程。你把这个流程保存成一个“机器人”之后每次运行它都会自动打开目标网页、执行你录过的操作、提取你指定的字段最后把结果放到控制台或者导出成文件。这篇文章适合两类人看。一类是运营、产品、市场这些业务侧的同学不想写代码但需要定时采集公开网页数据另一类是开发同学想快速给团队搭一套自托管的抓取工具又不想每次需求都从头写脚本。我按“它是什么—架构怎么设计—怎么部署—怎么上手—踩过哪些坑—值不值得用”这个顺序把这套东西完完整整讲一遍。1. maxun定位梳理先搞清楚它到底解决什么问题1.1 从“手工复制粘贴”到“录制式抓取”先说个最简单的场景。很多运营同学每天早上需要打开几个行业网站把新增的供求信息、价格更新、竞品动态一条条复制到Excel表格里。这件事本身不复杂但很耗时间还容易漏。python爬虫确实能解放这部分人力但让业务同学维护一套Python脚本也不现实。maxun切入的就是这个中间地带它不需要写代码用“录屏圈选”的方式就能把人工操作变成自动化流程。你只需要在maxun的录制器里把平时做的事做一遍打开网页、输入关键词、点击搜索、滚动翻页、选中结果标题和价格然后点保存。整个过程类似Excel里的“宏录制”——你操作一次系统记下流程之后让机器人按这个流程反复执行。这对完全不懂编程的人来说几乎是零学习成本。1.2 和传统爬虫方案相比优势在哪我做了个对比表覆盖我落地项目时最常比较的三个维度上手门槛、部署成本、长期维护。对比维度maxun自托管Python Scrapy等框架商业SaaS抓取服务上手门槛无代码录制即用需要Python/MongoDB/中间件等基础低但配置灵活度受限部署成本一台服务器免费开源开发调试成本高按条数/套餐付费可扩展性worker可横向扩容最灵活可做分布式受平台功能限制适合数据量中小规模单页到几千条中大规模中小规模为主页面改版后重新录制/圈选字段即可需要改代码并回归平台可能需重新配置数据归属完全在自己服务器上完全在自己服务器上在第三方平台maxun最明显的短板是它不适合搞百万级分布式抓取。它的定位是“轻量、够用、能自助”解决的是业务侧最常见的那种需求定时采集公开数据、量不大、要稳定。你要真想抓全网的公开数据那还是老老实实上scrapy或自研分布式采集系统这不是一个赛道的东西。1.3 这些需求才是它的主战场结合我用过的实际情况maxun最典型的使用场景有这么几类电商价格监控盯竞品商品的价格变化每天记录一次用于后续调价策略或周报。公开名录/黄页整理从行业信息网站抓企业名称、联系方式、地区等公开字段。招聘信息汇总抓取职位列表、薪资区间做简单的行业薪酬分析。资讯归档定时抓取新闻或公告标题、链接存下来做内容盘点。上游供应链行情原料价格、汇率牌价这类公开数据定期落库。这些需求有个共同点数据都在公开页面上不需要破解什么登录墙量级也就是几百到几千条但要求“每天定时跑、稳定不挂”。maxun正好踩在这个需求点上这也是它在开源社区里火起来的原因。2. 架构拆解一个爬虫机器人任务是怎么跑通的2.1 前端控制台所有操作的入口maxun的前端是一个基于ReactNext.js的单页应用部署后默认跑在5173端口。你在浏览器里打开它就能看到控制台登录注册、创建机器人、管理运行记录、查看提取结果、配置定时调度全部都在这里完成。它和后端之间走的是REST API所以前端本身不碰数据库也不碰抓取逻辑纯粹是“操作台”。2.2 后端服务管账号、管配置、管调度后端是NestJS写的Node.js服务默认跑在8080端口。它主要负责四件事第一用户认证和权限管理第二机器人配置的存取包括你录制的每一步操作step和每个提取字段extraction第三调度管理定时任务靠它触发第四任务转发把用户手点“运行”或定时触发的任务投递到消息队列里等worker来消费。后端本身不开启浏览器也不执行抓取动作所以它的CPU和内存压力很小。这也解释了为什么单独拆一个后端服务出来——把“管任务”和“干活”分开资源占用大头留给worker。2.3 worker执行器真正打开浏览器干活的人worker是整套系统里最核心的“劳动力”。它监听Redis队列拿到一个待执行任务后就启动Puppeteer拉起一个Chromium实例然后按照录制时的步骤一步步回放打开URL、等待元素出现、点击、输入、滚动、提取数据最后把结果往回传。这个组件的设计要点是“无状态”。它不保存任何用户状态只负责执行任务。这意味着想加快抓取速度直接多起几个worker实例就行后端和前端都不用动。这也是我推荐用Docker部署的原因之一——docker compose里把worker的replicas调大扩容非常方便。2.4 存储与队列数据落在哪maxun的存储分两块。关系型数据库不同版本可能用PostgreSQL或MariaDB具体以你拉的镜像为准负责存三类东西用户账号、机器人配置操作步骤和字段定义、运行结果。Redis负责做任务队列后端把任务push进去worker从里面pop出来执行。这里有个容易踩的坑运行结果是存在数据库里的如果机器人每天都跑数据会持续累积。量小的时候无所谓跑几个月后你会发现数据库体积明显变大。建议定期导出结果后清理历史运行记录给数据库留出余地。2.5 一次完整任务的数据流帮你在脑子里过一遍全流程理解了这个后面排查问题会顺很多用户在控制台点“运行”或者到了定时任务设定的时间。后端创建一条运行记录把任务投递到Redis队列。worker从队列取出任务启动Chromium实例。worker按录制步骤逐条执行期间做元素等待、交互、字段提取。worker把提取结果回传给后端后端写入数据库。控制台刷新显示运行状态和结果详情用户可以导出。之所以把流程拆这么清楚是因为“定时任务不执行”或者“跑出来是空的”这类问题基本都是这一步或那一步断了。排查的时候先看队列里有没有任务堆积再看worker日志有没有报错基本就能定位。这个思路放到任何爬虫系统里都通用。3. 部署实操手把手把maxun跑起来3.1 部署前的资源准备先说服务器。maxun本身是Node.js服务CPU要求不高但内存要注意。原因在于抓取时每个Chromium实例大概要占300到500MB内存如果机器人同时跑三四个任务占用就奔着2G去了。我建议最低配2核4G再低的话worker很容易被系统杀掉表现为“任务一直pending但不执行”。操作系统用主流的Ubuntu 22.04或Debian就行。前提是装好Docker版本要求20.10以上以及Docker Compose v2。你可以用下面的命令确认docker --version docker compose version如果还没装可以参考Docker官方文档在Ubuntu上通过apt安装docker-ce和docker-compose-plugin。3.2 克隆代码并一键启动maxun官方提供了完整的docker-compose编排部署过程比我想象中还要省事。核心就三条命令git clone https://github.com/getmaxun/maxun.git cd maxun docker compose up -d第一次执行时Docker会自动构建镜像视网络情况可能要等几分钟。构建完成后整个编排会拉起这几个容器前端frontend、后端backend、worker、数据库db、队列queue。具体服务名以你clone到的docker-compose.yml里定义为准版本不同可能略有差异但大结构是一致的。3.3 验证服务状态启动后用以下命令看容器状态docker compose ps正常情况下所有服务都应该是Up状态。然后打开浏览器访问http://你的服务器IP:5173能看到maxun的控制台首页就说明前端起来了。后端接口在http://你的服务器IP:8080页面会返回一个健康检查相关的响应。这一步如果发现容器反复重启先看日志docker compose logs -f backend docker compose logs -f worker最常见的启动失败原因是端口被占用或者数据库/队列的连接配置没对上。检查一下有没有其他进程占着5173和8080以及.env文件里的环境变量是否和docker-compose里的一致。3.4 初始化账号与安全基线部署之后第一件事是注册一个管理员账号。maxun没有强制初始密码直接打开页面注册第一个用户这个用户会成为系统里的第一个账号。这里提醒两点一是如果服务器暴露在公网建议注册后立刻改掉默认端口或者用Nginx做反向代理把5173和8080都藏在域名后面并启用HTTPS二是数据库和Redis尽量不要暴露到外网Docker网络内部互通就够了。3.5 生产环境建议内存限制与数据备份自托管服务最怕半夜悄无声息挂掉。我自己的做法是给worker加上内存限制避免它把整台服务器拖垮# docker-compose.yml 中worker服务的部分 worker: mem_limit: 1500m数据库备份也一样我用一个定时任务每天凌晨dump一次PostgreSQL或MariaDB的数据。对备份文件保留最近7天就够这是“最少必要备份”的思路。3.6 非Docker方式跑开发环境如果你想在本地改代码或者调试可以不走Docker直接起三个进程后端、前端、worker。这种模式需要自己安装Node.js、PostgreSQL、Redis并分别配置数据库连接和队列连接的环境变量。本地开发流程我在跑Puppeteer相关项目时踩过不少坑建议尽量用Docker跑依赖数据库和Redis只在宿主机起前端和后端免得本地环境一团乱麻。4. 上手实操录一个“竞品价格监控机器人”4.1 新建机器人从起始URL开始部署好后端到前端登录控制台点击右上角的“新建机器人”输入你想抓取页面的起始URL。这一步相当于告诉机器人“从哪开始干活”。我建议起始页选一个稳定的列表页或搜索页而不是直接选一个详情页因为列表页往往能提取多条数据效率更高。4.2 录制操作把人工流程变成步骤进入录制器后会打开一个可交互的预览浏览器。你在这个预览窗口里做的每一步操作都会被实时记录到左侧的步骤列表里。常用的动作有点击、输入文本、滚动、等待一段时间。这里有一个我吃了不少亏的经验录制时不要用“绝对坐标点击”而是尽量点击稳定的元素比如按钮的文案、图片的alt属性。因为页面滚动后坐标会变而元素本身的位置是相对稳定的。比如搜索按钮最好通过按钮上的文字“搜索”来定位而不是记它在屏幕第几行第几列。录制过程中尽量保持操作简单。一个机器人只做一件事比如“搜索关键词并提取第一页结果”。不要试图在一个机器人里把搜索、翻页、点详情、回退全部录完步骤越多回放失败的概率越高。4.3 圈选字段告诉机器人你要什么数据操作录完以后最关键的一步是定义提取字段。在预览浏览器里你可以把鼠标移到页面元素上选中要提取的内容然后给它起一个字段名。比如标题、价格、链接、图片地址。对于列表型页面比如搜索结果maxun支持循环提取多个条目。你可以选中第一条记录的“标题”它会智能地把同类元素都识别出来这样一次运行就能抓取整个列表的数据。字段名建议用英文或拼音导出CSV时列名更干净后续做数据分析也方便。4.4 运行与调度单次跑通再上定时保存机器人之后先不要急着配置定时任务。我的习惯是先在控制台点“运行”按钮手动触发一次等结果出来了检查字段是否对得上。尤其是价格这种数字字段经常会有“¥ 1,299.00”这种带货币符号和千分位逗号的格式要确认提取后的数据是否清洗到位。确认单次运行没问题后再配置调度。maxun支持用cron表达式设置运行时间比如每天早上9点跑一次0 9 * * *如果你的服务器时区不是UTC记得先确认cron的时区设置否则可能出现“明明定的早上9点结果下午4点才跑”的尴尬情况。4.5 数据导出与对接运行结果可以在控制台查看也可以一键导出为CSV或JSON。如果你有自己的数据系统还可以通过Webhook把结果推送到自己的接口实现自动化对接。我在实际项目里就是让maxun每天早上抓完数据通过Webhook推到我们的内部数据库再触发下游的报表计算整个过程不用人盯。5. 常见问题与排查技巧实录5.1 录制时元素点不中或选不中这是入手maxun时被问得最多的一个问题。大部分原因是目标页面用了动态加载或者元素被弹窗、浮层遮挡。解决办法是在录制时给“点击”前面加一个“等待”步骤让页面充分渲染后再操作如果遇到iframe嵌套的页面先检查录制器是否支持切换到指定iframe实在不行就换一种交互方式比如用键盘快捷键而非点击。记住一个原则宁可多等两秒也不要盲目点击。5.2 运行结果为空机器人录好了运行也提示成功但结果数据是空的。这种情况大概率是页面结构变了或者录制时字段圈选的是绝对定位页面任何轻微改版都会导致选择器失效。排查步骤是打开录制器重新进入页面看看目标元素还存在不存在。如果还在多半是字段选择器偏了重新圈选一次并保存如果元素本身没了那就得换一个稳定的页面或换一种提取方式。5.3 worker内存被系统杀掉现象是任务创建后一直卡在pending状态docker compose ps看到worker容器是重启状态或退出了。打开worker日志几乎都是OutOfMemory。我前面提过给worker设置mem_limit是防护手段更根治的办法是控制同时运行的任务数不要在同一个时间点让所有机器人一起跑。把定时任务分散到不同分钟远比把worker堆内存靠谱。还有一个任务里如果翻页几十次浏览器内存会持续上涨这类重活建议拆成多个轻量机器人。5.4 定时任务不触发或时区不对cron表达式本身没毛病但就是不触发先看worker是否在线。定时调度靠后端把任务塞进队列worker消费如果worker挂了任务会一直堆积在队列里。另外注意时区如果maxun的调度按UTC处理你在配置界面填写的“每天9点”可能和你本地时间差8个小时。我的做法是统一以服务器时间为准cron表达式里手动换算好再填。5.5 目标站点加了基础反爬策略这是个绕不开的话题。对公开数据做低频、合规的采集一般来说问题不大。但如果目标网站出现验证码、行为检测之类的机制普通录制机器人确实会吃力。我的建议是从合规和数据伦理角度考虑优先抓取允许爬取的网站遵守目标站的robots.txt规则采集频率拉低比如一天一次不给对方服务器增加压力可以在录制里加入随机等待步骤模拟真实用户的操作节奏。即使这样仍然被限就别硬刚了换个数据渠道或联系对方开放API才是正路。5.6 运行记录越积越多数据库膨胀maxun每次运行都会保存结果巡检发现跑得久的实例数据库能达到好几GB。处理和上面提到的一样定期清理历史运行记录或者用脚本把结果导出后删除旧的运行数据。数据库瘦身不仅能节省磁盘还能让控制台响应更快。6. 用了一段时间后的体验与建议说实话maxun给我的整体感受是“性能够用门槛够低”。它把一个传统上需要写代码才能做的事压缩成“录一遍、跑定时、看结果”这种体验对业务同学非常友好。我在一个真实项目里用它跑了两个多月每天早上自动抓一批公开的价格数据稳定率在九成以上偶尔出现的空跑基本都发生在目标站点改版之后重新录制一次就能恢复。给准备入手的你几个建议。第一先跑通一个最简单的小场景再逐步加复杂逻辑别一上来就录一个30步骤的超级机器人。第二机器人命名和字段命名养成规范习惯导出数据的时候你就知道这有多重要。第三目标页面一旦确认稳定尽量不要频繁改动录制步骤每一次手改都可能引入新的不确定性。第四部署了就要关注服务器资源尤其是内存和磁盘建议给Docker和数据库配置简单的监控告警。还有一个我个人的小习惯录制完成后先用“试运行”模式连续验证两三次确认手动跑、定时跑结果一致再放心交给定时任务。这样能省掉很多半夜被“数据是空的”这种消息吵醒的麻烦。抓取公开数据是一件长期重复的事把每一步都做扎实了后面才能睡得安稳。
返回列表