ARTICLE DETAIL

资讯详情

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

MediaCrawler开源爬虫实战:浏览器自动化采集小红书抖音数据

MediaCrawler开源爬虫实战:浏览器自动化采集小红书抖音数据 开源爬虫项目 MediaCrawler 最近在 GitHub 上热度一直居高不下很多做数据分析、新媒体研究和竞品监控的开发者都在关注它。如果你在社交媒体行业工作或者正在做内容分析、舆情监控、行业报告这类项目大概率会遇到一个很头疼的问题想采集小红书、抖音、微博、B 站这些平台上的公开数据但官方 API 要么收费昂贵、要么根本不开放。过去大家常用的办法是写脚本直接请求接口但如今主流平台的前端接口几乎都做了签名验证直接请求大概率拿到的是加密参数和混淆代码反爬验证码也会很快找上门。另一类方案是使用 selenium 这类传统自动化工具但这套方案在遇到新版网页结构时经常因为等待策略、元素定位不稳定而失败维护成本非常高。MediaCrawler 正是为了解决这些问题出现的。它不直接硬刚平台的加密算法而是巧妙地通过浏览器自动化工具模拟真实用户行为在页面正常加载的过程中截获已经解密完成的接口响应数据。这种思路既绕开了复杂的逆向分析工作又相对稳定。本文会从原理、部署、配置到实际使用把这个项目的完整面貌拆解清楚并重点说明哪些坑是新手最容易踩的。1. 为什么 MediaCrawler 值得关注先看一个典型的业务场景你接到一个任务需要采集小红书上某个关键词下的热门笔记包括标题、点赞数、评论数、发布时间一共 1000 条左右。如果用传统方式你需要先打开开发者工具观察页面请求定位到返回数据的接口然后分析加密参数是怎么生成的再写出一段模拟请求的代码。这个过程顺利的话需要两三天不顺利的话平台改了参数校验规则前面的工作基本作废。MediaCrawler 的处理方式完全不同。它启动一个真实的浏览器实例通过 Playwright 控制浏览器访问小红书页面使用关键词进行搜索。在浏览器正常执行脚本、加载页面、渲染数据的过程中MediaCrawler 通过监听网络请求和页面响应直接把已经解密好的 JSON 数据截获下来再解析成结构化数据写入本地数据库。整个过程中你完全不需要碰平台的加密算法。这个项目解决了三类人的痛点第一类是数据分析师和产品运营他们需要大量公开内容样本做趋势判断但不具备逆向工程能力。第二类是爬虫初学者想学习大规模数据采集的工程化思路但不想从补环境、解混淆这些高门槛环节开始。第三类是做新媒体研究的开发人员需要批量获取特定平台的图文和评论数据用于训练模型或做内容分析。当然这个项目并不是万能的。它适合采集平台公开的、无需登录即可查看的内容不适合、也不应该用于采集用户私密数据或突破平台访问限制。这一点在后面的合规部分会详细说明。2. 核心概念与工作原理2.1 浏览器自动化与网络数据捕获MediaCrawler 的核心思路可以拆成三个环节模拟操作、数据捕获、结构化存储。模拟操作环节依赖 Playwright 或 DrissionPage。Playwright 是微软开源的一个浏览器自动化库它能够在后台启动 Chromium 浏览器实例并像真人一样执行点击、输入、滚动等操作。当然也有开发者选择 DrissionPage 方案它更轻量在某些反检测场景下有自己的优势。两条技术路线可以根据情况选用。数据捕获环节是这个项目最精巧的地方。MediaCrawler 并不直接读取网页 DOM 元素来提取数据而是通过浏览器开发者工具协议监听网络活动。当页面发起 XHR 请求或 Fetch 请求时MediaCrawler 可以获取到请求的 URL、请求头和响应体。由于浏览器本身已经完成了 T 值的签名计算、加密参数生成等动作MediaCrawler 拿到的响应体就是解密后的明文 JSON。结构化存储环节则是把解析后的内容统一成固定的数据模型包括笔记 ID、标题、描述、点赞数、收藏数、评论数、发布时间等字段然后写入 CSV、JSON、SQLite 或 MySQL 等存储介质。2.2 项目支持的数据源从项目文档和社区反馈来看MediaCrawler 目前支持的数据源覆盖面比较广平台支持内容类型主要采集方式小红书关键词搜索笔记、指定帖子搜索接口截获 详情页补充抖音关键词搜索视频、指定视频搜索接口截获 详情页补充快手关键词搜索视频、指定视频搜索接口截获 详情页补充B 站关键词搜索视频、指定视频搜索接口截获 详情页补充微博关键词搜索博文、指定博文搜索接口截获 详情页补充贴吧关键词搜索帖子、指定帖子搜索接口截获 详情页补充知乎关键词搜索问题、指定问题搜索接口截获 详情页补充这里需要说明的是支持列表会随项目版本迭代发生变化具体以项目 README 的实时说明为准。但整体设计思路是一致的先通过关键词搜索拿到内容列表再根据列表中的 ID 进入详情页补充完整数据。2.3 平台签名机制与 MediaCrawler 的应对策略很多开发者第一次接触这个项目时会有一个疑问为什么这么多平台都做了签名校验MediaCrawler 却不需要逆向签名算法答案在于它选择了一个特殊的攻击面。平台的签名机制通常只保护服务器端的接口验证但无法阻止浏览器本身正常执行页面脚本然后渲染出内容。MediaCrawler 利用的正是这个逻辑浏览器是官方认可的客户端它会完整地执行页面的 JavaScript包括所有的加密和签名逻辑。MediaCrawler 通过拦截浏览器发出的请求和收到的响应在数据到达页面渲染层之前就完成了采集。这有点像是你请了一个客人到家里客人不是去撬保险柜而是等主人自己把保险柜打开拿东西时在旁边记录下这个过程。平台无法阻止这种行为因为它本质上就是用户在正常使用产品。理解了这一点你就能明白为什么 MediaCrawler 在应对反爬方面相对从容它不需要维护一套复杂的加密参数生成逻辑只需要保持浏览器版本和自动化库版本的兼容并及时更新选择器配置即可。3. 环境准备与前置条件在实际部署 MediaCrawler 之前建议先确认你的开发环境满足以下要求。3.1 基础环境要求MediaCrawler 基于 Python 开发因此你需要一个可用的 Python 环境。从项目文档来看建议使用 Python 3.9 及以上版本。官方推荐使用虚拟环境或 Conda 环境来隔离项目依赖避免污染全局 Python 环境。操作系统方面Windows、macOS 和主流 Linux 发行版都可以运行。需要注意的一点是如果你在 Linux 服务器上部署需要额外安装一些系统级依赖因为 Playwright 启动浏览器时需要这些底层库支持。3.2 数据库准备默认情况下MediaCrawler 可以使用 SQLite 作为存储数据库无需额外安装任何东西这对新手非常友好。但如果你的数据量较大或者希望后续做数据分析和可视化展示推荐提前准备 MySQL。项目支持通过配置文件切换数据库类型后面会详细说明。如果你所在团队已经有现成的 MySQL 8.0 服务可以复用。如果是从零开始用 Docker 快速启动一个 MySQL 实例会非常方便。3.3 代码与虚拟环境假设你已经安装了 Git 和 Python 3.9安装项目主程序的步骤如下git clone https://github.com/NanmiCoder/MediaCrawler.git cd MediaCrawler python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate这里使用虚拟环境的目的是隔离项目依赖避免后续安装的 Playwright、pandas 等包影响到其他项目。4. 安装依赖与配置文件解析4.1 安装 Python 依赖激活虚拟环境后执行依赖安装pip install -r requirements.txt这个命令会一次性安装所有需要的第三方库包括 Playwright、DrissionPage、pandas、pymysql 等。安装完成后还需要执行一条命令来下载浏览器内核playwright install chromium这条命令会从微软的 CDN 下载 Chromium 浏览器。网络状况较好时通常几分钟就能完成。下载完成后Playwright 才能正常启动浏览器实例。4.2 核心配置文件MediaCrawler 的配置文件在项目根目录下一般是一个 Python 文件例如config/base_config.py。这个文件中包含了几乎所有可调参数下面以关键词搜索任务为例解释最核心的几个配置项。# 文件路径config/base_config.py # 爬取模式可选search 或 detail # search 表示根据关键词搜索内容detail 表示根据指定 ID 采集详情 CRAWLER_MODE search # 平台选择可选xhs, dy, ks, bili, wb, tieba, zhihu PLATFORM xhs # 搜索关键词 KEYWORDS 美食探店 # 是否开启登录模式 LOGIN_TYPE qrcode # 可选 qrcode / cookie / phone # 指定爬取起始页和结束页 START_PAGE 1 END_PAGE 5 # 数据保存方式支持 csv / json / sqlite / mysql SAVE_DATA_OPTION sqlite # 是否开启 IP 代理 ENABLE_IP_PROXY False # 是否开启评论爬取 CRAWLER_COMMENTS True这里有一个关键理解点PLATFORM和CRAWLER_MODE决定了整个采集任务的类型。上面的配置意思是以小红书为目标平台使用关键词“美食探店”从第 1 页搜到第 5 页并把结果保存到 SQLite 中。如果你希望采集指定 ID 的帖子内容需要把CRAWLER_MODE改为detail并在CONFIG中指定具体的 ID 列表例如小红书笔记 ID。5. 完整示例关键词搜索采集小红书笔记下面我们以实际可运行的示例来演示整个采集流程。假设我们要采集小红书上关键词“Python 入门”下的前 3 页笔记并把结果保存到 SQLite 数据库。5.1 配置最小示例修改config/base_config.py# 文件路径config/base_config.py CRAWLER_MODE search PLATFORM xhs KEYWORDS Python 入门 START_PAGE 1 END_PAGE 3 SAVE_DATA_OPTION sqlite LOGIN_TYPE qrcode CRAWLER_COMMENTS False5.2 启动采集任务在项目根目录下执行python main.py执行后程序会做这几件事读取配置文件确定平台和模式。启动 Playwright 浏览器实例。打开小红书搜索页面输入关键词执行搜索。监听网络响应截获搜索结果数据。解析 JSON整理成结构化数据。将数据写入 SQLite 数据库。整个过程中你会看到终端实时输出日志包括当前采集到第几页、解析了多少条笔记、写入数据库是否成功等信息。如果你的LOGIN_TYPE设置为qrcode程序会在启动时弹出二维码此时需要用手机 App 扫码登录。这一步的目的是规避一些平台对未登录用户的搜索限制。关于这一点你可以理解为使用你的个人账号去搜索公开内容平台看到的就是一个正常用户在浏览页面。5.3 检查数据结果SQLite 数据库文件默认生成在项目目录下的data文件夹中文件名包含了平台信息和采集时间。可以使用命令行工具或数据库可视化工具查看。-- 示例使用 sqlite3 命令查询数据 sqlite3 data/xhs_data_20250101.db .tables SELECT title, liked_count, collected_count, comment_count, create_time FROM xhs_note LIMIT 10;上面这段 SQL 的作用是查看采集到的前 10 条笔记的标题、点赞数、收藏数、评论数和发布时间用来快速确认数据是否完整、字段是否符合预期。5.4 指定帖子 ID 采集详细内容如果关键词搜索无法覆盖你需要的特定内容可以切换为详情采集模式。修改配置# 文件路径config/base_config.py CRAWLER_MODE detail PLATFORM xhs # 小红书笔记 ID 列表 XHS_SPECIFIED_ID_LIST [ 65f2c1a4000000001f012345, 65f2c1a4000000001f012346 ]运行python main.py后程序会针对每一个笔记 ID 访问对应的详情页采集完整的标题、正文、图片列表、标签、点赞收藏评论等字段。这个模式适合你已经通过其他渠道拿到了具体内容 ID只需要补充详情数据的场景。6. 数据存储与多平台配置6.1 切换存储方式默认使用 SQLite 对新手最友好但生产环境通常需要集中存储方便后续分析。项目支持通过配置切换到 MySQL核心配置如下# 文件路径config/base_config.py SAVE_DATA_OPTION mysql # MySQL 连接配置 MYSQL_HOST 127.0.0.1 MYSQL_PORT 3306 MYSQL_USER root MYSQL_PASSWORD your_password MYSQL_DATABASE media_crawler切换后程序会在启动时自动创建表结构并将采集的数据写入 MySQL。如果你使用 Docker 部署项目还可以编写一个docker-compose.yml同时启动 MySQL 和爬虫服务这里不再展开。6.2 多平台采集把PLATFORM依次改为dy、ks、bili、wb、tieba、zhihu就可以采集对应平台的数据。但要注意不同平台在登录方式、搜索接口、字段结构上有差异实际运行时的日志输出和字段命名也会不同。建议第一次使用某个平台时先用单页、小数据量测试确认字段符合预期后再扩大规模。以抖音为例平台对搜索接口的加密校验更严格且视频数据往往包含大量关联信息例如音乐、话题、地理位置等因此解析出来的字段会比小红书笔记更复杂。如果你只是需要基础字段直接使用默认解析逻辑即可如果有特殊字段需求可能需要自己扩展解析函数。7. 常见问题与排查思路以下是社区中反馈频率较高的一些问题以及对应的排查和处理方式。问题现象可能原因排查方式解决方案启动时提示chromium未安装未执行 Playwright 浏览器下载命令运行playwright install chromium安装浏览器内核后重试扫码登录后无数据写入登录后页面跳转导致监听事件中断查看终端日志中是否有异常堆栈重新启动程序保持手机扫码页面稳定搜索页一直加载不出来网络到目标平台的连通性不稳定用浏览器手动打开平台页面测试检查网络环境配置代理或更换网络采集速度很慢默认设置了随机等待时间查看配置中MAX_WAIT_TIME和MIN_WAIT_TIME适当调低等待区间但注意不要过于激进数据写入 MySQL 报错表结构冲突或权限不足查看 MySQL 错误日志确认账号权限检查数据库账号是否具备建表和写入权限关键词搜索返回结果为空当前关键词下确实没有内容或页面结构变化手动在浏览器中搜索该关键词验证更换关键词或等待项目更新选择器配置采集过程中出现验证码请求频率过高或环境特征明显观察页面是否弹出滑块或点选验证码降低采集速率适当增大随机等待时间排查这类问题核心原则是看日志。MediaCrawler 的日志输出相对完整任何一次请求失败或解析异常都会打印到终端。先定位是请求阶段失败还是解析阶段失败再针对性地检查网络、登录状态、配置项和页面结构。8. 最佳实践与工程建议8.1 合规使用是所有实践的前提这一点必须放在最前面。MediaCrawler 的目的是采集平台公开数据但公开数据并不等于可以无限制地采集和使用。在具体业务中使用这个项目时建议遵守以下原则第一采集范围限于公开可访问的内容不采集需要特殊权限才能查看的数据。第二控制采集频率避免对目标平台服务器造成明显压力。第三采集到的数据用于合法用途包括个人学习、学术研究、以及符合平台规则和法律法规的内容分析。第四涉及个人信息的内容需要脱敏处理后才能入库或对外展示。如果在企业内部使用还要先确认所在公司是否有对应的数据合规要求必要时咨询法务意见。8.2 账号安全与登录策略MediaCrawler 支持扫码登录、Cookie 登录和手机号登录。从账号安全角度更推荐使用扫码登录因为它不需要在配置文件中保存明文密码或 Cookie。扫码登录的缺点是二维码有效期有限且如果账号在异地登录可能触发平台的风控。Cookie 登录适合需要长时间无人值守运行的场景但 Cookie 本身会过期也存在泄露风险。如果使用 Cookie 登录建议将 Cookie 信息放在环境变量或单独的密钥管理服务中不要直接写死在代码里更不要提交到 Git 仓库。8.3 代理池与反爬平衡项目支持配置代理池用于分散请求 IP。并非所有场景都需要代理。如果只是采集几百条数据使用本机 IP、控制请求频率就足够了。如果任务规模达到数万条才需要考虑代理池。比较务实的做法是先用直连 低频策略测试目标平台的风控容忍度如果出现验证码或 IP 限制再增加代理池。代理池的选择上优先考虑稳定性和协议兼容性因为 Playwright 浏览器对部分代理协议支持并不完美。8.4 数据质量与增量采集社交媒体数据是持续更新的一次性采集只能得到某个时间点的快照。如果我们希望做持续监控需要设计增量采集方案。一个简单的做法是每天定时运行一次关键词搜索任务将新数据与历史数据做去重合并。去重逻辑可以基于笔记 ID 或内容的哈希值。对于 MySQL 存储可以为笔记 ID 字段建立唯一索引写入时使用ON DUPLICATE KEY UPDATE更新变化字段这样既能保证不重复录入又能让点赞数、评论数这些动态指标保持最新。8.5 日志规范化与可观测性代码跑通了只是第一步稳定运行一个月才是真正有挑战的事情。建议从一开始就做好日志规范。把采集任务的执行时间、成功条数、失败条数、耗时统计都输出到结构化日志中方便后续用 ELK 或 Loki 等工具做监控。项目中记录日志时可以遵循一个简单约定每条日志包含时间戳、日志级别、任务 ID、平台、页面号和数据量。这样出现问题时可以根据任务 ID 快速关联整个采集链路。9. 总结与后续方向MediaCrawler 真正降低的是社交媒体公开数据采集的工程门槛。它通过浏览器自动化加网络数据捕获的组合思路避开了复杂的签名逆向工作让数据分析师和业务开发人员能够把精力集中在数据理解和业务应用上而不是消耗在对抗平台风控上。对于第一次接触这个项目的开发者建议按照本文的路径走一遍先配置关键词搜索用小数据量跑通 SQLite 存储再逐步切换到多平台、多模式、MySQL 集中存储。每一步都确认输出符合预期再扩大规模。很多人在一开始就急着上多平台、大并发结果出问题时难以定位反而浪费了时间。如果你已经能够稳定运行采集任务下一步可以关注这些方向第一对采集数据进行清洗和去重构建自己的内容数据集。第二结合大模型 API 对笔记内容做情感分析或主题聚类让数据产生业务价值。第三研究平台的页面结构和接口变化规律为项目升级维护做好准备。最后提醒一句任何数据采集项目技术能力只是一部分合理合规地使用数据才是可持续的前提。建议收藏本文在实际部署时对照配置和排查清单使用。
返回列表