Skip to content

xange1314520/xhs-crawler

Repository files navigation

小红书爬虫服务 🚀

NestJS TypeScript Docker License

基于 NestJS + Puppeteer 的小红书数据爬取服务,提供帖子详情和用户信息的 RESTful API 接口。

快速开始功能特性API 文档部署指南


✨ 功能特性

  • 🎯 帖子详情爬取 - 支持单个/批量爬取帖子详情(标题、内容、点赞数、收藏数等)
  • 👤 用户信息爬取 - 支持单个/批量爬取用户信息(昵称、粉丝数、笔记数等)
  • 🔗 智能 URL 处理 - 自动识别并处理短链、长链、ID 三种格式
  • 🌐 浏览器池管理 - 智能管理多个浏览器实例,支持并发爬取
  • 🔄 健康检查 - 自动检测和重启不健康的浏览器实例
  • 📦 Cookie 管理 - 支持多账号管理,自动轮询使用
  • 📊 Swagger 文档 - 完整的 API 交互式文档
  • 🐳 Docker 部署 - 开箱即用的容器化部署方案

🚀 快速开始

使用 Docker(推荐)

# 克隆项目
git clone <repository-url>
cd xhs-crawler

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 访问服务
curl http://localhost:3000/health

服务启动后访问:

本地开发

# 1. 安装依赖
npm install

# 2. 配置环境变量(可选)
cp .env.example .env

# 3. 启动开发服务
npm run start:dev

📖 API 接口

📝 帖子爬取

单个帖子

GET /api/posts/:postId/detail

# 示例
curl http://localhost:3000/api/posts/YOUR_NOTE_ID/detail

批量帖子

POST /api/posts/batch
Content-Type: application/json

{
  "posts": [
    {"postId": "YOUR_NOTE_ID", "xsecToken": "xxx"},
    {"postId": "YOUR_NOTE_ID", "xsecToken": "yyy"}
  ]
}

# 示例
curl -X POST http://localhost:3000/api/posts/batch \
  -H "Content-Type: application/json" \
  -d '{"posts": [{"postId": "YOUR_NOTE_ID"}]}'

👤 用户爬取

单个用户

POST /api/users/crawl
Content-Type: application/json

{
  "userIdOrUrl": "USER_ID_HERE_OR_URL"
}

# 支持三种格式:
# 1. 用户ID: "USER_ID_HERE_OR_URL"
# 2. 短链: "https://xhslink.com/m/xxx"
# 3. 长链: "https://www.xiaohongshu.com/user/profile/USER_ID"

批量用户

POST /api/users/batch
Content-Type: application/json

{
  "users": [
    {"userIdOrUrl": "USER_ID_HERE_OR_URL"},
    {"userIdOrUrl": "https://xhslink.com/m/xxxx"}
  ]
}

🔐 账号管理

# 创建账号
POST /api/accounts
{
  "name": "测试账号",
  "cookie": "your-cookie-string"
}

# 查询账号
GET /api/accounts

# 删除账号
DELETE /api/accounts/:id

📊 响应格式

{
  "code": 200,
  "message": "success",
  "data": {
    "postId": "xxxxxxx",
    "title": "标题",
    "desc": "内容",
    "likedCount": 45000,
    "collectedCount": 36000,
    "commentCount": 1234,
    "shareCount": 567
  }
}

🐳 部署

Docker Compose 部署

# 开发环境
docker-compose up -d

# 生产环境
docker-compose -f docker-compose.prod.yml up -d

生产环境配置

修改 docker-compose.prod.yml 中的环境变量:

environment:
  # 浏览器池配置
  BROWSER_POOL_MIN_SIZE: 1        # 初始浏览器数
  BROWSER_POOL_MAX_SIZE: 3        # 最大浏览器数
  BROWSER_IDLE_TIMEOUT: 1800000   # 空闲超时(毫秒)

📖 详细部署文档: DEPLOYMENT.md | PRODUCTION_DEPLOY.md


🛠️ 技术栈

技术 版本 说明
NestJS 10.x Node.js 框架
TypeScript 5.x 类型安全
Puppeteer 22.x 无头浏览器
SQLite - 轻量级数据库
TypeORM 0.3.x ORM 框架
Docker - 容器化部署

📁 项目结构

xhs-crawler/
├── src/
│   ├── modules/
│   │   ├── account/              # 账号管理
│   │   ├── crawler/              # 爬虫核心
│   │   │   ├── controllers/      # 控制器
│   │   │   ├── services/         # 服务层
│   │   │   │   ├── browser-pool.service.ts       # 浏览器池
│   │   │   │   ├── browser-instance.puppeteer.ts # 浏览器实例
│   │   │   │   └── crawler.service.ts            # 爬虫服务
│   │   │   └── dto/              # 数据传输对象
│   │   ├── health/               # 健康检查
│   │   └── database/             # 数据库
│   └── common/                   # 通用模块
├── docker-compose.yml            # Docker 配置
├── Dockerfile                    # 镜像构建
└── package.json

🔧 开发命令

# 开发
npm run start:dev          # 启动开发服务(热重载)
npm run build              # 构建生产版本
npm run start:prod         # 启动生产服务

# 测试
npm run test               # 运行单元测试
npm run test:cov           # 测试覆盖率报告
npm run test:e2e           # 端到端测试

# 代码质量
npm run lint               # 代码检查
npm run format             # 代码格式化

📝 环境变量

变量名 默认值 说明
NODE_ENV production 运行环境
PORT 3000 服务端口
DATABASE_PATH /app/data/accounts.db 数据库路径
BROWSER_POOL_MIN_SIZE 1 最小浏览器实例数
BROWSER_POOL_MAX_SIZE 3 最大浏览器实例数
BROWSER_IDLE_TIMEOUT 1800000 浏览器空闲超时(30分钟)
PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium-browser Chromium 路径

❓ 常见问题

Q: 如何获取小红书的 Cookie?
  1. 打开浏览器开发者工具(F12)
  2. 访问小红书网站并登录
  3. 在 Network 标签中找到任意请求
  4. 复制 Request Headers 中的 Cookie 值
  5. 通过 /api/accounts 接口添加到系统中
Q: 浏览器启动失败怎么办?

检查以下配置:

  • Docker 容器是否有足够的共享内存(shm_size: 2gb
  • 确保 Chromium 正确安装
  • 查看日志:docker-compose logs -f
Q: 爬取速度慢怎么优化?
  • 增加浏览器池大小(BROWSER_POOL_MAX_SIZE
  • 使用批量接口进行并发爬取
  • 确保服务器资源充足(CPU、内存)
Q: 如何处理反爬虫?
  • 使用真实的登录 Cookie
  • 控制请求频率,避免过于频繁
  • 定期更新 Cookie
  • 使用多个账号轮询

🤝 贡献

欢迎提交 Issue 和 Pull Request!

在提交 PR 之前,请确保:

  • 代码通过 npm run lint 检查
  • 添加必要的测试用例
  • 更新相关文档

📄 许可证

MIT License


⚠️ 免责声明

本项目仅供学习和研究使用,请勿用于商业用途。使用本项目时请遵守小红书的服务条款和相关法律法规。


💰 赞助支持

如果这个项目对你有帮助,请给个 ⭐ Star!欢迎请作者喝杯咖啡 ☕

支付宝收款码

扫码使用支付宝打赏

About

mcp获取小红书通告和博主详情公开信息

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages