# Taobao_Spider **Repository Path**: TangJuu/Taobao_Spider ## Basic Information - **Project Name**: Taobao_Spider - **Description**: 全链路淘宝商品数据采集与分析系统,覆盖爬虫采集 → 数据清洗 → 去重存储 → 可视化分析完整流程。爬虫采用 Scrapy + Selenium 混合架构,通过 selenium-stealth JS 指纹修补 + CDP 反检测脚本注入实现双重隐身对抗淘宝反爬;数据经三层 Pipeline(清洗 → Redis/内存双模式去重 → SQLite 持久化)处理,内置 100+ 品牌词典三级回退识别引擎;前端基于 Streamlit + Plotly 构建 6 页面交互式分析看板,支持 Web 端一键启动爬虫、实时日志监控、竞品价格对比和数据 CRUD 管理。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-08-11 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: Spider, Selenium, Scrapy, Python ## README # 淘宝电商数据采集与分析系统 > Scrapy + Selenium 隐身爬虫 → 三层数据管道 → Streamlit 可视化看板 --- ## 项目介绍 本项目是一个完整的**淘宝商品数据采集与分析系统**,覆盖从网页采集、数据清洗、 去重存储到可视化分析的全链路。爬虫采用 Scrapy + Selenium 混合架构, 通过 selenium-stealth + CDP 双重隐身对抗淘宝反爬检测;数据经三层层管道 (清洗 → 去重 → 存储)后落入 SQLite,最终通过 Streamlit + Plotly 构建 交互式分析看板。 ### 核心功能 | 模块 | 功能 | |------|------| | 爬虫引擎 | Scrapy + Selenium 隐身爬取淘宝搜索结果 | | 反爬对抗 | selenium-stealth JS 指纹修补 + CDP 注入 + UA 轮换 + Cookie 管理 | | 数据管道 | 三层 Pipeline:清洗(300) → 去重(400) → 存储(600) | | 分布式去重 | Redis Set 去重,Redis 不可用时自动降级为内存去重 | | 数据处理 | 价格/销量格式化、城市→省份映射、品牌识别、分类检测 | | 可视化看板 | Streamlit 6 页面 + Plotly 4 种图表组件 | | 爬虫控制 | Web 端一键启动/监控爬虫,实时日志输出 | | 数据管理 | 增删改查 + 批量删除 + JSON 原始视图 | --- ## 技术栈 | 层级 | 技术 | 用途 | |------|------|------| | 爬虫框架 | Scrapy 2.13+ | 异步爬取引擎(async start) | | 浏览器自动化 | Selenium 4.x | 动态页面渲染与交互 | | 反爬隐身 | selenium-stealth + CDP | JS 指纹修补 + 反检测脚本注入 | | 数据存储 | SQLite | 轻量级嵌入式数据库 | | 分布式 | Redis | 商品去重 + URL 队列(可选) | | 可视化 | Streamlit + Plotly | 交互式 Web 看板 | | 数据处理 | pandas | 数据清洗与转换 | | UA 轮换 | fake-useragent | 随机 User-Agent 生成 | --- ## 项目结构 ``` Taobao_Spider-数据库清理/ ├── run.py # 一键启动脚本(spider/web/all/init) ├── scrapy.cfg # Scrapy 配置 ├── requirements.txt # Python依赖 ├── scrapy_taobao/ # Scrapy 爬虫核心 │ ├── settings.py # 爬虫配置(并发/延迟/重试/Pipeline) │ ├── items.py # 商品数据模型(11个字段) │ ├── middlewares.py # 三个中间件(UA/Cookie/重试) │ ├── pipelines.py # 三层管道(清洗/去重/存储) │ └── spiders/ │ └── selenium_spider.py # Selenium 爬虫(678行核心逻辑) ├── data_processor/ # 数据处理模块 │ ├── cleaner.py # 价格/销量清洗 + 城市省份映射 │ └── transformer.py # 品牌识别(100+词典)+ 分类检测 ├── utils/ # 工具层 │ ├── config.py # 全局配置(Redis/Spider/DB/Log) │ ├── db.py # SQLite CRUD 封装 │ └── logger.py # 日志配置 └── web_app/ # Streamlit 可视化前端 ├── app.py # 主应用(顶部导航 + 页面路由) ├── components/ │ ├── charts.py # 4种 Plotly 图表组件 │ └── data_table.py # 数据表格组件 ├── pages/ │ ├── p1_data_overview.py # 数据概览(统计卡片 + 图表) │ ├── p4_competitor.py # 竞品分析(品牌对比 + 箱线图) │ ├── p5_security.py # 安全监控(爬虫日志) │ ├── p6_json_viewer.py # JSON 原始数据查看 │ ├── p7_spider_control.py # 爬虫控制面板(启动/日志/状态) │ └── p8_data_editor.py # 数据管理(CRUD + 批量删除) └── styles/ └── custom.css # 自定义样式 ``` --- ## 架构设计 ### 1. 反爬策略(四层隐身) ``` ┌─────────────────────────────────────────────────────────┐ │ Chrome 启动参数 │ │ --disable-blink-features=AutomationControlled │ │ excludeSwitches: ["enable-automation", "enable-logging"]│ │ useAutomationExtension: False │ ├─────────────────────────────────────────────────────────┤ │ selenium-stealth JS 指纹修补 │ │ 修补: navigator.webdriver / chrome.runtime / │ │ navigator.plugins / navigator.languages / │ │ WebGL vendor & renderer / hairline fix │ ├─────────────────────────────────────────────────────────┤ │ CDP 反检测脚本注入(每次页面加载前) │ │ Page.addScriptToEvaluateOnNewDocument: │ │ - navigator.webdriver → undefined │ │ - window.chrome → {runtime, loadTimes, csi, app} │ │ - navigator.permissions.query → 伪造 Notification 权限 │ │ - navigator.plugins → [1,2,3,4,5] │ │ - navigator.languages → ['zh-CN','zh','en'] │ ├─────────────────────────────────────────────────────────┤ │ 行为模拟 │ │ 随机延迟(2-8s) + 多轮渐进滚动 + 页间休息(10-20s) │ │ + 持久化 Chrome profile 保留登录态 │ └─────────────────────────────────────────────────────────┘ ``` ### 2. 三层数据管道 ``` 爬虫产出 Item │ ▼ ┌──────────────────┐ │ DataCleanPipeline │ 优先级 300 │ (data_processor) │ 价格清洗: "¥3,299" → 3299.0 │ │ 销量转换: "1.2万" → 12000 │ │ 位置归一: "深圳" → "广东省" │ │ 品牌识别: 商品名+店铺名 → 品牌 │ │ 分类检测: 关键词/商品名 → 分类 └────────┬──────────┘ ▼ ┌──────────────────┐ │ DedupPipeline │ 优先级 400 │ │ MD5(商品名) → 去重键 │ Redis 模式: │ SADD/SISMEMBER (分布式) │ 内存模式(降级): │ set() (单机) └────────┬──────────┘ ▼ ┌──────────────────┐ │ SQLitePipeline │ 优先级 600 │ │ 参数化 INSERT → products 表 │ │ 异常记录 → crawl_logs 表 └──────────────────┘ ``` ### 3. 品牌识别(三级回退) ``` 商品名称 + 店铺名称 │ ▼ ① 关键词词典匹配(100+ 品牌词条) brand_keywords = {"apple": "苹果", "huawei": "华为", ...} │ 未命中 ▼ ② 店铺名提取(去除后缀) "XX旗舰店" → "XX" "YY专卖店" → "YY" │ 未命中 ▼ ③ 首词回退 提取商品名首个中英文 token ``` ### 4. 中间件链 | 中间件 | 优先级 | 功能 | |--------|--------|------| | RandomUserAgentMiddleware | 400 | fake-useragent 随机 UA,失败时回退固定 Chrome UA | | RetryMiddleware | 500 | HTTP 5xx/408/429 自动重试,最大 3 次 | | CookieMiddleware | 550 | 自动管理 Cookie(Set-Cookie → 请求头) | --- ## 数据库设计 ### SQLite 表结构 **products 表** — 商品数据 | 字段 | 类型 | 说明 | |------|------|------| | id | INTEGER PK | 自增主键 | | name | TEXT | 商品名称 | | price | REAL | 价格(已清洗为浮点数) | | sales | INTEGER | 销量(已清洗为整数) | | shop | TEXT | 店铺名称 | | location | TEXT | 发货省份(已归一化) | | keyword | TEXT | 搜索关键词 | | brand | TEXT | 品牌(自动识别) | | category | TEXT | 分类(自动检测) | | product_url | TEXT | 商品链接 | | image_url | TEXT | 图片链接 | | crawl_time | TEXT | 采集时间 | **crawl_logs 表** — 爬虫日志 | 字段 | 类型 | 说明 | |------|------|------| | id | INTEGER PK | 自增主键 | | task_id | INTEGER | 任务ID | | level | TEXT | 日志级别(INFO/WARNING/ERROR) | | message | TEXT | 日志内容 | | timestamp | TEXT | 记录时间 | --- ## 环境要求与安装 ### 软件要求 | 软件 | 版本 | 说明 | |------|------|------| | Python | 3.10+ | 推荐 3.13 | | Chrome | 120+ | 爬虫依赖的浏览器 | | Redis | 7.x | 可选,不装则使用内存去重 | ### 安装步骤 ```bash # 1. 克隆仓库 git clone <仓库地址> cd Taobao_Spider-数据库清理 # 2. 创建虚拟环境 python -m venv .venv313 # 3. 激活虚拟环境 # Windows PowerShell: .\.venv313\Scripts\Activate.ps1 # Linux/macOS: source .venv313/bin/activate # 4. 安装依赖 pip install -r requirements.txt # 5. 初始化数据库 python run.py init ``` ### Python 依赖 ``` selenium>=4.15.0 # 浏览器自动化 selenium-stealth>=1.0.0 # JS 指纹修补 scrapy>=2.11.0 # 爬虫框架 streamlit>=1.50.0 # Web 可视化 pandas>=2.0.0 # 数据处理 plotly>=5.0.0 # 交互式图表 redis>=5.0.0 # 分布式去重(可选) fake-useragent>=1.4.0 # UA 轮换 ``` --- ## 运行方法 ### 一键启动(推荐) ```bash # 交互模式 — 显示菜单选择 python run.py # 爬虫 + 前端一键启动 python run.py all --keywords 笔记本电脑 --pages 2 # 仅启动爬虫 python run.py spider --keywords 手机,耳机 --pages 3 # 仅启动前端 python run.py web # 仅初始化数据库 python run.py init ``` ### 直接使用 Scrapy 命令 ```bash scrapy crawl taobao_selenium \ -a keywords=笔记本电脑 \ -a max_pages=2 \ -a login_wait=60 ``` ### 启动 Streamlit 前端 ```bash streamlit run web_app/app.py ``` ### 爬虫控制面板 启动前端后,在 **爬虫控制** 页面可以: - 输入搜索关键词(支持批量模式) - 设置爬取页数(1-10页) - 一键启动爬虫(后台线程执行) - 实时查看爬虫日志 - 查看 Redis 连接状态和去重记录数 - 查看 SQLite 商品总数 --- ## 可视化看板 ### 六大功能页面 | 页面 | 功能 | 图表 | |------|------|------| | 数据概览 | 统计卡片 + 价格/销量/品牌分布 | 饼图、直方图 | | 竞品分析 | 按类别筛选,品牌价格对比 | 箱线图、散点图 | | 安全监控 | 爬虫日志查看与筛选 | 日志表格 | | JSON 视图 | 商品原始数据 JSON 格式查看 | JSON 展示 | | 爬虫控制 | 爬虫启停 + 实时日志 + 系统状态 | 状态卡片 | | 数据管理 | 商品 CRUD + 批量删除 | 数据表格 | ### 图表组件 | 组件 | 用途 | |------|------| | `pie_chart()` | 品牌占比、分类分布 | | `histogram()` | 价格区间分布 | | `box_plot()` | 各品牌价格分布对比 | | `scatter_plot()` | 价格 vs 销量散点 | --- ## 配置说明 所有配置集中在 `utils/config.py`,支持环境变量覆盖: ```python # Redis 配置 REDIS_HOST=localhost # 环境变量: REDIS_HOST REDIS_PORT=6379 # 环境变量: REDIS_PORT REDIS_DB=0 # 环境变量: REDIS_DB REDIS_PASSWORD=None # 环境变量: REDIS_PASSWORD # 爬虫配置 DOWNLOAD_DELAY=2 # 下载延迟(秒) CONCURRENT_REQUESTS=2 # 并发请求数 MAX_PAGES=5 # 默认爬取页数 RETRY_TIMES=3 # 最大重试次数 # SQLite 配置 TAOBAO_DB_PATH=data/taobao.db # 环境变量: TAOBAO_DB_PATH ``` --- ## 注意事项 1. **首次运行**:爬虫会打开 Chrome 浏览器,首次需手动扫码登录淘宝,登录态会持久化到 `data/chrome_profile/` 2. **Redis 可选**:未安装 Redis 时自动降级为内存去重,分布式场景下需启动 Redis 3. **反爬风险**:本项目仅供学习研究,淘宝反爬策略持续更新,爬虫可能因页面结构变化而失效 4. **数据安全**:所有数据库操作使用参数化查询,防止 SQL 注入 5. **并发控制**:默认并发 2 + 2秒延迟,请勿设置过高以免触发封禁 6. **Chrome 版本**:需与本机 Chrome 版本匹配的 ChromeDriver(或使用 Selenium 4+ 自动管理) --- ## 技术亮点 - **Scrapy + Selenium 混合架构**:利用 Scrapy 的管道/中间件机制管理 Selenium 爬虫,async start 对接 Scrapy 2.13+ 引擎 - **双重反指纹**:selenium-stealth 修补 JS 指纹 + CDP 注入补充反检测脚本,覆盖 webdriver/plugins/permissions 等检测点 - **Redis/内存双模式去重**:Pipeline 启动时探测 Redis 可用性,不可用时自动降级为内存 set,保证单机可用 - **100+ 品牌词典三级回退**:关键词匹配 → 店铺名提取 → 首词回退,覆盖手机/电脑/家电/音频等品类 - **多选择器容错定位**:商品卡片使用 12+ CSS 选择器链式回退 + 链接反查父级卡片终极兜底 - **Web 端爬虫控制**:Streamlit + threading 异步启动爬虫子进程,实时日志输出与状态监控