背景:为什么需要“比价神器”?
很多人常年在电商平台(如京东、淘宝、拼多多)上购物,却总是错过“好价”。平台促销花样百出,但对我们来说,只想要两个核心功能:
•  监控多个心仪商品的价格波动
• 判断何时买最划算
•  用图表清晰查看价格趋势
传统爬虫只是“获取一次数据”,而我们今天要构建的,是一个长期运行的价格趋势分析系统。

以下是基于Python实现的多商品价格趋势监控系统,整合了数据采集、存储、分析和可视化功能,可自动追踪多个电商平台的商品价格变化:


import requests
from bs4 import BeautifulSoup
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import schedule
import time

class PriceTracker:
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
        }
        self.conn = sqlite3.connect('price_data.db')
        self._init_db()

    def _init_db(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS prices (
                product_id TEXT,
                platform TEXT,
                price REAL,
                timestamp TEXT,
                PRIMARY KEY (product_id, platform, timestamp)
            )
        ''')
        self.conn.commit()

    def fetch_price(self, url):
        try:
            response = requests.get(url, headers=self.headers)
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 京东价格解析
            if 'jd.com' in url:
                price = soup.select_one('span.price').text.replace('¥', '')
                return float(price)
            # 天猫价格解析
            elif 'tmall.com' in url:
                price = soup.select_one('div.tm-price').text
                return float(price)
        except Exception as e:
            print(f"抓取失败: {str(e)}")
            return None

    def save_price(self, product_id, platform, price):
        cursor = self.conn.cursor()
        cursor.execute(
            "INSERT INTO prices VALUES (?, ?, ?, ?)",
            (product_id, platform, price, datetime.now().isoformat())
        )
        self.conn.commit()

    def get_price_history(self, product_id):
        query = "SELECT * FROM prices WHERE product_id = ? ORDER BY timestamp"
        df = pd.read_sql(query, self.conn, params=(product_id,))
        return df

    def plot_trend(self, product_id):
        df = self.get_price_history(product_id)
        if not df.empty:
            plt.figure(figsize=(10, 6))
            for platform in df['platform'].unique():
                platform_data = df[df['platform'] == platform]
                plt.plot(
                    pd.to_datetime(platform_data['timestamp']),
                    platform_data['price'],
                    label=platform,
                    marker='o'
                )
            plt.title(f'商品 {product_id} 价格趋势')
            plt.xlabel('日期')
            plt.ylabel('价格 (元)')
            plt.legend()
            plt.grid()
            plt.savefig(f'{product_id}_price_trend.png')
            plt.close()
            return True
        return False

系统功能说明:
1.多平台价格采集:支持京东、天猫等主流电商平台的价格抓取,通过差异化解析策略处理不同网站结构。
2.数据持久化:采用SQLite存储历史价格数据,支持按商品ID和时间戳查询。
3.趋势可视化:自动生成带平台标注的多曲线趋势图,直观展示价格波动。
4.定时监控:可配置监控频率,默认每小时自动更新价格数据。

扩展建议:
添加价格异常波动预警功能。
集成更多电商平台解析器。
增加邮件/短信通知机制。
开发Web界面展示分析结果。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐