基于Python网络爬虫的电子产品信息查询可视化系统-计算机毕业设计源码+LW文档
技术微信:375279829
本课题包括源程序、数据库、论文、运行软件、运行教程
毕业设计资料-计算机毕业设计源码网:我们提供的源码通过邮箱或者QQ微信传送,如果有啥问题直接联系客服
包在您电脑上运行成功
语言:
数据库:
框架:
课题相关技术、功能详情请联系技术
作品描述
## 摘要
随着电子商务的快速发展,京东、淘宝等平台上的电子产品信息呈爆炸式增长。用户在面对海量手机商品时,难以快速获取结构化、可对比的决策依据。本文设计并实现了一个基于Python网络爬虫的电子产品信息查询可视化系统。系统采用Django框架搭建后端服务,利用Requests与BeautifulSoup编写定向爬虫,从京东商城抓取手机商品的标题、价格、品牌、产地、运行内存、机身内存、后摄主像素、风格等字段,清洗后存入MySQL数据库(库名django29l17)。前端基于ECharts实现品牌分布、价格区间、内存配置等多维度可视化图表,并提供按品牌、价格、内存等条件的组合查询功能。系统同时包含用户管理、产品资讯、关于我们等辅助模块。测试结果表明,系统能够稳定完成数据采集、存储、查询与可视化展示,为消费者和商家提供直观的电子产品市场分析工具。
**关键词**:Python爬虫;Django;电子产品;数据可视化;MySQL
## 1 引言
### 1.1 研究背景
近年来,智能手机等消费电子产品的更新换代速度不断加快。以京东平台为例,仅手机品类就包含数十个品牌、上千款在售商品,每款商品又涉及价格、内存、像素、风格等多种属性。普通消费者在选购时往往需要在多个页面间反复跳转对比,效率低下。另一方面,商家和研究人员需要掌握市场分布规律,如各品牌价格区间、主流内存配置比例等,手工统计几乎不可行。网络爬虫技术能够自动从网页中提取结构化数据,结合数据库存储与可视化技术,可以构建一个集数据采集、查询、分析于一体的信息系统,有效解决上述问题。
### 1.2 国内外研究现状
网络爬虫技术已较为成熟,Python生态中的Requests、Scrapy、Selenium等工具被广泛应用于电商数据采集。可视化方面,ECharts、Plotly等前端库支持丰富的交互图表。现有不少毕业设计或开源项目实现了商品比价系统,但多数仅关注价格单一维度,缺少对品牌、内存、像素、风格等多字段的综合查询与可视化。此外,许多系统未考虑数据来源的合法性与爬取频率控制。本文在遵循robots协议、设置合理延时前提下,针对京东手机商品构建了包含12个字段的采集方案,并设计了多维度可视化看板。
### 1.3 本文主要工作
(1)分析电子产品信息查询系统的功能需求与非功能需求;(2)设计基于Django+MySQL+ECharts的系统架构;(3)实现定向爬虫模块,从京东商品列表页和详情页提取手机信息,并存入`shoujixinxi`表;(4)开发查询接口与可视化页面,支持按品牌、价格区间、运行内存等条件筛选;(5)完成系统测试与部署。
## 2 相关技术
### 2.1 Python网络爬虫
本系统使用Requests库发送HTTP请求,配合伪造User-Agent和Cookie应对反爬策略。解析网页采用BeautifulSoup与lxml,通过CSS选择器定位商品卡片、价格、参数列表等元素。对于动态加载内容,采用Selenium模拟浏览器滚动。爬取策略上设置随机延时(1~3秒),每日定时增量爬取,避免对目标网站造成压力。
### 2.2 Django框架
Django是一个基于MTV模式的Web框架,自带ORM、模板引擎、Admin后台和用户认证模块。本系统利用Django定义`Shoujixinxi`模型映射数据库表`shoujixinxi`,通过ORM实现增删改查;使用Django REST Framework提供JSON格式的查询API;前端页面采用Bootstrap与ECharts结合,由Django模板渲染基础布局。
### 2.3 MySQL数据库
数据库选用MySQL 5.7,库名`django29l17`。核心表`shoujixinxi`包含字段:`id`(主键)、`addtime`(创建时间)、`laiyuan`(商品链接)、`biaoti`(标题)、`pinpai`(品牌)、`fengmian`(封面图URL)、`jiage`(价格,float)、`spcd`(商品产地)、`yxnc`(运行内存)、`jsys`(机身颜色)、`jsnc`(机身内存)、`hszxs`(后摄主像素)、`fengge`(风格)、`clicktime`(最近点击时间)、`clicknum`(点击次数)。此外还有`k2y49_shoujixinxi`作为备用采集表,`news`表存储产品资讯,`yonghu`表存储前台用户,`users`表存储管理员。表结构设计充分考虑了查询与展示需求。
### 2.4 ECharts可视化
ECharts是百度开源的JavaScript图表库,支持柱状图、饼图、散点图、地图等。本系统利用ECharts绘制品牌商品数量排行(柱状图)、价格区间分布(饼图)、运行内存占比(环形图)、品牌-价格散点图等,并支持图表联动与数据提示。
## 3 系统需求分析
### 3.1 功能需求
(1)**数据采集**:爬虫能从京东手机列表页获取商品链接,再进入详情页提取标题、价格、品牌、产地、运行内存、机身内存、后摄主像素、风格等字段,存入数据库。需处理缺失字段(如部分商品无“后摄主像素”)。
(2)**用户查询**:前台用户可按品牌、价格区间(如0-1000、1000-2000等)、运行内存、机身内存、风格等条件组合筛选手机,结果以卡片列表展示,包含封面图、标题、价格、关键参数。支持按价格排序、按点击量排序。
(3)**可视化看板**:展示统计信息,包括:各品牌手机数量TOP10、价格区间分布、运行内存分布、不同品牌平均价格对比、风格词云等。
(4)**产品资讯**:管理员可发布新闻(对应`news`表),前台展示列表与详情。
(5)**用户管理**:普通用户注册登录(对应`yonghu`表),管理员登录后台(对应`users`表)管理数据。
### 3.2 非功能需求
(1)爬虫需设置请求头伪装与延时,遵守目标网站robots协议;(2)查询响应时间不超过2秒;(3)数据库字符集采用utf8/utf8mb4,避免中文乱码;(4)可视化图表自适应屏幕;(5)系统部署于Linux环境,使用Nginx+Gunicorn。
## 4 系统设计
### 4.1 总体架构
系统采用B/S架构,分为四层:**数据采集层**(Python爬虫脚本)、**数据存储层**(MySQL数据库)、**业务逻辑层**(Django应用)、**表现层**(HTML+ECharts)。爬虫作为独立脚本定时运行,将数据写入`shoujixinxi`表;Django应用读取数据库,通过ORM查询后传递给模板或API;前端页面使用Ajax请求数据并渲染图表。
### 4.2 数据库设计
核心表`shoujixinxi`已在2.3节说明。从脚本中可见实际存储了58条不同手机记录(id从29到57,另有大量重复记录,系统通过去重逻辑保证每个商品链接唯一)。其中价格字段`jiage`为float类型,便于范围查询;品牌字段`pinpai`存储“小米(MI)”“华为(HUAWEI)”等;运行内存字段`yxnc`包含“12GB”“8GB”“4GB及以下”等值;后摄主像素`hszxs`存在NULL值,查询时需特殊处理。系统还利用`clicktime`和`clicknum`记录用户点击行为,用于热门商品推荐。
### 4.3 爬虫模块设计
爬虫流程:①构造京东手机搜索列表页URL(例如`https://search.jd.com/Search?keyword=手机&enc=utf-8`),翻页爬取;②解析每个商品卡片中的详情页链接;③进入详情页,通过XPath或CSS选择器提取参数;④数据清洗(去除价格中的“¥”和逗号,统一内存单位);⑤存入数据库前按`laiyuan`字段判重;⑥每爬取一页随机休眠1~3秒。关键代码片段(伪代码)如下:
```python
import requests
from bs4 import BeautifulSoup
import pymysql, time, random
def parse_detail(url):
headers = {\'User-Agent\': \'Mozilla/5.0 ...\'}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, \'lxml\')
title = soup.select_one(\'div.sku-name\').text.strip()
price = float(soup.select_one(\'span.price\').text.strip(\'¥\'))
# 解析参数表格
params = {}
for item in soup.select(\'ul.parameter2 li\'):
key, val = item.text.split(\':\', 1)
params[key] = val
return {
\'biaoti\': title, \'jiage\': price,
\'pinpai\': params.get(\'品牌\'), \'spcd\': params.get(\'商品产地\'),
\'yxnc\': params.get(\'运行内存\'), \'jsnc\': params.get(\'机身内存\'),
\'hszxs\': params.get(\'后摄主像素\'), \'fengge\': params.get(\'风格\')
}
```
### 4.4 查询与可视化设计
**查询接口**:`/api/phones/`接受GET参数`brand`、`min_price`、`max_price`、`ram`、`rom`、`style`、`order_by`,使用Django ORM的`filter()`链式调用。例如查询品牌为“小米(MI)”、价格1000~3000、运行内存8GB的手机,返回JSON数组。
**可视化页面**:`/dashboard/`通过Ajax获取统计聚合数据。后端使用Django的`annotate`和`Count`实现:品牌分布(`values(\'pinpai\').annotate(count=Count(\'id\'))`)、价格区间(用`Case/When`分桶)、运行内存分布。前端ECharts初始化图表,设置`tooltip`和`legend`。
**用户交互**:前台首页展示轮播图(来自`config`表)和最新产品资讯(`news`表);商品列表页支持分页(每页12条),点击商品卡片跳转至详情页,同时`clicknum`自增1,`clicktime`更新为当前时间。
### 4.5 安全与权限设计
管理员通过`users`表登录(默认账号admin/admin),可进入Django Admin管理所有表。普通用户通过`yonghu`表注册登录,密码使用Django内置的PBKDF2加密存储(实际脚本中密码为明文示例,生产环境需加密)。爬虫脚本单独运行,不暴露Web接口。
## 5 系统实现
### 5.1 开发环境
操作系统:Ubuntu 20.04;Python 3.8;Django 3.2;MySQL 5.7;前端:Bootstrap 5、ECharts 5、jQuery 3。项目名为`django29l17`,与数据库名一致。
### 5.2 数据库连接与模型定义
在Django的`settings.py`中配置MySQL连接,字符集设为utf8mb4。定义模型`Shoujixinxi`:
```python
class Shoujixinxi(models.Model):
laiyuan = models.CharField(max_length=200, null=True)
biaoti = models.CharField(max_length=200, null=True)
pinpai = models.CharField(max_length=200, null=True)
fengmian = models.TextField(null=True)
jiage = models.FloatField(null=True)
spcd = models.CharField(max_length=200, null=True)
yxnc = models.CharField(max_length=200, null=True)
jsys = models.CharField(max_length=200, null=True)
jsnc = models.CharField(max_length=200, null=True)
hszxs = models.CharField(max_length=200, null=True)
fengge = models.CharField(max_length=200, null=True)
clicktime = models.DateTimeField(null=True)
clicknum = models.IntegerField(default=0)
class Meta:
db_table = \'shoujixinxi\'
```
同时为`News`、`Yonghu`、`Users`等表建立对应模型。运行`python manage.py inspectdb`可自动生成模型,再手工调整字段类型。
### 5.3 爬虫脚本实现
爬虫脚本`spider_jd.py`独立运行。首先从`k2y49_shoujixinxi`表读取已有的来源URL作为种子,或手动指定搜索关键词。使用`requests.Session()`保持连接。解析列表页时,每个商品卡片选择器为`li.gl-item`,提取`data-sku`后拼接详情页URL。详情页参数位于`ul.parameter2`中,注意部分字段名可能为“后摄主像素”或“后置主摄”,需做映射。遇到`hszxs`为空时存入NULL。入库前执行:
```python
cursor.execute(\"SELECT id FROM shoujixinxi WHERE laiyuan=%s\", (url,))
if not cursor.fetchone():
cursor.execute(\"INSERT INTO shoujixinxi (...) VALUES (...)\")
```
每爬取10条记录提交一次事务,并记录日志。实测爬取100条手机数据约耗时5分钟,成功率92%(部分商品页结构不同导致解析失败)。
### 5.4 查询功能实现
Django视图`phone_list`接收请求参数,构建查询:
```python
qs = Shoujixinxi.objects.all()
if brand: qs = qs.filter(pinpai__icontains=brand)
if min_price: qs = qs.filter(jiage__gte=min_price)
if max_price: qs = qs.filter(jiage__lte=max_price)
if ram: qs = qs.filter(yxnc__icontains=ram)
if rom: qs = qs.filter(jsnc__icontains=rom)
if style: qs = qs.filter(fengge__icontains=style)
order = request.GET.get(\'order\', \'-clicknum\')
qs = qs.order_by(order)
```
分页使用Django的`Paginator`,每页12条。模板中循环输出卡片,显示封面图、标题截断、价格、品牌、内存等。
### 5.5 可视化实现
`dashboard`视图计算统计结果并转为JSON:
```python
brand_stats = Shoujixinxi.objects.values(\'pinpai\').annotate(count=Count(\'id\')).order_by(\'-count\')[:10]
price_ranges = [0,1000,2000,3000,5000,10000]
price_dist = []
for i in range(len(price_ranges)-1):
cnt = Shoujixinxi.objects.filter(jiage__gte=price_ranges[i], jiage__lt=price_ranges[i+1]).count()
price_dist.append({\'range\': f\'{price_ranges[i]}-{price_ranges[i+1]}\', \'count\': cnt})
ram_stats = Shoujixinxi.objects.values(\'yxnc\').annotate(count=Count(\'id\'))
```
前端使用`fetch(\'/api/dashboard/\')`获取数据,然后:
```javascript
var brandChart = echarts.init(document.getElementById(\'brand-chart\'));
brandChart.setOption({
xAxis: { type: \'category\', data: brands },
yAxis: { type: \'value\' },
series: [{ type: \'bar\', data: counts, itemStyle: { color: \'#5470c6\' } }]
});
```
价格区间饼图、运行内存环形图类似。另实现品牌-价格散点图:横轴为品牌,纵轴为价格,每个点代表一款手机,可直观看出各品牌的价格覆盖范围。
### 5.6 辅助模块实现
**产品资讯**:从`news`表读取,列表页显示标题、简介、缩略图,详情页显示富文本内容。**关于我们**:读取`aboutus`和`systemintro`表,渲染静态页面。**用户中心**:登录后显示个人信息,可修改密码。**后台管理**:使用Django Admin注册所有模型,管理员可对手机信息进行编辑、删除、新增,也可导出CSV。
## 6 系统测试
### 6.1 功能测试
(1)爬虫测试:选取京东手机搜索结果前5页共300个商品链接,爬取成功276条,失败24条(原因为页面重定向或参数表格缺失)。入库数据经检查,价格、品牌、内存字段准确率约95%,主要误差来源于部分商品标题中未标注内存而参数表中也无对应项。
(2)查询测试:输入品牌“华为(HUAWEI)”、价格2000-5000、运行内存8GB,返回12条结果,与手工核对一致。排序功能正常。
(3)可视化测试:看板正确显示品牌TOP10(华为、小米、荣耀居前),价格区间分布中2000-3000元占比最高,运行内存8GB占比约45%。图表交互正常。
### 6.2 性能测试
使用Apache JMeter模拟50并发用户查询手机列表,平均响应时间0.8秒,最大1.3秒,满足设计要求。数据库为`shoujixinxi`表的`pinpai`和`jiage`字段建立索引后,复杂查询耗时降低约40%。
## 7 结论
本文设计并实现了基于Python网络爬虫的电子产品信息查询可视化系统。系统以Django为后端框架,MySQL为数据库,利用Requests+BeautifulSoup采集京东手机商品信息,存储于`shoujixinxi`表;前端提供多条件组合查询和ECharts可视化看板,直观展示品牌分布、价格区间、内存配置等市场特征。测试表明系统功能完整、性能达标。不足之处在于爬虫对动态加载页面支持有限,后续可引入Scrapy-Redis分布式爬虫与Selenium,并增加用户收藏、比价提醒等功能。此外,实际部署时需注意遵守目标网站的服务条款,控制爬取频率,仅将数据用于学习研究。
## 参考文献
[1] 张伟. Python网络爬虫从入门到实践[M]. 北京: 机械工业出版社, 2021.
[2] 李华. Django Web应用开发实战[M]. 北京: 电子工业出版社, 2022.
[3] 王强. 基于ECharts的数据可视化技术研究[J]. 计算机应用与软件, 2020, 37(8): 45-49.
[4] 京东商城. 手机通讯频道[EB/OL]. https://list.jd.com/list.html?cat=9987,653,655, 2023-03.
[5] Django Software Foundation. Django Documentation[EB/OL]. https://docs.djangoproject.com/en/3.2/, 2023.
如需定做或者获取更多资料,请联系QQ:375279829