# crawl_price 获取各平台商品价格,批发价格 ## 功能特性 - 支持多平台:淘宝、京东、1688批发平台 - 支持批发价格获取(1688平台) - 支持并发爬取 - 支持 Cookie 和代理配置 - 数据持久化到 MySQL 数据库 - 价格历史记录追踪 ## 项目结构 ``` crawl_price/ ├── config/ # 配置文件 │ ├── __init__.py │ └── settings.py # 数据库、爬虫、日志配置 ├── crawlers/ # 爬虫实现 │ ├── __init__.py │ ├── base.py # 爬虫基类 │ ├── taobao.py # 淘宝爬虫 │ ├── jd.py # 京东爬虫 │ └── alibaba1688.py # 1688批发平台爬虫 ├── models/ # 数据库模型 │ ├── __init__.py │ └── product.py # 商品和价格历史模型 ├── utils/ # 工具函数 │ ├── __init__.py │ ├── db_utils.py # 数据库操作工具 │ └── helpers.py # 通用辅助函数 ├── logs/ # 日志目录 ├── main.py # 主程序入口 ├── requirements.txt # 依赖文件 ├── .env.example # 环境变量示例 └── .gitignore ``` ## 安装 ### 1. 安装依赖 ```bash pip install -r requirements.txt ``` ### 2. 配置环境变量 复制 `.env.example` 为 `.env` 并修改配置: ```bash cp .env.example .env ``` 编辑 `.env` 文件: ```env # 数据库配置 DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=price_crawler DB_USER=root DB_PASSWORD=your_password # 可选:代理配置 # HTTP_PROXY=http://127.0.0.1:7890 # HTTPS_PROXY=http://127.0.0.1:7890 ``` ### 3. 创建数据库 ```sql CREATE DATABASE price_crawler CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ## 使用方法 ### 查看帮助 ```bash python main.py --help ``` ### 初始化数据库 ```bash python main.py --mode init ``` ### 爬取商品 #### 基本用法 ```bash # 爬取淘宝的"手机"商品 python main.py --mode crawl --platforms taobao --keywords 手机 # 爬取淘宝和京东的"手机"商品,各爬取2页 python main.py --mode crawl --platforms taobao jd --keywords 手机 --pages 2 # 爬取1688批发平台的"服装"商品 python main.py --mode crawl --platforms alibaba1688 --keywords 服装 --pages 3 # 多个关键词 python main.py --mode crawl --platforms taobao --keywords 手机 电脑 平板 --pages 1 ``` #### 并发爬取 ```bash # 使用3个线程并发爬取多个平台 python main.py --mode crawl --platforms taobao jd alibaba1688 --keywords 手机 --pages 2 --workers 3 ``` #### 使用 Cookie 和代理 由于淘宝、京东、1688等平台有较强的反爬机制,建议使用 Cookie 或代理: ```bash # 使用 Cookie python main.py --mode crawl --platforms taobao --keywords 手机 --cookie "your_cookie_here" # 使用代理 python main.py --mode crawl --platforms taobao --keywords 手机 --proxy "http://127.0.0.1:7890" # 同时使用 Cookie 和代理 python main.py --mode crawl --platforms taobao --keywords 手机 --cookie "your_cookie" --proxy "http://127.0.0.1:7890" ``` ### 搜索数据库中的商品 ```bash # 搜索所有平台的"手机"商品 python main.py --mode search --keyword 手机 # 搜索指定平台 python main.py --mode search --keyword 手机 --platform taobao # 限制返回数量 python main.py --mode search --keyword 手机 --limit 20 ``` ### 显示统计信息 ```bash python main.py --mode stats ``` ## 数据库模型 ### products 表(商品表) | 字段 | 类型 | 说明 | |------|------|------| | id | Integer | 主键 | | product_id | String(100) | 平台商品ID | | name | String(500) | 商品名称 | | url | Text | 商品链接 | | image_url | Text | 商品图片 | | shop_name | String(200) | 店铺名称 | | platform | String(50) | 平台: taobao/jd/alibaba1688 | | is_wholesale | Integer | 是否批发: 0-否, 1-是 | | min_order_quantity | Integer | 最小起订量(批发) | | current_price | Float | 当前价格 | | original_price | Float | 原价 | | sales_volume | Integer | 销量 | | create_time | DateTime | 创建时间 | | update_time | DateTime | 更新时间 | | crawl_time | DateTime | 爬取时间 | ### price_history 表(价格历史表) | 字段 | 类型 | 说明 | |------|------|------| | id | Integer | 主键 | | product_id | String(100) | 商品ID | | price | Float | 价格 | | original_price | Float | 原价 | | platform | String(50) | 平台 | | price_type | String(50) | 价格类型: retail/wholesale | | min_quantity | Integer | 最小起订量 | | crawl_time | DateTime | 爬取时间 | ## 各平台特点 ### 淘宝 (Taobao) - 支持搜索、商品详情获取 - 需要配置 Cookie 以获得更好的爬取效果 - 价格为零售价 ### 京东 (JD) - 支持搜索、商品详情获取 - 有独立的价格 API 接口 - 价格为零售价 ### 1688 批发平台 (Alibaba1688) - 支持搜索、商品详情获取 - **重点:批发价格区间**(根据起订量不同价格不同) - 支持最小起订量获取 - 价格为批发价 ## 代码示例 ### 基本用法 ```python from crawlers.taobao import TaobaoCrawler from crawlers.jd import JdCrawler from crawlers.alibaba1688 import Alibaba1688Crawler # 淘宝爬虫 with TaobaoCrawler(cookie='your_cookie', proxy='http://127.0.0.1:7890') as crawler: products = crawler.search('手机', page=1) for product in products: print(f"{product['name']}: ¥{product['price']}") # 1688批发爬虫 with Alibaba1688Crawler() as crawler: products = crawler.search('服装', page=1) for product in products: print(f"{product['name']}") print(f" 起订量: {product.get('min_order_quantity', 'N/A')}") print(f" 价格区间: {product.get('price_ranges', [])}") ``` ### 批量爬取并保存到数据库 ```python from main import run_crawl, init_database # 初始化数据库 init_database() # 并发爬取多个平台 results = run_crawl( platforms=['taobao', 'jd', 'alibaba1688'], keywords=['手机', '电脑'], pages=2, concurrent=True, max_workers=3 ) print(f"淘宝: {len(results.get('taobao', []))} 个商品") print(f"京东: {len(results.get('jd', []))} 个商品") print(f"1688: {len(results.get('alibaba1688', []))} 个商品") ``` ## 注意事项 1. **反爬机制**:淘宝、京东、1688等平台有较强的反爬机制,建议: - 配置有效的 Cookie - 使用代理 IP 池 - 设置合理的请求间隔 - 避免短时间内大量请求 2. **Cookie 获取**:登录对应平台后,从浏览器开发者工具中复制 Cookie。 3. **频率控制**:程序已内置随机延迟机制,但仍需注意爬取频率,避免被封禁。 4. **数据更新**:价格可能随时变动,建议定期重新爬取以获取最新价格。 ## License MIT License