Python全栈开发:电子产品价格爬虫与可视化系统
1. 项目概述
这个项目是一个典型的Web应用系统,核心功能是通过Python网络爬虫抓取电子产品信息,并将结果存储在MySQL数据库中,最后通过Django框架实现可视化展示。整套系统涵盖了从数据采集、存储到展示的全流程,是Python全栈开发的经典案例。
我在实际开发中发现,这类系统最大的价值在于解决了电子产品价格和参数信息的实时获取问题。相比人工查询,自动化爬虫能大幅提高效率,而可视化界面则让数据更直观易懂。
2. 系统架构设计
2.1 技术栈选型
选择Python作为主要开发语言有几个关键考量:
- 丰富的爬虫生态(Requests、BeautifulSoup、Scrapy等)
- Django框架成熟的ORM和模板系统
- 强大的数据可视化库(Matplotlib、Pyecharts等)
数据库选用MySQL主要考虑:
- 成熟稳定,社区支持完善
- 与Django集成度高
- 适合结构化数据存储
2.2 系统模块划分
系统主要分为三个核心模块:
- 爬虫模块:负责数据采集和清洗
- 数据库模块:负责数据存储和管理
- 可视化模块:负责数据展示和交互
3. 爬虫模块实现
3.1 目标网站分析
以京东为例,分析电子产品页面结构:
- 商品列表页:获取商品链接
- 商品详情页:提取价格、参数等关键信息
需要注意:
- 检查robots.txt协议
- 设置合理的爬取间隔
- 处理反爬机制(User-Agent、IP限制等)
3.2 爬虫代码实现
使用Requests+BeautifulSoup组合:
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } def get_product_info(url): try: resp = requests.get(url, headers=headers) soup = BeautifulSoup(resp.text, 'html.parser') # 提取商品名称 name = soup.select('.sku-name')[0].text.strip() # 提取商品价格 price = soup.select('.price')[0].text return { 'name': name, 'price': price } except Exception as e: print(f"爬取失败: {e}") return None4. 数据库设计
4.1 数据表结构
主要包含两个核心表:
产品表(Product):
- id (主键)
- name (产品名称)
- price (价格)
- update_time (更新时间)
产品参数表(Specification):
- id (主键)
- product_id (外键)
- spec_name (参数名)
- spec_value (参数值)
4.2 Django模型定义
from django.db import models class Product(models.Model): name = models.CharField(max_length=200) price = models.DecimalField(max_digits=10, decimal_places=2) update_time = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Specification(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) spec_name = models.CharField(max_length=100) spec_value = models.CharField(max_length=200) def __str__(self): return f"{self.spec_name}: {self.spec_value}"5. 可视化模块实现
5.1 前端页面设计
使用Django模板+Bootstrap实现响应式布局:
<!-- products.html --> <div class="container"> <div class="row"> {% for product in products %} <div class="col-md-4"> <div class="card"> <div class="card-body"> <h5 class="card-title">{{ product.name }}</h5> <p class="card-text">价格: ¥{{ product.price }}</p> <a href="/product/{{ product.id }}" class="btn btn-primary">查看详情</a> </div> </div> </div> {% endfor %} </div> </div>5.2 数据可视化
使用Pyecharts生成价格趋势图:
from pyecharts.charts import Line from pyecharts import options as opts def generate_price_trend(product_id): product = Product.objects.get(id=product_id) records = PriceRecord.objects.filter(product=product).order_by('record_date') dates = [r.record_date.strftime('%Y-%m-%d') for r in records] prices = [float(r.price) for r in records] line = ( Line() .add_xaxis(dates) .add_yaxis("价格走势", prices) .set_global_opts( title_opts=opts.TitleOpts(title=f"{product.name}价格走势"), tooltip_opts=opts.TooltipOpts(trigger="axis") ) ) return line.render_embed()6. 系统部署
6.1 开发环境配置
推荐使用虚拟环境:
python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows pip install django requests beautifulsoup4 pyecharts mysqlclient6.2 生产环境部署
使用Nginx+Gunicorn方案:
- 安装依赖:
sudo apt install nginx pip install gunicorn- 配置Gunicorn服务:
gunicorn --bind 0.0.0.0:8000 yourproject.wsgi:application- Nginx配置:
server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; } location /static/ { alias /path/to/your/static/files/; } }7. 常见问题与解决方案
7.1 爬虫被封禁
解决方案:
- 设置合理的请求间隔(建议3-5秒)
- 轮换User-Agent
- 使用代理IP池
7.2 数据更新不及时
优化方案:
- 设置定时任务(Celery+Redis)
- 实现增量爬取
- 添加价格变动提醒功能
7.3 可视化性能问题
优化建议:
- 添加缓存机制(Redis)
- 对大数据集进行分页
- 使用前端渲染替代后端渲染
8. 项目扩展方向
- 增加多平台数据对比功能
- 实现价格预测算法
- 添加用户收藏和比价功能
- 开发移动端应用
在实际开发中,我发现定时任务的稳定性是关键。建议使用Supervisor来监控Celery worker进程,确保爬虫任务能持续稳定运行。另外,对于频繁变动的价格数据,可以考虑使用WebSocket实现实时推送,提升用户体验。
