☰
MediaCrawler 使用指南:五大新媒体平台数据采集,免逆向爬虫怎么跑通
2026/10/26 1:50:15 网站建设 项目流程

MediaCrawler 使用指南:五大新媒体平台数据采集,免逆向爬虫怎么跑通

【免费下载链接】MediaCrawler-new项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new

一句话定位

MediaCrawler 是一个面向新媒体平台的 Python 数据采集工具,能从小红书、抖音、快手、B站、微博批量抓取帖子、视频、图片以及评论、点赞、转发等互动数据。它的核心卖点是"浏览器搭桥":用 Playwright 保留登录成功后的浏览器环境,直接在页面里执行 JS 表达式拿到平台的加密参数,免去了逐个逆向前端加密算法的麻烦。

能力全景

  • MediaCrawler 对五大平台(xhs / dy / ks / bili / wb)的能力覆盖是齐整的:二维码登录、Cookie 登录、关键词搜索、指定内容 ID 爬取、登录状态缓存、数据保存、IP 代理池。
  • 小红书额外支持创作者主页模式(CRAWLER_TYPE = "creator"),B站额外支持视频下载(CRAWLER_TYPE = "video_download",在配置文件设置)。
  • 数据内容包括帖子/视频基础信息、图片、评论、点赞、转发;评论默认不采集,由ENABLE_GET_COMMENTS开关控制。
  • 登录方式三种:qrcode 扫码(以小红书为例,终端会直接打印二维码,无头模式下也能扫)、phone 手机号+短信转发回填(见 手机号登录说明)、cookie。
  • 保存方式三种:json / csv 都落在data/目录,db写入关系型数据库(默认 MySQL,可在 config/db_config.py 换成 sqlite)。

从零跑起来

先克隆仓库装依赖,除 Python 依赖外还要装 Playwright 的浏览器驱动,最后一行别忘了:

git clone https://gitcode.com/GitHub_Trending/me/MediaCrawler-new cd MediaCrawler-new python -m venv venv && source venv/bin/activate pip install -r requirements.txt playwright install

然后打开config/base_config.py,只动三处:PLATFORM是要爬的平台(默认 "xhs")、KEYWORDS是逗号分隔的多个关键词、LOGIN_TYPE是登录方式(默认 "qrcode")。跑完后你会看到终端打印出登录二维码,用手机 App 扫码后程序开始分页拉搜索结果、逐条抓笔记详情,结束后data/目录下生成 json 数据文件,项目根目录还会多出browser_data/子目录,里面缓存着该平台的登录状态。如果爬抖音时报execjs ... 缺少 ';'之类的错误,是缺 nodejs,装上(推荐 v16.8.0)再跑即可。

配置即场景

所有配置集中在config/base_config.py,每个场景真正要改的只有两三行。

监控竞品创作者主页

只有小红书支持 creator 模式,先把目标主页 ID 填进列表,命令行再带上--type creator:

CRAWLER_TYPE = "creator" XHS_CREATOR_ID_LIST = ["63e36c9a000000002703502b"]

顺手把ENABLE_GET_COMMENTS设为 True,连评论一起抓,能直接看出竞品内容下的讨论热度。

批量采集并写入数据库

长期做行业数据收集时,json 不好查询,把存储层切到 db:

KEYWORDS = "Python教程,数据分析" SAVE_DATA_OPTION = "db" CRAWLER_MAX_NOTES_COUNT = 100

首次运行前用python db.py建一次表,它会自动建库并生成表结构;数据库密码从RELATION_DB_PWD环境变量读取,连接串在config/db_config.py顶部。

代理池开关与 Redis 缓存配置

采集量大了就打开 IP 代理池:

ENABLE_IP_PROXY = True IP_PROXY_POOL_COUNT = 5

代理池用 Redis 缓存已拉取的 IP 和过期时间(连接配置是config/db_config.py里的REDIS_DB_HOST/REDIS_DB_PWD),所以要先装好 Redis 并设置密码。🔑 当前服务商是极速HTTP,在 IP 提取页生成 API 链接后取出 key、crypto 两个参数,写入小写命名的环境变量:

export jisu_key="your_key" export jisu_crypto="your_crypto"

服务商 IP 提取页面:生成 API 链接后只需要其中的 key 与 crypto 两个参数

MediaCrawler 代理 IP 池工作流程 Redis 缓存从启动爬虫到取到可用 IP:服务商拉取 → Redis 缓存 → 代理池抽取的完整流程

架构速览

项目结构很规整,看清几个主目录就够了:

MediaCrawler/ ├── media_platform/ # 五大平台爬虫实现,一平台一目录 ├── store/ # 各平台数据模型与存储实现(json/csv/db) ├── proxy/ # IP 代理池与代理服务商接口 ├── tools/ # 滑块识别、时间处理、UA 生成等工具函数 ├── config/ # 基础配置 base_config.py + 数据库配置 ├── base/ # AbstractCrawler 等抽象基类 ├── libs/ # stealth.min.js 反检测脚本、抖音 sign JS ├── main.py # 命令行入口与 CrawlerFactory 工厂 └── db.py # Tortoise-ORM 初始化与建表

踩坑与排障

抖音报 execjs SyntaxError

⚠️ 日志里出现execjs._exceptions.ProgramError: SyntaxError: 缺少 ';',大概率是缺 nodejs 环境——抖音的 sign 参数要靠本地 JS 引擎执行。先node -v看一下,版本不对就装 v16.8.0 后重跑。

扫码登录后如何复用会话

每次都要扫码的话,先看config/base_config.py里的SAVE_LOGIN_STATE,默认就是 True,登录状态缓存在browser_data/目录。如果跑一阵子就失效,多半是 cookie 过期或触发风控:把HEADLESS临时设为 False,打开浏览器看真实页面状态。要换账号更简单,整个删掉browser_data/目录重跑即可。

扫码一直不成功

终端已经打印二维码、扫完仍不通过,或者直接弹滑块验证,就把HEADLESS设为 False 打开浏览器手动过一次,登录状态会缓存下来,之后可以恢复无头模式。看到playwright ... Timeout 30000ms这种超时,则先检查网络连接本身是否正常。

开始能爬、过段时间全失效

这是典型的平台风控信号。先调低MAX_CONCURRENCY_NUM(默认 4),不够再加开代理池。项目在 常见问题 里也反复提醒不要对平台做大规模爬虫,账号和 IP 被封是常态。

扩展与进阶

想改源码的话,MediaCrawler 的入口很集中,四处看一遍就够:

  • 抽象层在base/base_crawler.py,定义了 AbstractCrawler、AbstractLogin、AbstractStore 三个抽象类,新平台必须实现它们。
  • main.py里的CrawlerFactory.CRAWLERS字典是唯一注册点,加一行键值对和 import,命令行参数就自动支持新平台。
  • 平台实现照抄media_platform/xhs/的五文件结构(core.py 主流程、login.py 登录、client.py 请求);数据模型和存储实现放store/xhs/,用 db 存储时还要在db.py的get_platform_models里注册模型。
  • 想换代理服务商,实现proxy/proxy_ip_provider.py里的 ProxyProvider 抽象类,再把文件末尾的单例IpProxy替换掉。

边界与收尾

  • 频率上,MAX_CONCURRENCY_NUM和CRAWLER_MAX_NOTES_COUNT默认值都压得比较低,长时间任务不建议大幅调高,风控是真实存在的。
  • 用途上,README 声明本仓库仅供学习和研究、禁止商业用途;评论、创作者数据里含有用户表达与隐私字段,导出和分享时注意处理。
  • 本地文件上,browser_data/缓存着登录态,别把它提交进版本库;手机号登录也有每日发送上限(小红书一天约 10 条短信),够用就好。

【免费下载链接】MediaCrawler-new项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询