
基于Python+大数据的淘宝电子产品数据分析系统设计与实现
今天带来的是基于Python+大数据的淘宝电子产品数据分析系统设计与实现,大数据的淘宝电子产品数据分析能够推进网上用户查看爬取下的大数据电子产品总数、商品品牌的普及。同传统的人工统计数据模式相比,大数据的淘宝电子产品数据分析具有较多的优势。本课题就是以淘宝电子产品分析可视化系统爬取为例,介绍网络爬虫的基本原理,Python环境的搭建,PyCharm scrapy模块的爬虫数据的运用,把获取到的数据
💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例-200套
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人
一.前言
随着互联网技术的不断和快速发展,网络与大数据很早就成为了人们生活中的一部分,大数据的淘宝电子产品数据分析由于其特有的便捷性,用户能够更加容易地接受。互联网有了这种便捷数据分析形式,也是一种新型的全新应用形式。从侧面来看,大数据的淘宝电子产品数据分析还能够推进网上用户查看爬取下的大数据电子产品总数、商品品牌的普及。
同传统的人工统计数据模式相比,大数据的淘宝电子产品数据分析具有较多的优势。建立规范化的流程通常可以解决用户查询商品类别、商品毛重、品牌价格分析问题,而目前如果需要管理网站爬取下的大数据,管理员依然以人工的方式进行管理的话太过于落后。大数据的淘宝电子产品数据分析处理数据越来越趋于信息化,这种模式需要依赖于智能化手段管理。随着科技发展的进步与大数据的普及,信息技术能够改善我们的生活,现在许多生活场景都需要信息化技术帮助改善我们的生活。
本课题就是以淘宝电子产品分析可视化系统爬取为例,介绍网络爬虫的基本原理,Python环境的搭建,PyCharm scrapy模块的爬虫数据的运用,把获取到的数据进行清洗、整合,储存数据到MySQL,然后进行数据可视化的呈现,简单对呈现的图进行数据分析。
二.技术环境
开发语言:Python
python框架:django
软件版本:python3.7/python3.8
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
爬虫框架:Scrapy
开发软件:PyCharm/vs code
前端框架:vue.js
三.功能设计
系统功能结构图是系统设计阶段,系统功能结构图只是这个阶段一个基础,整个系统的架构决定了系统的整体模式,是系统的根据。系统总体结构图如图所示。
四.数据设计
概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:
五.部分效果展示
系统管理员功能实现效果
在登录界面中需要使用el-input标签实现输入框供管理员输入用户名和密码,需要使用name标签表示不同的信息。在登录界面中还需要包括角色的按钮,使用el-radio表示按钮,管理员可以点击按钮从而选择不同的角色,如图所示。
管理员登录进入大数据的淘宝电子产品数据分析可以查看系统首页、个人中心、电子产品管理、系统管理等功能,进行详细操作,如图所示。
管理员点击电子产品管理;在电子产品管理页面输入来源、标题、封面、价格、品牌、商品毛重、商品产地、类别、商品编号等信息,进行查询,爬起数据或删除电子产品等操作;如图所示。
管理员点击系统管理;在系统管理页面输入关于我们、系统简介等信息,进行查询,修改系统信息等操作;如图所示。
数据可视化分析大屏展示实现效果
大数据的淘宝电子产品数据分析展示图,如图所示。
下面展示是商品品牌,对于商品品牌大数据,数据获取之后,开始对这些数据进行可视化分析,首先是商品品牌的基本情况,其中根据爬取的数据以饼状图的形式来展示,如图所示。
下面展示是商品产地,对于商品产地大数据获取之后,开始对这些数据进行可视化分析,首先通过页面查看商品产地详情以饼状图分析进行来展示,如图所示。
在商品类别页面以条形图进行展示所示。
下图是商品毛重,通过python爬取清洗后的数据以条形图形式展示如图所示:
六.部分功能代码
# 数据爬取文件
import scrapy
import pymysql
import pymssql
from ..items import DianzichanpinItem
import time
from datetime import datetime,timedelta
import re
import random
import platform
import json
import os
import urllib
from urllib.parse import urlparse
import requests
import emoji
# 电子产品
class DianzichanpinSpider(scrapy.Spider):
name = 'dianzichanpinSpider'
spiderUrl = 'https://search.jd.com/s_new.php?keyword=%E7%94%B5%E5%AD%90%E4%BA%A7%E5%93%81&pvid=a94b7c4f9cb54d89aa8cef3cd927d129&page={}&s=56&click=0'
start_urls = spiderUrl.split(";")
protocol = ''
hostname = ''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def start_requests(self):
plat = platform.system().lower()
if plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, 'p8xx9_dianzichanpin') == 1:
cursor.close()
connect.close()
self.temp_data()
return
pageNum = 1 + 1
for url in self.start_urls:
if '{}' in url:
for page in range(1, pageNum):
next_link = url.format(page)
yield scrapy.Request(
url=next_link,
callback=self.parse
)
else:
yield scrapy.Request(
url=url,
callback=self.parse
)
# 列表解析
def parse(self, response):
_url = urlparse(self.spiderUrl)
self.protocol = _url.scheme
self.hostname = _url.netloc
plat = platform.system().lower()
if plat == 'windows_bak':
pass
elif plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, 'p8xx9_dianzichanpin') == 1:
cursor.close()
connect.close()
self.temp_data()
return
list = response.css('ul[class="gl-warp clearfix"] li.gl-item')
for item in list:
fields = DianzichanpinItem()
if '(.*?)' in '''div.p-img a::attr(href)''':
try:
fields["laiyuan"] = re.findall(r'''div.p-img a::attr(href)''', item.extract(), re.DOTALL)[0].strip()
except:
pass
else:
fields["laiyuan"] = self.remove_html(item.css('div.p-img a::attr(href)').extract_first())
if fields["laiyuan"].startswith('//'):
fields["laiyuan"] = self.protocol + ':' + fields["laiyuan"]
elif fields["laiyuan"].startswith('/'):
fields["laiyuan"] = self.protocol + '://' + self.hostname + fields["laiyuan"]
elif fields["laiyuan"].startswith('http'):
pass
else:
fields["laiyuan"] = self.protocol + '://' + self.hostname + '/' + fields["laiyuan"]
if '(.*?)' in '''div.p-img a img::attr(data-lazy-img)''':
try:
fields["fengmian"] = re.findall(r'''div.p-img a img::attr(data-lazy-img)''', item.extract(), re.DOTALL)[0].strip()
except:
pass
else:
fields["fengmian"] = self.remove_html(item.css('div.p-img a img::attr(data-lazy-img)').extract_first())
if fields["fengmian"].startswith('//'):
fields["fengmian"] = self.protocol + ':' + fields["fengmian"]
elif fields["fengmian"].startswith('/'):
fields["fengmian"] = self.protocol + '://' + self.hostname + fields["fengmian"]
elif fields["fengmian"].startswith('http'):
pass
else:
fields["fengmian"] = self.protocol + '://' + self.hostname + '/' + fields["fengmian"]
if '(.*?)' in '''div.p-price strong i::text''':
try:
fields["jiage"] = re.findall(r'''div.p-price strong i::text''', item.extract(), re.DOTALL)[0].strip()
except:
pass
else:
fields["jiage"] = self.remove_html(item.css('div.p-price strong i::text').extract_first())
detailUrlRule = item.css('div.p-img a::attr(href)').extract_first()
if self.protocol in detailUrlRule:
pass
elif detailUrlRule.startswith('//'):
detailUrlRule = self.protocol + ':' + detailUrlRule
else:
detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
# fields["laiyuan"] = detailUrlRule
yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse, dont_filter=True)
# 详情解析
def detail_parse(self, response):
fields = response.meta['fields']
try:
if '(.*?)' in '''div.sku-name''':
fields["biaoti"] = re.findall(r'''div.sku-name''', response.text, re.S)[0].strip()
else:
if 'biaoti' != 'xiangqing' and 'biaoti' != 'detail' and 'biaoti' != 'pinglun' and 'biaoti' != 'zuofa':
fields["biaoti"] = self.remove_html(response.css('''div.sku-name''').extract_first())
else:
fields["biaoti"] = emoji.demojize(response.css('''div.sku-name''').extract_first())
except:
pass
try:
if '(.*?)' in '''ul#parameter-brand li a::text''':
fields["pinpai"] = re.findall(r'''ul#parameter-brand li a::text''', response.text, re.S)[0].strip()
else:
if 'pinpai' != 'xiangqing' and 'pinpai' != 'detail' and 'pinpai' != 'pinglun' and 'pinpai' != 'zuofa':
fields["pinpai"] = self.remove_html(response.css('''ul#parameter-brand li a::text''').extract_first())
else:
fields["pinpai"] = emoji.demojize(response.css('''ul#parameter-brand li a::text''').extract_first())
except:
pass
try:
if '(.*?)' in '''</li>.*<li title='(.*?)'>商品毛重''':
fields["spmz"] = re.findall(r'''</li>.*<li title='(.*?)'>商品毛重''', response.text, re.S)[0].strip()
else:
if 'spmz' != 'xiangqing' and 'spmz' != 'detail' and 'spmz' != 'pinglun' and 'spmz' != 'zuofa':
fields["spmz"] = self.remove_html(response.css('''</li>.*<li title='(.*?)'>商品毛重''').extract_first())
else:
fields["spmz"] = emoji.demojize(response.css('''</li>.*<li title='(.*?)'>商品毛重''').extract_first())
except:
pass
try:
if '(.*?)' in '''</li>.*<li title='(.*?)'>商品产地''':
fields["spcd"] = re.findall(r'''</li>.*<li title='(.*?)'>商品产地''', response.text, re.S)[0].strip()
else:
if 'spcd' != 'xiangqing' and 'spcd' != 'detail' and 'spcd' != 'pinglun' and 'spcd' != 'zuofa':
fields["spcd"] = self.remove_html(response.css('''</li>.*<li title='(.*?)'>商品产地''').extract_first())
else:
fields["spcd"] = emoji.demojize(response.css('''</li>.*<li title='(.*?)'>商品产地''').extract_first())
except:
pass
try:
if '(.*?)' in '''</li>.*<li title='(.*?)'>类别''':
fields["leibie"] = re.findall(r'''</li>.*<li title='(.*?)'>类别''', response.text, re.S)[0].strip()
else:
if 'leibie' != 'xiangqing' and 'leibie' != 'detail' and 'leibie' != 'pinglun' and 'leibie' != 'zuofa':
fields["leibie"] = self.remove_html(response.css('''</li>.*<li title='(.*?)'>类别''').extract_first())
else:
fields["leibie"] = emoji.demojize(response.css('''</li>.*<li title='(.*?)'>类别''').extract_first())
except:
pass
try:
if '(.*?)' in '''</li>.*<li title='(.*?)'>商品编号''':
fields["spbh"] = re.findall(r'''</li>.*<li title='(.*?)'>商品编号''', response.text, re.S)[0].strip()
else:
if 'spbh' != 'xiangqing' and 'spbh' != 'detail' and 'spbh' != 'pinglun' and 'spbh' != 'zuofa':
fields["spbh"] = self.remove_html(response.css('''</li>.*<li title='(.*?)'>商品编号''').extract_first())
else:
fields["spbh"] = emoji.demojize(response.css('''</li>.*<li title='(.*?)'>商品编号''').extract_first())
except:
pass
return fields
# 去除多余html标签
def remove_html(self, html):
if html == None:
return ''
pattern = re.compile(r'<[^>]+>', re.S)
return pattern.sub('', html).strip()
# 数据库连接
def db_connect(self):
type = self.settings.get('TYPE', 'mysql')
host = self.settings.get('HOST', 'localhost')
port = int(self.settings.get('PORT', 3306))
user = self.settings.get('USER', 'root')
password = self.settings.get('PASSWORD', '123456')
try:
database = self.databaseName
except:
database = self.settings.get('DATABASE', '')
if type == 'mysql':
connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
else:
connect = pymssql.connect(host=host, user=user, password=password, database=database)
return connect
# 断表是否存在
def table_exists(self, cursor, table_name):
cursor.execute("show tables;")
tables = [cursor.fetchall()]
table_list = re.findall('(\'.*?\')',str(tables))
table_list = [re.sub("'",'',each) for each in table_list]
if table_name in table_list:
return 1
else:
return 0
# 数据缓存源
def temp_data(self):
connect = self.db_connect()
cursor = connect.cursor()
sql = '''
insert into `dianzichanpin`(
id
,laiyuan
,biaoti
,fengmian
,jiage
,pinpai
,spmz
,spcd
,leibie
,spbh
)
select
id
,laiyuan
,biaoti
,fengmian
,jiage
,pinpai
,spmz
,spcd
,leibie
,spbh
from `p8xx9_dianzichanpin`
where(not exists (select
id
,laiyuan
,biaoti
,fengmian
,jiage
,pinpai
,spmz
,spcd
,leibie
,spbh
from `dianzichanpin` where
`dianzichanpin`.id=`p8xx9_dianzichanpin`.id
))
limit {0}
'''.format(random.randint(10,15))
cursor.execute(sql)
connect.commit()
connect.close()
最后
更多推荐
所有评论(0)