如何用MediaCrawler爬取小红书抖音数据?7大平台爬虫从安装到实战完整指南
如何用MediaCrawler爬取小红书抖音数据?7大平台爬虫从安装到实战完整指南
MediaCrawler 是一个支持小红书、抖音、快手、B站、微博、百度贴吧、知乎的开源自媒体数据采集工具。它能按关键词、按帖子、按创作者主页三种方式抓取笔记/视频内容、评论甚至二级评论,并把结果存成 JSON、CSV、Excel 或数据库。适合做市场调研、竞品监控、内容选题的运营人员,以及想要现成爬虫框架而不想从零写 JS 逆向的开发者。
从一次"手动抄数据"说起
想象这个场景:你负责某新消费品牌的内容投放,想看看小红书上"平价精华"这个话题下热度最高的 50 篇笔记、它们各自的评论量和评论区在吐槽什么。手动一篇篇点开复制,半天下来只整理了 20 条,评论区根本没碰;换到抖音、B站再来一遍,时间直接翻倍。
MediaCrawler 解决的就是这类"跨平台、批量、带评论"的采集需求。它的核心思路是:不逆向平台前端的加密签名算法,而是用 Playwright 驱动真实浏览器完成登录和请求,让签名参数直接由页面环境产出。对你来说这意味着两件事——不需要研究 X-S 签名这类底层细节,也能把小红书登录态保存下来下次直接用,不用反复扫码。
5 分钟搭好采集环境并跑通第一个任务
第 1 步:准备运行环境
需要 Python 3.11 以上版本,以及一个较新版本的 Chrome 浏览器(建议 144 以上,用于后续 CDP 模式复用真实登录态)。
第 2 步:克隆仓库并安装依赖
git clone https://gitcode.com/GitHub_Trending/me/MediaCrawler
cd MediaCrawler
uv sync
uv sync 一条命令完成依赖安装。抖音、知乎的签名逻辑依赖 Node.js,如果你的环境要爬这两个平台,提前装好 Node.js(v16 及以上)即可。
第 3 步:打开 Chrome 远程调试
CDP 模式是本项目推荐的反检测方案:程序直接连接你日常在用的浏览器,复用真实 Cookie、扩展和浏览历史,平台很难把这次请求和普通用户区分开。开启方式:
- 在 Chrome 地址栏输入
chrome://inspect/#remote-debugging - 勾选 "Allow remote debugging for this browser instance"
- 页面显示
Server running at: 127.0.0.1:9222即成功
更多细节可参考项目内的 CDP模式使用指南。
第 4 步:改 4 个配置项
打开 config/base_config.py,只改下面这些就能跑:
PLATFORM = "xhs" # 目标平台:xhs|dy|ks|bili|wb|tieba|zhihu
KEYWORDS = "平价精华" # 搜索关键词,多个用英文逗号分隔
CRAWLER_TYPE = "search" # search 搜索 | detail 指定帖子 | creator 创作者主页
SAVE_DATA_OPTION = "json" # 保存格式:json|csv|excel|sqlite|postgres 等
ENABLE_CDP_MODE 和 CDP_CONNECT_EXISTING 默认为 True,即自动连接你已开启远程调试的 Chrome,无需额外修改。
第 5 步:运行并扫码登录
python main.py
首次运行会弹出浏览器窗口,用账号扫码登录(支持二维码、手机号两种方式)。登录状态会缓存到本地浏览器数据目录,后续运行免扫码。完成后去 data/ 目录查看结果文件。
功能拆解:按模块看懂它能做什么
三种爬取方式,覆盖不同取数目的
| 方式 | 配置值 | 输入 | 产出 |
|---|---|---|---|
| 关键词搜索 | search |
KEYWORDS 里的关键词 |
搜索结果页的笔记/视频列表及评论 |
| 指定帖子 | detail |
各平台配置里的指定 URL/ID 列表 | 单条内容的完整字段与评论 |
| 创作者主页 | creator |
各平台配置里的主页 URL 列表 | 该创作者发布的全部内容 |
以小红书为例,指定帖子列表在 config/xhs_config.py 的 XHS_SPECIFIED_NOTE_URL_LIST 中填写,注意链接需要带 xsec_token 参数(从浏览器地址栏直接复制完整 URL 即可)。
评论采集与词云:把评论区变成分析素材
评论是多数分析场景里最有价值的部分,相关开关都在 config/base_config.py:
ENABLE_GET_COMMENTS = True(默认开启):抓取一级评论CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES:控制单篇内容最多抓多少条评论ENABLE_GET_SUB_COMMENTS:是否继续抓二级评论,默认关闭ENABLE_GET_WORDCLOUD = True:抓完评论后自动生成词云图
词云需要配合停用词表使用,停用词写在 docs/hit_stopwords.txt(一词一行),完整用法见 词云图使用配置。适合做"用户到底在讨论什么"的可视化汇报。
代理 IP 池:大规模采集的保命配置
单 IP 高频请求很容易被风控。项目在 proxy/ 目录下内置了代理池:启动时从服务商拉取一批 IP,逐个验证可用性后随机轮换,IP 失效或过期自动补新。支持快代理、极速 HTTP、豌豆 HTTP 及静态代理四种方式,通过 ENABLE_IP_PROXY、IP_PROXY_PROVIDER_NAME 两个开关控制。
以快代理为例,先在服务商后台开通免费试用:
按需求选择产品类型,隧道代理适合对 IP 质量要求高的场景:
服务商提供的用户名密码或 API 密钥,通过环境变量传给项目,配置位置可参考 代理使用文档:
多格式存储:一份数据,多种出口
存储实现在 store/ 目录,按平台划分。SAVE_DATA_OPTION 一个开关切换出口:
- json / jsonl:默认推荐,方便后续用 Python 处理
- excel / csv:给运营同事直接打开看
- sqlite / postgres / db:入库后天然带去重,适合长期反复采集同一批对象
- mongodb:数据量大时的扩展方案
入库模式支持自动建表,首次运行不会出现"表不存在"的报错。各格式的详细说明见 数据存储指南。
实战:三个典型场景的完整走法
场景一:新品上市前的小红书竞品声量摸底
- 输入:竞品品牌名 + 品类关键词,如"某某面霜,修护精华"
- 操作:
PLATFORM = "xhs"、CRAWLER_TYPE = "search"、KEYWORDS填入关键词,CRAWLER_MAX_NOTES_COUNT调到 50,运行python main.py - 产出:json 文件里包含笔记标题、点赞收藏评论数、发布时间、正文;打开
ENABLE_GET_WORDCLOUD还能直接拿到评论区词云图,一眼看出用户在意的卖点和槽点
场景二:B站竞品账号的更新节奏监控
- 输入:竞品账号的主页 URL
- 操作:
PLATFORM = "bili"、CRAWLER_TYPE = "creator",主页链接填入config/bilibili_config.py对应列表 - 产出:该账号近期全部视频列表(标题、播放量、发布时间),定期跑一次就能对比更新频率和内容方向变化,不用手动刷主页
场景三:知乎问答的舆情收集
- 输入:行业相关问题的关键词
- 操作:
PLATFORM = "zhihu"、CRAWLER_TYPE = "search",把评论抓取数量调大 - 产出:问题列表、回答正文及评论,入库后用数据库按发布时间排序,即可做话题热度的时间序列分析
常见坑:4 个高频问题的排查步骤
小红书扫码后一直弹滑块验证
现象:扫码成功后浏览器反复出现滑块,登录卡死。
- 确认使用 CDP 模式连接真实浏览器(
ENABLE_CDP_MODE与CDP_CONNECT_EXISTING均为True),不要换成无痕窗口 - 把
HEADLESS设为False,重启项目后在弹出的浏览器里手动过一次滑块 - 若仍不行,删除项目根目录下的
brower_data/文件夹,重新走一遍登录流程
报 execjs 或 JS 相关错误(主要出现在抖音、知乎)
现象:execjs._exceptions.ProgramError: SyntaxError 或类似 JS 执行报错。
- 检查是否安装了 Node.js 环境,版本需 v16 及以上
- 未安装则前往 Node.js 官网下载安装对应系统的安装包
- 重启终端后再次运行项目
一开始正常,跑一段时间后突然失效
现象:相同代码前几天还正常,现在抓不到数据或直接报错。
- 判断是否为账号触发平台风控(这是最常见原因)
- 降低请求强度:调大
CRAWLER_MAX_SLEEP_SEC(请求间隔,默认 2 秒)、减小单次采集条数 - 开启代理池分散 IP(参考上文代理模块)
- 删除
brower_data/更换账号后重新登录,避开短期频繁操作的账号
报 Timeout 超时或 CDP 连不上浏览器
现象:playwright TimeoutError 或 Cannot connect to existing browser on port 9222。
- 确认 Chrome 处于打开状态,且版本 ≥ 144(地址栏输入
chrome://version查看) - 回到
chrome://inspect/#remote-debugging,确认已勾选远程调试开关 - 确认页面显示
Server running at: 127.0.0.1:9222,没有该行说明调试端口未成功开启 - 若浏览器弹出确认对话框,点击"接受",程序会等待约 60 秒内的人工确认
- 网络不通导致的超时,先检查本地网络/代理设置是否正常
提效技巧:让采集更稳更快的清单
- 控频率:
CRAWLER_MAX_SLEEP_SEC默认 2 秒,大批量任务建议加到 3~5 秒,换来的是账号安全 - 限并发:
MAX_CONCURRENCY_NUM保持 1 起步,稳定后再逐步上调,盲目并发是触发风控的常见原因 - 复用登录态:
SAVE_LOGIN_STATE保持开启,登录一次长期免扫码;想换账号删brower_data/即可 - 选对存储格式:一次性分析用 json/csv;长期跑同一对象用 sqlite/postgres 入库去重;给非技术同事看用 excel
- 按需抓媒体:
ENABLE_GET_MEIDAS默认关闭,只下载元数据时保持关闭,省带宽也省磁盘 - 浏览器管理:
AUTO_CLOSE_BROWSER默认在程序结束时关闭浏览器,调试阶段可设为False留着现场排查问题
总结
MediaCrawler 把七平台数据采集收敛到了"改配置 + 跑 main.py"两步:用浏览器自动化绕开 JS 逆向,用 CDP 模式复用真实登录态,用代理池和多格式存储应对规模化需求。新手建议从关键词搜索 + json 存储跑通第一条链路,再按场景逐步开启评论、词云、代理池等能力。现在就克隆仓库,改好 4 个配置项,跑通你的第一个采集任务吧。
更多推荐




所有评论(0)