ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MediaCrawler 完整指南:一行命令跑通 5 个社交媒体平台数据采集

MediaCrawler 完整指南:一行命令跑通 5 个社交媒体平台数据采集

MediaCrawler 完整指南:一行命令跑通 5 个社交媒体平台数据采集

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

做市场调研的人大概都干过这种事:打开小红书搜一个关键词,翻页、复制标题、粘贴进表格,半小时过去,攒下的数据还不够画一张图。换成抖音、B站再做一遍,工作量直接翻几倍,还可能在某次刷新后收到"网络异常"的提示。MediaCrawler 是一个面向小红书、抖音、快手、B站、微博的开源社交媒体数据采集工具,它用自动化浏览器保留你扫码登录后的真实会话,再在这个会话里执行页面内的 JS 拿到加密参数,把最棘手的逆向部分直接省掉了。

免逆向加密:Playwright 会话"搭桥"取数的原理

市面上多数爬虫方案的第一道坎是签名参数:接口请求里带的 xs、X-Bogus 这类字段,是平台用一段混淆过的 JS 算出来的,硬啃就要逐行逆向,每个平台的算法还都不一样。

MediaCrawler 换了个思路。它用 Playwright(一个能模拟真实浏览器行为的自动化库)打开页面,你像普通用户一样扫码登录一次,项目会把这次登录产生的 Cookie、本地存储等状态缓存到本地的用户数据目录里。之后每次采集,它都用这套缓存好的浏览器上下文发起请求,并直接在页面环境里执行平台的 JS 表达式计算加密参数——参数由平台自己的代码算,你只需要"借用"结果,不需要复现算法。

两个细节体现了这个思路的完整度:

  • 项目自带一份libs/stealth.min.js,作用是抹掉浏览器的自动化指纹特征,让请求看起来更像真人操作;
  • 抖音的 sign 函数单独放在libs/douyin.js里,通过 Node.js 环境调用执行,这也是为什么跑抖音平台需要本机装 Node.js(v16.8.0 及以上)。

登录环节同样覆盖了三种方式:二维码(默认)、手机号(配合短信转发服务,见 docs/手机号登录说明.md)、Cookie(把浏览器里现成的 Cookie 字符串贴进配置即可)。

3 步跑通首次采集:环境、配置与启动命令

第 1 步:准备环境。克隆仓库并装好依赖,其中playwright install会下载驱动所用的浏览器内核,不能漏:

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

第 2 步:改配置。所有可调项集中在 config/base_config.py,首次使用只需要关心这几项:

PLATFORM = "xhs" # xhs / dy / ks / bili / wb KEYWORDS = "python,golang" # 关键词模式下要搜的关键词 LOGIN_TYPE = "qrcode" # qrcode / phone / cookie CRAWLER_TYPE = "search" # search / detail / creator CRAWLER_MAX_NOTES_COUNT = 20 # 每个入口最多抓多少条 ENABLE_GET_COMMENTS = False # 是否同时抓评论 SAVE_DATA_OPTION = "json" # json / csv / db 三种落盘方式

第 3 步:启动。平台、登录方式、采集模式都可以用命令行参数覆盖配置文件:

python main.py --platform xhs --lt qrcode --type search

执行后浏览器会自动弹出登录二维码,用手机端 App 扫码确认即可,采集结果按SAVE_DATA_OPTION落到data/目录(json/csv)或数据库(需在 config/db_config.py 里配好连接)。

过程中最容易卡住的两个点,提前说在前面:抖音平台报execjs相关错误,基本就是缺 Node.js 环境;如果扫码后一直卡住,把配置里的HEADLESS改为False,让浏览器窗口显示出来手动过一下可能出现的验证码。登录状态缓存在根目录的browser_data/下,想换账号登录就删掉这个目录重跑。

五大平台能力对照:三种采集模式各自支持到什么程度

启动命令里的--type决定了采集模式:search按关键词搜索、detail按指定 ID 列表抓单条内容(ID 列表同样写在配置里,按平台分字段)、creator抓创作者主页(目前仅小红书支持)。五个平台的能力矩阵如下,打勾的位置就是实际能跑的:

平台Cookie 登录二维码登录关键词搜索指定 ID 采集创作者主页登录状态缓存代理 IP 池滑块处理
小红书✅✅✅✅✅✅✅—
抖音✅✅✅✅—✅✅✅
快手✅✅✅✅—✅✅—
B站✅✅✅✅—✅✅—
微博✅✅✅✅—✅✅—

几个使用上的实际差别:

  • 抖音是唯一内置滑块验证码识别的(tools/slider_util.py用 OpenCV 做缺口定位,tools/easing.py生成拟人滑动轨迹),但源码注释里也坦诚提示:登录弹窗中途跳出的滑块验证准确率一般,建议优先用 Cookie 方式登录抖音;
  • B站额外支持按 BV 号批量下载视频,配置里把CRAWLER_TYPE设为video_download即可;
  • 小红书是功能最全的一个,搜索还支持排序方式(SORT_TYPE,如按热度降序)。

各平台的具体实现都按同一套骨架落在media_platform/对应子目录里,字段定义(field.py)、客户端(client.py)、登录(login.py)、核心流程(core.py)一一对应,看一个平台就能推导出其他平台。

配置代理 IP 池,降低长时间采集的封禁风险

单 IP 高频请求是触发风控的最常见原因。项目在 proxy/ 目录下做了一套 IP 代理池:开启后,它通过代理服务商的 API 拉取一批 IP 存入池子,采集请求随机取用、用完即弃,池子空了自动补货;可选开启有效性校验(发一个测试请求,失败的 IP 会自动剔除重试)。IP 的缓存和过期时间记录在 Redis 里,所以启用代理功能需要本机先装好 Redis 并设密码。

MediaCrawler 代理 IP 池工作流程图

配置侧只需要两步:把ENABLE_IP_PROXY置为True,再按需调整IP_PROXY_POOL_COUNT(池子里的 IP 数量)。代理密钥(key/crypto)建议放环境变量里,不要硬编码在代码中。

比换 IP 更进一步的还有账号代理池(proxy/proxy_account_pool.py):它维护一组"IP ↔ 手机号"一一配对的账号组合轮换使用,目的是把请求分散到多个真实账号上,适合需要长时间跑量的场景。

按模块读懂代码:新增一个平台要动哪些文件

这套工具的可维护性来自一个约定:所有平台共享 base/base_crawler.py 里的抽象基类(AbstractCrawler定义浏览器启动、AbstractLogin定义三种登录、AbstractStore定义数据落盘),main.py里的CrawlerFactory用一个字典把平台名映射到具体实现类。

想理解或扩展一个新平台,路径是清晰的:

  1. 在media_platform/下建一个同构的子目录,实现client.py(封装接口请求)、login.py(继承AbstractLogin)、core.py(串联采集流程,继承AbstractCrawler);
  2. 在store/下对应目录实现AbstractStore,决定数据写 json、csv 还是数据库;
  3. 回main.py的工厂字典里注册一行。

工具函数则统一收在 tools/:滑块识别、时间处理、通用辅助各管一摊,改 bug 时基本不用跨目录翻找。

合规使用边界:采集前先看这 4 条

工具能跑通不等于可以随便跑,平台风控和法律法规是两回事,都别碰:

  • 控制频率与规模:CRAWLER_MAX_NOTES_COUNT和并发数MAX_CONCURRENCY_NUM留有余量,别把账号跑进风控黑名单;
  • 尊重隐私与条款:采集结果可能含用户个人内容,仅用于学习和研究目的,不传播、不商用;
  • 账号风险自担:登录态属于你自己的账号,被限流或封禁的责任不在工具方;
  • 数据用途合法:不用于骚扰、恶意营销或任何侵犯第三方权益的操作。

更多配置项说明、运行报错排查和手机号登录的短信转发搭建,都在 docs/ 目录里,遇到问题先翻一遍再动手。

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

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

返回列表