01 签名这道坎,它换了个绕开的办法
写爬虫的人对签名这道坎都不陌生。真正花时间的往往不是爬取逻辑本身,而是接口参数被加密后,想直接调接口就得先逆向平台前端,搞清楚签名怎么算;算法一改,写好的脚本就废了。小红书 2023 年收紧风控那一次,接口成片返回 461,一大批脚本当场停摆。
MediaCrawler 恰恰绕开了这一层。它不碰加密,改让浏览器替它跑,覆盖小红书、抖音、快手、B 站、微博,再加贴吧与知乎,一共七个平台。作者是独立开发者,项目 2023 年 6 月开源,一路更新到现在,仓库已有六万五千多个 Star、一万多个 Fork。

底层是 Playwright。扫码登录后登录态会保存到本地,需要签名的请求全部交给浏览器在登录状态里自己计算,算法再变也拦不住。作者也承认这个思路不算首创,但装上就能用、同时覆盖七个平台的工具,确实不多。
中间还有一段插曲:作者曾经把仓库删掉,原因是有的人拿代码去卖钱;后来补上免责声明重新开源。
02 它默认接管你现在开着的这个 Chrome
这个项目默认不会自己启动浏览器,而是接管你正在使用的 Chrome。账号、Cookie、扩展、历史记录全都现成,平台侧看到的行为,就像一个真人在正常刷网页。
从 Chrome 136 开始,远程调试不再提供 HTTP 接口,程序改走 WebSocket 直连 ws://localhost:9222,并且要在浏览器里点一下确认。开跑之前,需要进 chrome://inspect/#remote-debugging 把远程调试勾上。
关键开关都在这条线上:CDP_CONNECT_EXISTING 决定接管现有浏览器还是另起实例,CDP_DEBUG_PORT 指定调试端口。
把 ENABLE_CDP_MODE 设为 False,就回到标准 Playwright 模式,代价是多跑一句 uv run playwright install 安装驱动。
03 七个平台,能采什么一张表就说清了
七个平台的能力被拉到同一水平线。README 里那张能力表每一行都打满勾,选哪个平台只看你的目标。
采集内容由 --type 决定:search 模式填关键词,批量拿下搜索结果里的笔记和视频;detail 模式针对已有目标,把帖子或视频的 ID 或完整 URL 填进列表,只抓这几条;creator 模式盯住某个作者,填主页地址,把对方发过的内容和数据一起取回。每条数据都能拿到标题、正文、点赞数、收藏数和评论。

登录有三种方式。默认 qrcode 用对应 App 扫码,登录态保存在本地,下次不用重新扫;cookie 方式把 Cookie 填进配置即可;phone 方式门槛很高,需要安卓手机装短信转发软件、准备内网穿透域名,还要一个带密码的 Redis,官方文档都明确不建议使用。
采集量大可以挂代理,内置快代理、豌豆 HTTP 和静态代理三种来源。存储落点有八种:文件侧是 CSV、Excel、JSON、JSONL;数据库侧除了 SQLite 和 MySQL,还有 PostgreSQL 与 MongoDB。默认落 JSONL。

04 评论比正文值钱,还能顺手出一张词云
很多场景下,评论比正文更有信息量。一级评论默认就会采集,单条上限默认 10 条;评论下方的回复(也就是楼中楼)需要手动打开 ENABLE_GET_SUB_COMMENTS,默认是关闭的。
采完的评论可以直接生成词云,但有个前置条件容易踩:只有存成 JSON 或 JSONL 才会生成,落进数据库出不了图;同时 ENABLE_GET_WORDCLOUD 也要打开。想让分词更准,可以向 CUSTOM_WORDS 添加自定义词组,停用词表和字体也可以替换。
05 封面和视频也能一起搬下来
除了结构化的数据,媒体文件也能一并下载。默认关闭,命令行加 --get_media true,或者打开 ENABLE_GET_MEDIA。
落盘会按内容聚合,路径形如 data/xhs/media/{帖子ID}/:封面保存为 cover.jpg,视频保存为 video.mp4,图文帖的多张图片按 001.jpg 顺序往下排。小红书、抖音、快手、B 站、微博五个平台都支持,贴吧和知乎没有媒体字段。
B 站这条线做得比较细。装了 ffmpeg 就走 DASH 路径,音视频分轨下载后再无损合流,拿到最高画质;没装就降级为 mp4 直链。清晰度由 BILI_QN 控制,默认值 80 对应 1080p。
06 跑起来要准备三样东西
第一样是 uv,进入项目目录跑一句命令,Python 依赖就能装完,作者用的是 Python 3.11。第二样是 Node.js,官方要求不低于 16.0.0,爬抖音和知乎时会用到。第三样是 Chrome,版本要 144 以上,装好后记得勾上远程调试。
uv run main.py --platform xhs --lt qrcode --type search
终端会显示二维码,用对应 App 扫码后,登录态就留在本地。需要修改的配置都集中在 config/base_config.py。
命令还有不少变体:--type detail 按详情采集,--specified_id 只取指定条目,--get_media true 连媒体文件一起拉取。
命令行不是唯一入口,项目还带一个网页版。后端用 uvicorn 跑在 8080 端口,前端进入 webui 目录安装依赖后运行 npm run dev,启动在 5173 端口。在浏览器里就能选平台、填关键词、翻看日志。要挂到后端上,先执行 npm run build。

懒得本地安装的话,把仓库地址丢给 AI 编程助手代劳也可以。
07 所有开关都在这一个文件里
真正需要改的东西集中在一个配置文件里,每一项都有中文注释。
命令行能覆盖的参数比想象中多,整个脚本有二十来个参数,配置里几乎每一项都有对应的命令行写法。布尔值既接受 yes、true、t、y、1,也认 no、false、f、n、0。
有几个默认值值得先记住:单次最多采 15 条内容,并发为 1,两次请求之间停 2 秒。最后那个数字,就是“降低频率”的官方实现。
还有两个不太常被提到的配置。XHS_INTERNATIONAL 打开后走海外版小红书,接口域名和 Cookie 域会一起切换;--init_db 可以一次性建好 PostgreSQL 或 MySQL 的表。
08 翻一遍目录,能看出它为什么扛得住改版
爬虫项目最怕平台一改版就整体崩塌,这个仓库的分层正是为了解决这件事。
七个平台各占一个目录,文件结构几乎一样,各自管好自己那一块。再往外层看,store 管存储,proxy 管代理,cache 分本地与 Redis 两套,tools 放浏览器控制与滑块处理。
libs 目录里躺着三个 JS 文件:抖音和知乎各有一个签名函数,还有一个 stealth.min.js 用来抹掉浏览器的自动化特征。所谓“不碰加密”,实际指的是把逆向结果收进这一层复用。
网页版并不是套在命令行外面的薄壳。webui 是一个独立的 React + TypeScript 工程,环境检测、配置面板、运行终端、数据浏览各自成模块。

09 开源版到这里为止,Pro 版另有一套
开源版缺失的功能作者没有藏着掖着:断点续爬和多账号功能在付费版里。Pro 版不开源,走订阅制,多出来的内容包括自媒体内容拆解 Agent、多账号与 IP 代理池、完整 Linux 支持、视频下载器桌面端、多平台信息流推荐,以及为 AI Agent 准备的 Skill。架构上,Pro 版把 Playwright 依赖整个移除,签名逻辑拆成独立服务。
10 有边界,也有风险
第一,账号存在风控风险。动手的是程序,频率一高,被盯上的就是你登录的那个账号。作者的建议是放慢节奏,只看公开内容,够用就收手,主力号别拿来跑。
第二,协议有明确边界。许可证全称 NON-COMMERCIAL LEARNING LICENSE 1.1,中文名为“非商业学习使用许可证”,只限非商业的学习与研究用途,禁止大规模爬取和干扰平台运营,商用需要先取得版权人的书面同意。
第三,平台本身也在变化。今天跑得通,不代表三个月后还能跑得通,登录态过期、接口改版都是日常。好在项目从 2023 年建库起一直有人维护,这个月还有代码推送。

对我个人来说,它的价值有两块。一是省时间,想看某个话题下大家在讨论什么,手动逐条摘录的活可以省掉;二是当作学习样本,想练习浏览器自动化,这个项目挺合适。
采的都是公开内容,频率压住,不碰隐私,也不商用。仓库地址在 https://github.com/NanmiCoder/MediaCrawler 。类似的开源工具和爬虫实战案例,也欢迎到 云栈社区 逛逛。