Files
ns2.0/backend/app/crawler
Nvex 720402ffe7 feat: NEXT Store 2.0 重大更新 - 完整重构前后端
🎉 主要更新:

后端:
- 全新华为应用市场爬虫系统
- 三表分离数据库设计 (app_info, app_metrics, app_rating)
- 完整的API接口 (搜索、分类、热门、上新等)
- 元服务自动识别和分类
- 智能Token管理和数据处理
- 修复热门应用重复显示问题

前端:
- 全新首页设计 (今日上架、热门应用)
- 应用页面 (彩色分类磁贴、智能图标匹配)
- 今日上新页面 (日期切换)
- 热门应用页面 (卡片布局)
- 应用详情页面 (完整信息展示)
- Apple风格搜索栏
- Footer组件
- 底部导航栏优化 (4个导航项)
- 骨架屏加载效果
- FontAwesome图标集成

UI/UX:
- 统一浅色背景 (#F5F5F7)
- 流畅的过渡动画
- 响应式设计
- 毛玻璃效果

文档:
- CHANGELOG.md - 完整更新日志
- QUICKSTART.md - 快速开始
- 多个技术文档和使用指南

版本: v2.0.0
2025-10-25 21:20:32 +08:00
..

华为应用市场爬虫

快速开始

# 进入爬虫目录
cd backend/app/crawler

# 爬取所有962个应用默认50并发
python3 crawl.py

# 或者只爬取前10个应用测试
python3 crawl.py --limit 10

脚本会自动检查并创建数据库表(如果不存在)

使用说明

命令参数

python3 crawl.py [选项]

选项:
  --limit N      只爬取前N个应用默认爬取所有962个
  --batch N      并发数量默认50
  --skip-init    跳过数据库初始化检查
  -h, --help     显示帮助信息

使用示例

# 爬取所有应用50并发
python3 crawl.py

# 爬取前10个应用
python3 crawl.py --limit 10

# 使用100并发爬取
python3 crawl.py --batch 100

# 爬取100个应用使用20并发
python3 crawl.py --limit 100 --batch 20

# 跳过数据库检查直接爬取
python3 crawl.py --skip-init

性能对比

并发数 爬取100个应用 爬取962个应用
5 ~10秒 ~2分钟
10 ~5秒 ~1分钟
50 ~2秒 ~20秒
100 ~1秒 ~10秒

文件说明

  • crawl.py - 爬虫命令行入口(主程序)
  • guess.py - 应用ID列表962个已知的鸿蒙应用ID
  • app_ids.py - ID加载器从guess.py加载ID
  • crawler.py - 爬虫核心类
  • huawei_api.py - 华为API封装
  • token_manager.py - Token自动管理
  • data_processor.py - 数据处理和保存

工作流程

  1. 检查数据库:自动检查表是否存在,不存在则创建
  2. 加载ID列表:从 guess.py 加载962个应用ID
  3. 并发爬取
    • 分批并发获取应用信息
    • 获取评分数据
    • 保存到数据库(智能去重)
  4. 显示进度:实时显示爬取进度和状态

输出说明

[1/962] C6917559067092904725 ✓ 突击射击 → 新应用, 新指标, 新评分
  • [1/962]: 当前进度
  • C6917559067092904725: 应用ID
  • ✓ 突击射击: 成功获取应用信息
  • → 新应用, 新指标, 新评分: 保存状态
    • 新应用: 首次保存该应用的基本信息
    • 新指标: 保存了新的版本指标记录
    • 新评分: 保存了新的评分记录
    • 无更新: 数据无变化,未保存新记录

数据存储

爬取的数据保存在三张表中:

app_info应用基本信息

  • 主键app_id
  • 唯一索引pkg_name
  • 包含名称、开发者、分类、图标、描述、设备支持、SDK信息等

app_metrics应用指标历史

  • 自增主键id
  • 外键app_id, pkg_name
  • 包含:版本号、大小、下载量、发布时间
  • 每次版本或下载量变化时新增一条记录

app_rating应用评分历史

  • 自增主键id
  • 外键app_id, pkg_name
  • 包含:平均评分、各星级数量、总评分数
  • 每次评分变化时新增一条记录

新增字段

设备支持

  • main_device_codes: 支持的设备列表
    • 0: 手机
    • 1: 平板
    • 2: 智慧屏
    • 3: 手表
    • 4: 车机
    • 5: PC

SDK信息

  • target_sdk: 目标SDK版本
  • min_sdk: 最低SDK版本
  • compile_sdk_version: 编译SDK版本
  • min_hmos_api_level: 最低HarmonyOS API级别
  • api_release_type: API发布类型

其他信息

  • dev_id: 开发者ID
  • supplier: 供应商
  • kind_id: 分类ID
  • tag_name: 标签名称
  • price: 价格
  • ctype: 内容类型
  • app_level: 应用级别
  • packing_type: 打包类型

注意事项

  1. Token管理Token会自动刷新有效期约1小时
  2. 爬取速度并发数越高速度越快但建议不超过100
  3. 网络稳定性:高并发对网络要求较高
  4. 数据库连接:确保数据库支持足够的并发连接
  5. 重复运行:可以重复运行,只会保存有变化的数据

故障排查

数据库连接失败

✗ 数据库检查失败: (pymysql.err.OperationalError)

解决方案

  • 检查 backend/.env 文件中的数据库配置
  • 确认数据库服务器可访问

Token刷新失败

✗ Token刷新失败

解决方案

  • 检查网络连接
  • 等待片刻后重试

应用爬取失败

✗ 跳过(安卓应用)

说明这是正常的表示该ID对应的是安卓应用不是鸿蒙应用

并发过高导致失败

解决方案:降低并发数

python3 crawl.py --batch 20

编程方式使用

import asyncio
from app.crawler import HuaweiCrawler

async def main():
    # 使用上下文管理器
    async with HuaweiCrawler() as crawler:
        # 爬取前10个应用使用50并发
        success, failed = await crawler.crawl_by_ids(limit=10, batch_size=50)
        print(f"成功: {success}, 失败: {failed}")

asyncio.run(main())