首页 > 编程语言 >【Python数据爬取课程设计】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

【Python数据爬取课程设计】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

时间:2023-12-30 16:55:23浏览次数:35  
标签:课程设计 plt df money list data 爬取 手机 数据

一、选题的背景

  随着互联网的快速发展,大数据已经成为各行各业决策的重要依据。在电商领域,京东作为国内领先的电商平台,积累了大量的用户购买数据。这些数据中蕴含着丰富的品牌信息,对于手机品牌来说,分析这些数据可以帮助他们更好地了解市场趋势、消费者需求以及竞品情况。然而,目前对于京东手机品牌信息的大数据分析还存在一些问题。首先,数据量庞大,处理难度较高,需要借助先进的大数据处理技术进行分析。其次,数据来源众多,不同来源的数据之间存在差异,需要进行数据清洗和整合。此外,现有的数据分析方法大多基于简单的统计和描述性分析,缺乏深入的挖掘和可视化展示,难以满足决策者对于数据洞察的需求。因此,本文旨在通过对京东手机品牌信息的大数据分析,利用数据挖掘和可视化技术,深入挖掘市场趋势、消费者需求以及竞品情况,为手机品牌的市场营销和战略决策提供有力支持。通过本次研究,我们希望能够解决上述问题,为手机品牌提供更加全面、深入的数据分析服务,帮助他们更好地了解市场和消费者,制定更加精准的市场营销策略,提高品牌竞争力和市场份额。同时,本研究也为其他电商平台和行业提供了一个参考案例,有助于推动大数据在电商领域的应用和发展。

二、大数据分析设计方案

1.数据集来源:https://search.jd.com

2.实现思路:

(1)数据爬取

  首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性,需要设置合理的爬虫策略,并处理可能出现的反爬机制。

(2)数据清洗与整合

  采集到的原始数据可能存在格式不统一、缺失值、异常值等问题,需要进行数据清洗和整合。清洗过程中需要处理缺失值、异常值,并对数据进行标准化处理。此外,还需要将不同来源的数据进行整合,形成一个统一的数据集。

(3)数据分析

  在数据清洗和整合的基础上,我们进行深入的数据分析。首先,可以通过描述性统计方法对手机品牌的基本情况进行统计分析,如品牌数量、市场份额等。其次,利用关联规则挖掘、聚类分析等数据挖掘方法对品牌之间的关联和分类进行分析。此外,还可以结合时间序列分析方法,对市场趋势进行预测。为了更加直观地展示数据分析结果,我们可以借助数据可视化技术将结果进行可视化展示。可以使用Python中的Matplotlib、Seaborn等可视化库进行图表绘制,如饼图、柱状图、散点图等。同时,可以利用数据可视化工具进行交互式的数据展示,提高可视化效果的可读性和易用性。

3.技术难点:

(1)数据获取

  在数据获取阶段,需要从京东平台爬取手机品牌的相关数据。由于京东的反爬机制较为严格,可能会遇到诸如IP被封、需要登录等挑战。此外,如何有效地从网页中提取所需的数据也是一大难点。

(2)数据清洗与整合

  原始数据可能存在缺失值、异常值等问题,需要进行数据清洗和整合。对于缺失值,需要根据业务实际情况进行处理,如填充缺失值、删除含有缺失值的记录等。对于异常值,需要结合业务逻辑和数据分布情况进行分析和处理。此外,如何将不同来源的数据进行有效整合也是一大难点。

(3)数据分析与可视化

  在数据分析阶段,需要利用合适的分析方法对数据进行深入挖掘。这需要具备一定的数据挖掘和统计学知识,选择合适的方法对数据进行处理和分析。在可视化阶段,如何将数据分析结果以直观、易懂的方式展示出来是一大难点。此外,如何选择合适的可视化工具和图表类型也是需要考虑的问题。

三、数据分析步骤

(1)数据api接口获取

   获取京东手机品牌信息数据api接口并保存为“京东手机.csv”文件

def save_data(data_list):
global lock
lock.acquire()
try:
with open("京东手机.csv", "a+", encoding='utf-8-sig', newline='') as csvfile:
writer = csv.writer(csvfile)
# 以读的方式打开csv 用csv.reader方式判断是否存在标题。
with open("京东手机.csv", "r", encoding='utf8', newline='') as f:
reader = csv.reader(f)
if not [row for row in reader]:
# 先写入每一列的标题
writer.writerow(
["商品编号", "商品标题", "价格", "品牌", "商品名称", "商品毛重",
"商品产地", "CPU型号", "运行内存", "机身颜色", "三防标准", "屏幕分辨率", "充电功率",
"机身色系", "屏幕材质", "后摄主像素", '机身内存',"风格", "店铺名称",'商品图片',
"详情链接"])
# 再写入每一列的内容
writer.writerows([data_list])
csvfile.flush()
else:
writer.writerows([data_list])
csvfile.flush()
finally:
lock.release()

def get_index(url):
print(f'抓取 {url}')
response = requests.get(url,headers).text # 调用请求数据方法
soup = BeautifulSoup(response, 'lxml') # 实例化BeautifulSoup对象
J_goodsList = soup.find('div', id='J_goodsList').find_all('li') # 匹配商品信息
for j_good in J_goodsList: # 循环遍历
try:
sku_id = j_good['data-sku'] + '\t' # 商品编号
ad_title = j_good.find('div', class_='p-name').find('em').text.replace('<font class="skcolor_ljg">',
'').replace('</font>', '').replace(
'\n', '') # 商品标题
pc_price = j_good.find('div', class_='p-price').find('i').text # 商品价格
shop_name = j_good.find('div', class_='p-shop').find('a')['title'] # 商家名称
p_img = 'https:' + j_good.find('div', class_='p-img').find('img')['data-lazy-img'] # 商品图片
link_url = 'https:' + j_good.find('a')['href'] # 商品链接

print(sku_id, ad_title, pc_price, shop_name, link_url)
pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = get_detail_info(link_url)
data_list = [sku_id, ad_title, pc_price,pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge, shop_name,p_img, link_url]
#print(data_list)
save_data(data_list)
time.sleep(random.random() + 5)
except:
continue

  

  结果:

  

  

  

(2)数据清洗与整合

  1、导入数据集

1 import pandas as pd
2 import os
3 
4 # 读取csv文件
5 file_path = r"京东手机.csv"
6 df = pd.read_csv(file_path)

  

  2、删除重复行

   1 pd.drop_duplicates(df.duplicated()) 

  

  3、将编号改为字符类型

   1 df["商品编号"] = df["商品编号"].astype("str") 

  

  4、填充缺失值

   1 df["机身内存"].fillna("未知", inplace = True) 

 

  5、将清洗后的数据整合并保存至“京东手机_清洗后.csv”文件

  

  

 

(3)数据可视化分析

1、折线图 - 京东售卖手机屏幕材质分布
 1 # 1、折线图 - 京东售卖手机屏幕材质分布
 2         df = data['屏幕材质'].value_counts()
 3         x = df.index
 4         y = df.values
 5         # 设置画布的尺寸
 6         plt.figure(figsize=(12, 10))
 7         # 创建折线图
 8         plt.plot(x, y)
 9         # 添加标题
10         plt.title('京东售卖手机屏幕材质分布')
11         # 设置横坐标字体倾斜
12         plt.xticks(rotation=-80)
13         # 图上显示数字
14         for i in range(len(x)):
15             plt.text(x[i], y[i], y[i], ha='center', va='bottom')
16         plt.ylabel('数量')
17         plt.show()

  结果:

  

  由此折线图可以看出,大多数手机都采取直屏的材质分布。

 

  2、条形图 - 出售手机排名前十的店铺分布
  
 1   # 2、条形图 - 出售手机排名前十的店铺分布
 2         df = data['店铺名称'].value_counts().sort_values(ascending=False)[:10]
 3         x = df.index
 4         y = df.values
 5         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
 6         # 创建条形图
 7         plt.bar(x, y)
 8         # 添加标题
 9         plt.title('出售手机排名前十的店铺')
10         # 设置横坐标字体倾斜
11         plt.xticks(rotation=-80)
12         # 图上显示数字
13         for i in range(len(x)):
14             plt.text(x[i], y[i], y[i], ha='center', va='bottom')
15         plt.ylabel('数量')
16         plt.show()

 

  结果:

  

 

  由此条形图可以通过对销量较好的店铺作为参考,发现哪些商品最受消费者欢迎,从而为手机品牌和商家提供有价值的参考信息,帮助他们更好地制定产品策略。

 

  

3、饼图 - 手机机身内存占比
1 # 3、饼图 - 手机机身内存占比
2         memory = data['机身内存'].value_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
5         # 添加标题
6         plt.title('手机机身内存占比')
7         plt.show()

  结果:

  

 

  

4、箱线图 - CPU型号箱线图
1 # 4、箱线图 - CPU型号箱线图
2         memory = data['CPU型号'].value_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.boxplot(memory.values.tolist())
5         # 添加标题
6         plt.title('CPU型号箱线图')
7         plt.ylabel('数量')
8         plt.show()

  结果:

  

  

5、饼图 - 手机屏幕分辨率占比
1 # 5、饼图 - 手机屏幕分辨率占比
2         memory = data['屏幕分辨率'].value_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
5         # 添加标题
6         plt.title('手机屏幕分辨率占比')
7         plt.show()

  结果: 

  

  

  6、散点图-充电功率散点
1  # 6、散点图-充电功率散点
2         df = data['充电功率'].value_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.scatter(df.index, df.values, s=10)
5         plt.title('充电功率散点')
6         plt.ylabel('数量')
7         plt.show()

  结果:

  

  

  7、饼图 - 手机价格占比
  
 1 # 7、饼图 - 手机价格占比
 2         money_list = data['价格']
 3         current_list = []
 4         for money in money_list:
 5             money = int(money)
 6             if money < 1000:
 7                 current_list.append('1000元以下')
 8             elif money >= 1000 and money < 2000:
 9                 current_list.append('1000-2000元')
10             elif money >= 2000 and money < 3000:
11                 current_list.append('2000-3000元')
12             elif money >= 3000 and money < 4500:
13                 current_list.append('3000-4500元')
14             elif money >= 4500 and money < 6000:
15                 current_list.append('4500-6000元')
16             elif money >= 6000 and money < 7500:
17                 current_list.append('6000-7500元')
18             elif money >= 7500 and money < 9000:
19                 current_list.append('7500-9000元')
20             else:
21                 current_list.append('10000元以上')
22 
23         money_list = pd.DataFrame(current_list, columns=['价格'])
24         money_list = money_list['价格'].value_counts()
25         l1 = money_list.index.tolist()
26         l2 = money_list.values.tolist()
27         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
28         plt.pie(l2, labels=l1, autopct='%1.1f%%', shadow=True, startangle=140)
29         # 添加标题
30         plt.title('手机价格占比')
31         plt.show()

  结果:

  

  

8、条形图 - 排名前十的品牌分布
 1 df = data['品牌'].value_counts().sort_values(ascending=False)[:10]
 2         x = df.index
 3         y = df.values
 4         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
 5         # 创建条形图
 6         plt.bar(x, y)
 7         # 添加标题
 8         plt.title('排名前十的品牌分布')
 9         # 设置横坐标字体倾斜
10         plt.xticks(rotation=-80)
11         # 图上显示数字
12         for i in range(len(x)):
13             plt.text(x[i], y[i], y[i], ha='center', va='bottom')
14         plt.ylabel('数量')
15         plt.show()

  结果:

  

   

  
  9、折线图 - 三防标准分布
  
 1 # 9、折线图 - 三防标准分布
 2         df = data['三防标准'].value_counts()
 3         x = df.index
 4         y = df.values
 5         # 设置画布的尺寸
 6         plt.figure(figsize=(12, 10))
 7         # 创建折线图
 8         plt.plot(x, y)
 9         # 添加标题
10         plt.title('三防标准分布')
11         # 设置横坐标字体倾斜
12         plt.xticks(rotation=-80)
13         # 图上显示数字
14         for i in range(len(x)):
15             plt.text(x[i], y[i], y[i], ha='center', va='bottom')
16         plt.ylabel('数量')
17         plt.show()

  结果:

  

 

  10、词云-手机风格词云

 

 1 #10、词云-手机风格词云
 2         words_= []   #创建列表,用来装风格列数据
 3         for word in data['风格'].values.tolist():
 4             for w in str(word).split(','):
 5                 if w!='nan':
 6                     if '未上市' not in w:
 7                         words_.append(w)
 8 
 9         df = pd.DataFrame(words_).value_counts()   #统计
10         # 创建词频字典
11         word_list = []
12         for x in df.index.tolist():
13             word_list.append(x[0])
14         word_freq = dict(zip(word_list,df.values.tolist()))
15         wordcloud = WordCloud(font_path="simfang.ttf",background_color='white', height=400, width=800,  scale=20, prefer_horizontal=0.9999).generate_from_frequencies(word_freq)
16         plt.imshow(wordcloud, interpolation="bilinear")
17         plt.title('京东售卖手机风格词云图')
18         plt.axis("off")
19         plt.show()

   结果:

   

(4)完整代码

  

  1 #获取商品手机api
  2 import csv
  3 import random
  4 import threading
  5 import time
  6 import requests
  7 from bs4 import BeautifulSoup
  8 from concurrent.futures import ThreadPoolExecutor
  9 
 10 #需要添加cookie
 11 headers = {
 12     'Origin': 'https://search.jd.com',
 13     'Referer': 'https://search.jd.com/',
 14     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
 15     'X-Referer-Page': 'https://search.jd.com/Search',
 16     'Cookie':''
 17 }
 18 
 19 lock = threading.Lock()
 20 def save_data(data_list):
 21     global lock
 22     lock.acquire()
 23     try:
 24         with open("京东手机.csv", "a+", encoding='utf-8-sig', newline='') as csvfile:
 25             writer = csv.writer(csvfile)
 26             # 以读的方式打开csv 用csv.reader方式判断是否存在标题。
 27             with open("京东手机.csv", "r", encoding='utf8', newline='') as f:
 28                 reader = csv.reader(f)
 29                 if not [row for row in reader]:
 30                     # 先写入每一列的标题
 31                     writer.writerow(
 32                         ["商品编号", "商品标题", "价格", "品牌", "商品名称", "商品毛重",
 33                          "商品产地", "CPU型号", "运行内存", "机身颜色", "三防标准", "屏幕分辨率", "充电功率",
 34                          "机身色系", "屏幕材质", "后摄主像素", '机身内存',"风格", "店铺名称",'商品图片',
 35                          "详情链接"])
 36                     # 再写入每一列的内容
 37                     writer.writerows([data_list])
 38                     csvfile.flush()
 39                 else:
 40                     writer.writerows([data_list])
 41                     csvfile.flush()
 42     finally:
 43         lock.release()
 44 
 45 def get_index(url):
 46     print(f'抓取  {url}')
 47     response = requests.get(url,headers).text  # 调用请求数据方法
 48     soup = BeautifulSoup(response, 'lxml')  # 实例化BeautifulSoup对象
 49     J_goodsList = soup.find('div', id='J_goodsList').find_all('li')  # 匹配商品信息
 50     for j_good in J_goodsList:  # 循环遍历
 51         try:
 52             sku_id = j_good['data-sku'] + '\t'  # 商品编号
 53             ad_title = j_good.find('div', class_='p-name').find('em').text.replace('<font class="skcolor_ljg">',
 54                                                                                  '').replace('</font>', '').replace(
 55                 '\n', '')  # 商品标题
 56             pc_price = j_good.find('div', class_='p-price').find('i').text  # 商品价格
 57             shop_name = j_good.find('div', class_='p-shop').find('a')['title']  # 商家名称
 58             p_img = 'https:' + j_good.find('div', class_='p-img').find('img')['data-lazy-img']  # 商品图片
 59             link_url = 'https:' + j_good.find('a')['href']  # 商品链接
 60 
 61             print(sku_id, ad_title, pc_price, shop_name, link_url)
 62             pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = get_detail_info(link_url)
 63             data_list = [sku_id, ad_title, pc_price,pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge, shop_name,p_img, link_url]
 64             #print(data_list)
 65             save_data(data_list)
 66             time.sleep(random.random() + 5)
 67         except:
 68             continue
 69 
 70 def get_detail_info(url):
 71     detail_html = requests.get(url, headers=headers).text  # 通过链接向服务器发送请求
 72     soup = BeautifulSoup(detail_html, 'lxml')  # 实例化BeautifulSoup对象
 73     p_parameter = soup.find('div', class_='p-parameter').find_all(
 74         'li')  # 查找标签为div,class为p-parameter的节点,并查找该节点下所有标签为li的节点
 75     pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''
 76     for parameter in p_parameter:  # 循环遍历获取节点信息
 77         item = parameter.text.split(':')  # 获取文本内容
 78         #print(item)
 79         if '品牌' == item[0]:
 80             pinpai = str(item[1]).replace('\n', '')
 81         elif '商品名称' == item[0]:
 82             shangpinmincheng = item[1]
 83         elif '商品毛重' == item[0]:
 84             shangpinmaozhong = item[1]
 85         elif '商品产地' == item[0]:
 86             shangpinchandi = item[1]
 87         elif 'CPU型号' == item[0]:
 88             CPUxinghao = item[1]
 89         elif '运行内存' == item[0]:
 90             yunxingneicun = item[1]
 91         elif '机身颜色' == item[0]:
 92             jishenyanse = item[1]
 93         elif '三防标准' == item[0]:
 94             sanfangbiaozhun = item[1]
 95         elif '屏幕分辨率' == item[0]:
 96             pingmufenbianlv = item[1]
 97         elif '充电功率' == item[0]:
 98             chongdiangoglv = item[1]
 99         elif '机身色系' == item[0]:
100             jishensexi = item[1]
101         elif '屏幕材质' == item[0]:
102             pingmucaizhi = item[1]
103         elif '后摄主像素' == item[0]:
104             houshezhuxiangsu = item[1]
105         elif '机身内存' == item[0] :
106             jisheneicun = item[1]
107         elif '风格' == item[0]:
108             fenge = item[1]
109 
110     return pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge
111 
112 
113 if __name__ == '__main__':
114     phone_keyword_list = ['华为手机','荣耀手机','小米手机','vivo手机','三星手机','苹果手机','努比亚手机','中兴手机','联想手机','红米手机','诺基亚手机','索尼手机','菲利普手机']
115     '''for keyword in phone_keyword_list:
116         for pn in range(1,101):
117             try:
118                 get_index(keyword,pn)
119                 time.sleep(random.random()+5)
120             except:
121                 break'''
122     url_list = []
123     for keyword in phone_keyword_list:
124         for pn in range(1, 101):
125             url = f'https://search.jd.com/Search?keyword={keyword}&page={pn}'
126             url_list.append(url)
127 
128     with ThreadPoolExecutor(max_workers=3) as executor:
129         for url in url_list:
130             executor.submit(get_index, url)

131 #数据清洗 132 import pandas as pd 133 import os 134 135 # 读取csv文件 136 file_path = r"京东手机.csv" 137 df = pd.read_csv(file_path) 138 139 # 删除重复行 140 pd.drop_duplicates(df.duplicated()) 141 # 将编号改为字符类型 142 df["商品编号"] = df["商品编号"].astype("str") 143 # 填充缺失值 144 df["机身内存"].fillna("未知", inplace = True)

145 #数据可视化分析 146 import os 147 import pandas as pd 148 import matplotlib.pyplot as plt 149 from wordcloud import WordCloud 150 plt.rcParams['font.family'] = 'Microsoft YaHei' #设置字体 151 152 def visual_analytics(): 153 file = f'京东手机_清洗后.csv' 154 if not os.path.exists(file): #判断文件是否存在 155 print(f'{file}文件不存在') 156 else: 157 file = f'京东手机_清洗后.csv' 158 data = pd.read_csv(file, encoding='utf-8') # 读取csv文件 159 160 # 1、折线图 - 京东售卖手机屏幕材质分布 161 df = data['屏幕材质'].value_counts() 162 x = df.index 163 y = df.values 164 # 设置画布的尺寸 165 plt.figure(figsize=(12, 10)) 166 # 创建折线图 167 plt.plot(x, y) 168 # 添加标题 169 plt.title('京东售卖手机屏幕材质分布') 170 # 设置横坐标字体倾斜 171 plt.xticks(rotation=-80) 172 # 图上显示数字 173 for i in range(len(x)): 174 plt.text(x[i], y[i], y[i], ha='center', va='bottom') 175 plt.ylabel('数量') 176 plt.show() 177 178 # 2、条形图 - 出售手机排名前十的店铺分布 179 df = data['店铺名称'].value_counts().sort_values(ascending=False)[:10] 180 x = df.index 181 y = df.values 182 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 183 # 创建条形图 184 plt.bar(x, y) 185 # 添加标题 186 plt.title('出售手机排名前十的店铺') 187 # 设置横坐标字体倾斜 188 plt.xticks(rotation=-80) 189 # 图上显示数字 190 for i in range(len(x)): 191 plt.text(x[i], y[i], y[i], ha='center', va='bottom') 192 plt.ylabel('数量') 193 plt.show() 194 195 # 3、饼图 - 手机机身内存占比 196 memory = data['机身内存'].value_counts() 197 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 198 plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140) 199 # 添加标题 200 plt.title('手机机身内存占比') 201 plt.show() 202 203 # 4、箱线图 - CPU型号箱线图 204 memory = data['CPU型号'].value_counts() 205 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 206 plt.boxplot(memory.values.tolist()) 207 # 添加标题 208 plt.title('CPU型号箱线图') 209 plt.ylabel('数量') 210 plt.show() 211 212 # 5、饼图 - 手机屏幕分辨率占比 213 memory = data['屏幕分辨率'].value_counts() 214 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 215 plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140) 216 # 添加标题 217 plt.title('手机屏幕分辨率占比') 218 plt.show() 219 220 # 6、散点图-充电功率散点 221 df = data['充电功率'].value_counts() 222 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 223 plt.scatter(df.index, df.values, s=10) 224 plt.title('充电功率散点') 225 plt.ylabel('数量') 226 plt.show() 227 228 # 7、饼图 - 手机价格占比 229 money_list = data['价格'] 230 current_list = [] 231 for money in money_list: 232 money = int(money) 233 if money < 1000: 234 current_list.append('1000元以下') 235 elif money >= 1000 and money < 2000: 236 current_list.append('1000-2000元') 237 elif money >= 2000 and money < 3000: 238 current_list.append('2000-3000元') 239 elif money >= 3000 and money < 4500: 240 current_list.append('3000-4500元') 241 elif money >= 4500 and money < 6000: 242 current_list.append('4500-6000元') 243 elif money >= 6000 and money < 7500: 244 current_list.append('6000-7500元') 245 elif money >= 7500 and money < 9000: 246 current_list.append('7500-9000元') 247 else: 248 current_list.append('10000元以上') 249 250 money_list = pd.DataFrame(current_list, columns=['价格']) 251 money_list = money_list['价格'].value_counts() 252 l1 = money_list.index.tolist() 253 l2 = money_list.values.tolist() 254 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 255 plt.pie(l2, labels=l1, autopct='%1.1f%%', shadow=True, startangle=140) 256 # 添加标题 257 plt.title('手机价格占比') 258 plt.show() 259 260 # 8、条形图 - 排名前十的品牌分布 261 df = data['品牌'].value_counts().sort_values(ascending=False)[:10] 262 x = df.index 263 y = df.values 264 plt.figure(figsize=(12, 10)) # 设置画布的尺寸 265 # 创建条形图 266 plt.bar(x, y) 267 # 添加标题 268 plt.title('排名前十的品牌分布') 269 # 设置横坐标字体倾斜 270 plt.xticks(rotation=-80) 271 # 图上显示数字 272 for i in range(len(x)): 273 plt.text(x[i], y[i], y[i], ha='center', va='bottom') 274 plt.ylabel('数量') 275 plt.show() 276 277 # 9、折线图 - 三防标准分布 278 df = data['三防标准'].value_counts() 279 x = df.index 280 y = df.values 281 # 设置画布的尺寸 282 plt.figure(figsize=(12, 10)) 283 # 创建折线图 284 plt.plot(x, y) 285 # 添加标题 286 plt.title('三防标准分布') 287 # 设置横坐标字体倾斜 288 plt.xticks(rotation=-80) 289 # 图上显示数字 290 for i in range(len(x)): 291 plt.text(x[i], y[i], y[i], ha='center', va='bottom') 292 plt.ylabel('数量') 293 plt.show() 294 295 #10、词云-手机风格词云 296 words_= [] #创建列表,用来装风格列数据 297 for word in data['风格'].values.tolist(): 298 for w in str(word).split(','): 299 if w!='nan': 300 if '未上市' not in w: 301 words_.append(w) 302 303 df = pd.DataFrame(words_).value_counts() #统计 304 # 创建词频字典 305 word_list = [] 306 for x in df.index.tolist(): 307 word_list.append(x[0]) 308 word_freq = dict(zip(word_list,df.values.tolist())) 309 wordcloud = WordCloud(font_path="simfang.ttf",background_color='white', height=400, width=800, scale=20, prefer_horizontal=0.9999).generate_from_frequencies(word_freq) 310 plt.imshow(wordcloud, interpolation="bilinear") 311 plt.title('京东售卖手机风格词云图') 312 plt.axis("off") 313 plt.show() 314 315 if __name__ == '__main__': 316 visual_analytics()

 

 

四、总结

  通过这次项目,我成功地利用Python对京东手机品牌信息进行了数据爬取、分析和可视化。在数据爬取阶段,我积累了丰富的爬虫经验,掌握了如何处理反爬机制和获取所需数据的方法。在数据分析阶段,我深入挖掘了手机品牌的市场趋势和消费者需求,为手机品牌提供了有价值的参考信息。在数据可视化阶段,我学会了如何将数据分析结果以直观、易懂的方式展示出来,提高了可视化的效果和易用性。综上所述,Python在京东手机品牌信息的数据爬取、分析和可视化方面具有很大的优势。通过这次项目,我不仅掌握了相关的技术和方法,还积累了丰富的实践经验。未来,我将继续学习和探索相关技术,不断提高自己的数据处理和分析能力,为手机品牌和消费者提供更加准确和有价值的信息。

 

 

 

 

 

  



 

 

  

 

标签:课程设计,plt,df,money,list,data,爬取,手机,数据
From: https://www.cnblogs.com/sunzesen/p/17936521.html

相关文章

  • 【Python爬虫课程设计】--股票数据爬取+数据分析
    一、选题课程背景  随着互联网技术的发展和信息爆炸的时代,人们对于获取和分析海量数据的需求日益增长。股票市场作为全球经济的重要风向标,其数据信息的获取和分析对于投资者、研究人员以及企业决策者具有重要的参考价值。然而,传统的股票数据分析方法往往受到数据来源限制和数据......
  • 【Python高级应用课程设计】——腾讯课堂爬虫数据可视化
    一、选题背景随着互联网的快速发展,在线教育已经成为越来越多人获取知识和技能的重要途径。其中,腾讯课堂作为国内知名的在线教育平台之一,提供了丰富的课程资源和学习机会。然而,对于广大学习者来说,如何快速有效地获取和筛选这些课程信息是一个重要的问题。此外,对于教育机构和课程提......
  • 【python爬虫课程设计】达多多抖音电商——爬虫+大数据分析可视化
    一、选题背景随着社交媒体的发展和智能手机的普及,抖音已经成为了全球最受欢迎的短视频平台之一。越来越多的用户通过抖音平台进行商品的选购和交易,使得抖音电商成为了一个热门的话题。因此,通过对抖音电商的爬虫分析,可以深入了解用户的购物偏好、热门商品和行业趋势,为电商平台和品......
  • 【Python数据分析课程设计】关于艾尔登法环武器的数据分析
    一、选题背景艾尔登法环由FromSoftware与乔治-R-R-马丁(GeorgeR.R.Martin)合作开发,以正统黑暗奇幻世界为舞台的动作RPG游戏,走进辽阔的场景与地下迷宫探索未知,挑战困难重重的险境。这款游戏带来了一个广阔的开放世界,其中包含各种奇幻生物和战斗。在游戏中,玩家将能够使用各种武器......
  • 【Python数据分析课程设计】大数据分析—科学家薪资分析
    一、选题背景介绍及选题意义本研究旨在探究影响数据科学家薪酬的因素,通过分析相关数据集来寻找这些因素与工资之间的关系。随着数据科学职业的不断发展,对于雇主和雇员来说,了解可能影响薪酬的因素非常重要。本分析将探讨各种因素,包括个人背景、工作经验、技能、地理位置等,以及这些......
  • 【Python数据分析课程设计】大数据分析—游戏销售额分析
    一、选题背景介绍游戏开发商面临着越来越多的竞争,需要制定合理的市场策略来保持竞争优势。对游戏销售额进行分析是了解游戏市场和游戏产业状况的重要手段之一。通过对游戏销售额的分析,可以了解游戏市场规模和增长趋势,评估不同类型游戏的表现,发现新的商业机会,并为游戏开发商制定......
  • 数据库查询,按年月排序,计算每月、当年每月有几条数据
    数据库查询,按年月排序,计算每月有几条数据  数据库查询,按年月排序,计算当年每月有几条数据SELECTDATE_FORMAT(inspection_date,'%Y-%m')ASDATETIME,count(*)ASnumFROMgw_inspection_datat1WHEREYEAR(inspection_date)=YEAR(CURDATE())GROUPBY......
  • [转载] JAVA开发搞了一年多的大数据,究竟干了点啥
     ​       2021年7月份加入了当前项目组,以一个原汁原味的Java开发工程师的身份进来的,来了没多久,项目组唯一一名大数据开发工程师要离职了,一时间一大堆的数据需求急需人来接手,此刻又招不来新的数据开发。没辙,我和同组的另一位Java开发同事算是临危受命,接下了大数据方面......
  • 07基于fdma ddr多路视频数据构架方案
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!7.1概述    基于AXI总线可以使用axi_interconnect的仲裁机制,同时接入多个基于AXI总线的IP,米联客的fdma采用的是A......
  • 08fdma数据通路加入sobel算法IP方案
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!8.1概述    本文实验目的:1:掌握2个uifdma_dbufIP的同时使用,以及读写通道之间的同步设计2:实现1路数据实时显示......