MediaCrawler多平台采集指南:一套代码拿下小红书抖音B站,逆向从此不是门槛
MediaCrawler多平台采集指南一套代码拿下小红书抖音B站逆向从此不是门槛【免费下载链接】MediaCrawler-new项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new“爬虫难难在逆向。”做内容分析、舆情监控、竞品调研的开发者几乎都被这句话扎过心。小红书、抖音、快手、B站、微博每个平台都有自己的加密算法和风控策略今天逆向完的签名算法明天接口一改又全部作废。传统方案里逆向一个平台的签名机制往往要耗掉两到四周维护成本更是无底洞。MediaCrawler 给出了另一条路不逆向加密只保留登录态。它基于 Playwright 浏览器自动化框架把“登录后的浏览器上下文”完整保留下来让平台自己替我们把加密参数算好爬虫只负责拿着这些参数去请求数据。本文从原理讲到实战带你用一套代码跑通五大平台的采集流程。先看全景它凭什么绕开逆向这道坎你可以把 MediaCrawler 想象成一场“借鸡生蛋”传统爬虫 你偷看厨师平台前端的菜谱JS代码照着复刻一份随时可能因菜谱更新而失传。 MediaCrawler 你把厨师本人请进自家厨房让他现炒现做你只管端菜上桌。具体来说MediaCrawler 先用 Playwright 打开一个真实的 Chromium 浏览器你扫码或填 Cookie 完成登录后它把这份带着登录态、Cookie、LocalStorage 的浏览器上下文持久化保存。之后每次请求数据时它通过执行页面里现成的 JS 表达式比如小红书的window._webmsxyw签名函数拿到加密参数再交给 httpx 去拉取笔记、评论、点赞、转发等数据。项目整体的职责划分非常清晰各层互不打扰base/ 抽象基类爬虫、登录、存储三套接口 media_platform/ 五大平台的具体实现xhs/dy/ks/bili/wb proxy/ 代理IP池管理获取、缓存、轮换 store/ 数据落地db/csv/json 三种后端 tools/ 滑块工具、时间工具、签名辅助等 main.py 程序入口 CrawlerFactory 工厂注册这样的分层设计带来的直接好处是加新平台不用动老代码照着base/base_crawler.py里AbstractCrawler的接口实现一套即可。一张表看懂五个平台的“家底”平台Cookie登录二维码登录指定创作者主页关键词搜索指定ID爬取登录态缓存数据保存IP代理池滑块处理小红书✅✅✅✅✅✅✅✅手动过抖音✅✅✕✅✅✅✅✅✅ 自动快手✅✅✕✅✅✅✅✅✕B站✅✅✕✅✅✅✅✅✕微博✅✅✕✅✅✅✅✅✕值得注意的差异点有两个一是小红书是唯一支持“指定创作者主页”采集的平台适合做达人账号的内容沉淀二是抖音内置了滑块验证工具tools/slider_util.pyeasing.py模拟真人滑动轨迹其他平台则不需要这套机制。选型时可以先想清楚你要的是单平台深耕还是五个平台一把抓。十分钟跑通第一个Demo下面这套流程按 Python 3.9 环境来写Windows、macOS、Linux 的差异点我会单独标注。第一步拉取代码并准备虚拟环境git clone https://gitcode.com/GitHub_Trending/me/MediaCrawler-new cd MediaCrawler-new python -m venv venv # macOS / Linux 激活 source venv/bin/activate # Windows 激活 venv\Scripts\activate第二步安装依赖与浏览器驱动pip install -r requirements.txt playwright install这里有个小坑提前提醒你抖音平台依赖 Node.js 执行签名脚本libs/douyin.js如果只爬小红书可以不管但要爬抖音必须先装 Node.js版本要求 v16.8.0 及以上。第三步启动搜索采集以小红书为例python main.py --platform xhs --lt qrcode --type search命令执行后会自动弹出浏览器窗口展示二维码用小红书 App 扫码登录。登录成功后程序会按配置里的关键词去搜索笔记、拉详情、存数据——全程不需要你再动手。这段命令拆开看其实很好理解--platform选平台--lt选登录方式qrcode/phone/cookie--type选采集模式search/detail/creator。想看全部参数直接执行python main.py --help。四个核心配置项决定你爬得顺不顺项目的“总开关”都集中在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 HEADLESS True # True无头模式不弹浏览器False弹出浏览器 ENABLE_IP_PROXY False # 是否启用代理IP池建议大规模采集时打开 IP_PROXY_POOL_COUNT 2 # 代理池预取数量默认2可调到5 SAVE_DATA_OPTION json # 存储格式json | csv | db CRAWLER_MAX_NOTES_COUNT 20 # 每个关键词最多采集多少条默认20 MAX_CONCURRENCY_NUM 4 # 并发爬虫数机器性能好可以上调 ENABLE_GET_COMMENTS False # 是否爬评论默认关需要时打开几个“默认值→推荐值”的调整建议HEADLESS False如果小红书扫码后一直验证不通过把它改成 False 弹出浏览器手动拖一下滑块再改回去。ENABLE_GET_COMMENTS True默认不爬评论需要评论数据做舆情分析时打开。MAX_CONCURRENCY_NUM 4 → 8带宽和内存充裕时可以加并发但请同步配合代理IP使用否则容易触发平台风控。数据库落盘的话去config/db_config.py改连接串# MySQL 示例 RELATION_DB_URL mysql://root:123456localhost:3306/media_crawler # 轻量场景也可以直接用 SQLite # RELATION_DB_URL sqlite://data/media_crawler.sqlite # Redis 用于代理IP缓存启用代理池时必须配置 REDIS_DB_HOST 127.0.0.1三种采集模式覆盖绝大多数业务场景--type参数对应三种完全不同的采集诉求你可以按需切换关键词搜索search——适合做趋势分析、热点追踪。程序读取KEYWORDS里的词逐词搜索笔记并拉取详情与评论。想控制采集量就调CRAWLER_MAX_NOTES_COUNT。指定ID采集detail——适合已有明确目标列表的场景。每个平台在配置里都有专属的 ID 列表字段XHS_SPECIFIED_ID_LIST [6422c2750000000027000d88, 64ca1b73000000000b028dd2] DY_SPECIFIED_ID_LIST [7280854932641664319] BILI_SPECIFIED_ID_LIST [BV1d54y1g7db, BV1Sz4y1U77N] WEIBO_SPECIFIED_ID_LIST [4982041758140155] KS_SPECIFIED_ID_LIST [3xf8enb8dbj6uig]把要采集的内容 ID 填进对应列表然后运行python main.py --platform xhs --lt qrcode --type detail即可。ID 从哪来网页版分享链接里通常就带小红书是 24 位字符串、B站是 BV 号、微博是数字 ID。创作者主页采集creator——目前只有小红书支持。把博主 user_id 填进XHS_CREATOR_ID_LIST程序会抓取主页信息 该博主发布的所有笔记 评论是达人内容分析的主力模式。进阶玩法代理IP池与数据落盘采集量一上来IP 封禁就是躲不开的问题。MediaCrawler 内置的代理IP池走的是“按需提取 Redis 缓存 到期自动淘汰”的闭环代理IP池完整工作流程图从提取、缓存到使用的闭环上图展示了代理IP从第三方提取到缓存再到实际请求的完整链路。启用步骤分两步。第一步在配置里打开开关ENABLE_IP_PROXY True第二步给代理服务商接口配置密钥。项目默认实现了“极速HTTP”代理商的适配proxy/proxy_ip_provider.py密钥通过环境变量注入export jisu_key你的提取Key export jisu_crypto你的加密签名密钥配置在 proxy_ip_provider.py 末尾的 IpProxy 实例化处读取环境变量。代理池的实现细节也值得看一眼每次取 IP 会优先从 Redis 缓存里捞数量不够才向代理商补货且 IP 带过期时间戳到期后 Redis 自动删除。这种“缓存优先”的设计能显著减少代理商的 API 调用次数每次提取都消耗 IP 配额。代理服务商的提取后台效果大致如下提取时注意选择 HTTPS 协议并开启账密验证与代码里的参数保持对齐。存储方面三种后端各有用武之地JSON适合快速原型和单机调试文件落在data/目录CSV适合丢进 Excel 或 pandas 做分析db适合长期积累、大规模采集支持 MySQL、PgSQL 等关系型数据库且项目对存储做了批量插入封装减少数据库连接开销。新手最容易踩的五个坑Q1爬抖音报错execjs._exceptions.ProgramError: SyntaxError: 缺少 ;A缺少 Node.js 环境或版本太低。安装 Node.js v16.8.0 及以上版本即可。Q2刚开始能爬过段时间突然就爬不动了A八成是账号触发了平台风控。建议调大请求间隔、开启代理IP轮换、控制单日采集量。也请牢记这个项目仅供学习研究不要对平台做大规模采集。Q3报错playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.A典型的网络超时。检查网络连通性、目标站点能否正常访问必要时给 Playwright 配置代理。Q4想换个账号登录怎么办A删除项目根目录下的browser_data/文件夹。登录状态就缓存在这里SAVE_LOGIN_STATE True时每次启动会直接复用不再弹二维码。Q5小红书扫码登录一直不过A把HEADLESS改成False弹出浏览器后手动把滑块验证拖过去登录成功后再改回无头模式。想二次开发架构已经把路铺好了如果你不满足于开箱即用MediaCrawler 的扩展性也相当友好。base/base_crawler.py定义了AbstractCrawler爬虫、AbstractLogin登录、AbstractStore存储三套抽象接口新增一个平台只需要四步在media_platform/下新建平台目录实现AbstractCrawler的全部方法init_config、start、search、launch_browser实现自己的client负责签名与请求和login复用 qrcode/phone/cookie 三种登录流程在store/下补上数据模型与存储实现在main.py的CrawlerFactory.CRAWLERS字典里注册新平台类。接完收工——因为上层调度、登录态管理、代理IP池、数据落盘都是公共能力新平台天然继承。面向生产环境还有几个值得投入的方向结合 Celery 或 APScheduler 做定时采集任务把main.py里的入口改造成可调度的函数对大规模任务采用多机分布式部署配合负载均衡分摊压力把采集结果接入消息队列Kafka、RabbitMQ做异步流转解耦采集与消费。写在最后MediaCrawler 的价值本质上是把“逆向加密 JS”这个最烧时间的环节替换成了“保留浏览器上下文”这个一行配置就能搞定的事。技术先进性体现在它对浏览器自动化能力的巧妙借用而生产可用性则体现在代理池、登录态缓存、多存储后端、并发控制这些细节里。给你的下一步行动建议很直接先别急着研究原理把第一个 Demo 跑起来。扫码登录的那一分钟你会直观感受到“让平台自己算签名”到底有多省事。跑通之后再按本文的进阶路径逐步深入你会发现多平台采集这件事真的可以一套代码通吃。如果你在实践过程中遇到了本文没覆盖的问题欢迎带着报错信息去项目文档里翻一翻docs/目录下还有项目代码结构说明和手机号登录的专项文档能帮你省下不少排查时间。【免费下载链接】MediaCrawler-new项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考