README.md 6.8 KB

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. 安装依赖

pip install -r requirements.txt

2. 配置环境变量

复制 .env.example.env 并修改配置:

cp .env.example .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. 创建数据库

CREATE DATABASE price_crawler CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

使用方法

查看帮助

python main.py --help

初始化数据库

python main.py --mode init

爬取商品

基本用法

# 爬取淘宝的"手机"商品
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

并发爬取

# 使用3个线程并发爬取多个平台
python main.py --mode crawl --platforms taobao jd alibaba1688 --keywords 手机 --pages 2 --workers 3

使用 Cookie 和代理

由于淘宝、京东、1688等平台有较强的反爬机制,建议使用 Cookie 或代理:

# 使用 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"

搜索数据库中的商品

# 搜索所有平台的"手机"商品
python main.py --mode search --keyword 手机

# 搜索指定平台
python main.py --mode search --keyword 手机 --platform taobao

# 限制返回数量
python main.py --mode search --keyword 手机 --limit 20

显示统计信息

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)

  • 支持搜索、商品详情获取
  • 重点:批发价格区间(根据起订量不同价格不同)
  • 支持最小起订量获取
  • 价格为批发价

代码示例

基本用法

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', [])}")

批量爬取并保存到数据库

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