安卓手机性能排行之安兔兔爬虫分析
安卓手机性能排行之安兔兔爬虫分析
一、选题背景
现今大多数人在购买手机的时候会优先考虑,Android和苹果这两款手机。在一般情况下,消费者购买手机都会去了解某种机型的情况,如外观、Soc(cpu、gup……)、综合测评、续航。如何去了解呢?例如bilibili看数码up主评测该机型,还有一些人会到该手机的平台上去了解数据。然后现在这个安兔兔评测(AnTuTu Benchmark)是一款专门为手机、平板电脑等产品进行性能评测的APP,你可以通过它获得精准的设备硬件信息和性能评价,并与其它产品进行横向或纵向的性能对比,能够深入了解设备信息,是全球对安卓设备信息展示最全面的APP软件。为此,此次课题通过安兔兔跑分平台,了解Android手机排行数据并做可视化分析。
二、设计方案
2.1 主题式爬虫名称
安兔兔跑分Android类爬虫系统
2.2 主题式网络爬虫爬取内容与数据特征分析
内容:手机名、cpu、gpu、ux、mem、总分。
分析:网页文本。
2.3 思路
1.查看网页结构。
2.查看网页爬取内容的位置。
3.取出数据。
2.4 难点
1.异常处理。
2.网页内容读取,xtree第三方库用法。
3.数据遍历。
4.数据批量存储。
5.整体系统设计。
三、实现步骤及代码
3.1爬虫设计
3.1.1主题页面的结构特征与特征分析
页面有Android跑分、IOS跑分、Android Soc,此次主要针对性能榜。
3.1.2Htmls 页面解析
url='手机排行榜_V9_安兔兔跑分排行_安兔兔 (antutu.com)'
页面解析:
手机名称
CPU
GPU
MEM
UX
总分
3.1.3节点查找方法与遍历方法
查找节点:
1 手机名称: 2 name = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 3 /div/ul[{}]/a/div[2]/li[1]/text()".format(a)) 4 CPU: 5 phone_cpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 6 /div/ul[{}]/a/div[2]/li[2]/text()".format(a)) 7 GPU: 8 phone_gpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 9 /div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_gpu_coun)) 10 MEM: 11 phone_mem = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 12 /div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_mem_coun)) 13 UX: 14 phone_ux = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 15 /div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_ux_coun)) 16 总分: 17 phone_sum = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1] 18 /div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_sum_coun))
遍历方法:
采用for循环把内容取出。
1 #以列表的形式储存 2 sum = name + phone_cpu + phone_gpu + phone_mem + phone_ux + phone_sum 3 print(sum) 4 # 保存数据至Phone_pop.csv 5 for j in sum: 6 # print(j)
3.1.4数据爬取与采集
代码分析:
1 # 请求访问 2 ress = requests.get(url,headers=headers) 3 ress.encoding = 'utf-8' 4 # soup = BeautifulSoup(ress.text,'lxml') 5 html = etree.HTML(ress.text) 6 # print(html) 7 # 初始化查询数据 8 a = 3 9 phone_mem_coun = 4 10 phone_ux_coun = 5 11 phone_sum_coun = 6 12 phone_gpu_coun = 3 13 # 分析手机排行榜信息:手机名称name、手机cpu分数phone_cpu、手机gpu分数phone_gpu、Mem分数phone_me、UX分数phone_ux、总分phone_sum 14 for i in range(3,127): 15 # 使用xpath定位标签 16 name = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[1]/text()".format(a)) 17 phone_cpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[2]/text()".format(a)) 18 phone_gpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_gpu_coun)) 19 phone_mem = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_mem_coun)) 20 phone_ux = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_ux_coun)) 21 phone_sum = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_sum_coun)) 22 a += 1 23 # 以列表的形式储存 24 sum = name + phone_cpu + phone_gpu + phone_mem + phone_ux + phone_sum 25 print(sum) 26 # 保存数据至Phone_pop.xlsx 27 for j in sum: 28 # print(j) 29 with open('Phone_pop.xlsx',"a",encoding='utf-8') as file1: 30 file1.writelines(sum[0] + "," + sum[1] + "," + sum[2] + "," + sum[3] + "," + sum[4] + "," + sum[5] +'\n')
3.1.5爬虫系统运行演示
3.2数据分析
导入数据:
1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 Android_phone_data = pd.read_excel(r'C:/Users/angel/Desktop/Phone_pop.xlsx') 5 Android_phone_data
显示结果:
3.2.1对数据进行清洗和处理
1 # 重复值处理 2 Android_phone_data = Android_phone_data.drop_duplicates('phone_cpu') 3 # Nan处理 4 Android_phone_data = Android_phone_data.dropna(axis = 0) 5 #删除无效行 6 # Android_phone_data = Android_phone_data.drop(['text'], axis = 1) 7 # cpu降序排列 8 Android_phone_data.sort_values(by=["phone_cpu"],inplace=True,ascending=[False]) 9 Android_phone_data
显示结果:
3.2.2数据分析与可视化
柱状图
1 # cpu降序排列 2 Android_phone_data.sort_values(by=["phone_cpu"],inplace=True,ascending=[False]) 3 Android_phone_data 4 x = Android_phone_data['name'].head(10) 5 y = Android_phone_data['phone_cpu'].head(10) 6 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 7 plt.rcParams['axes.unicode_minus']=False 8 plt.xticks(rotation=90) 9 plt.bar(x,y,alpha=0.2, width=0.6, color='b', lw=3) 10 plt.legend(loc = "best")#图例 11 plt.title("安卓手机cpuTop趋势图",fontsize=18) 12 plt.show()
显示结果:
1 Android_phone_data.sort_values(by=["phone_gpu"],inplace=True,ascending=[False]) 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_gpu'].head(10) 4 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 5 plt.rcParams['axes.unicode_minus']=False 6 plt.xticks(rotation=90) 7 plt.bar(x,y,alpha=0.2, width=0.6, color='k', lw=3) 8 plt.legend(loc = "best")#图例 9 plt.title("安卓手机gpuTop趋势图",fontsize=18) 10 plt.show()
显示结果:
1 Android_phone_data.sort_values(by=["phone_mem"],inplace=True,ascending=[False]) 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_mem'].head(10) 4 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 5 plt.rcParams['axes.unicode_minus']=False 6 plt.xticks(rotation=90) 7 plt.bar(x,y,alpha=0.2, width=0.6, color='cyan', lw=3) 8 plt.legend(loc = "best")#图例 9 plt.title("安卓手机memTop趋势图",fontsize=18) 10 plt.show()
显示结果:
1 Android_phone_data.sort_values(by=["phone_ux"],inplace=True,ascending=[False]) 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_ux'].head(10) 4 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 5 plt.rcParams['axes.unicode_minus']=False 6 plt.xticks(rotation=90) 7 plt.bar(x,y,alpha=0.2, width=0.6, color='deeppink', lw=3) 8 plt.legend(loc = "best")#图例 9 plt.title("安卓手机UxTOP10趋势图",fontsize=18) 10 plt.show()
显示结果:
1 Android_phone_data.sort_values(by=["phone_sum"],inplace=True,ascending=[False]) 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_sum'].head(10) 4 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 5 plt.rcParams['axes.unicode_minus']=False 6 plt.xticks(rotation=90) 7 plt.bar(x,y,alpha=0.2, width=0.6, color='deepskyblue', lw=3) 8 plt.legend(loc = "best")#图例 9 plt.title("安卓手机总分TOP10趋势图",fontsize=18) 10 plt.show()
显示结果:
水平图
1 # 水平图 2 plt.barh(x,y, alpha=0.2, height=0.4, color='lightcoral',label="热度", lw=3) 3 plt.title("安卓手机总分TOP10趋势图",fontsize=18) 4 plt.legend(loc = "best")#图例 5 plt.xticks(rotation=90) 6 plt.xlabel("总分",)#横坐标名字 7 plt.ylabel("手机")#纵坐标名字
显示结果:
1 # 水平图 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_cpu'].head(10) 4 plt.barh(x,y, alpha=0.2, height=0.4, color='coral',label="热度", lw=3) 5 plt.title("安卓手机CPUTOP10趋势图",fontsize=18) 6 plt.legend(loc = "best")#图例 7 plt.xticks(rotation=90) 8 plt.xlabel("总分",)#横坐标名字 9 plt.ylabel("手机")#纵坐标名字
显示结果:
1 # 水平图 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_gpu'].head(10) 4 plt.barh(x,y, alpha=0.2, height=0.4, color='darkolivegreen') 5 plt.title("安卓手机GPUTOP10趋势图",fontsize=18) 6 plt.legend(loc = "best")#图例 7 plt.xticks(rotation=90) 8 plt.xlabel("总分",)#横坐标名字 9 plt.ylabel("手机")#纵坐标名字
显示结果:
1 # 水平图 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_mem'].head(10) 4 plt.barh(x,y, alpha=0.2, height=0.4, color='darkolivegreen') 5 plt.title("安卓手机MemTOP10趋势图",fontsize=18) 6 plt.legend(loc = "best")#图例 7 plt.xticks(rotation=90) 8 plt.xlabel("总分",)#横坐标名字 9 plt.ylabel("手机")#纵坐标名字
显示结果:
1 # 水平图 2 x = Android_phone_data['name'].head(10) 3 y = Android_phone_data['phone_ux'].head(10) 4 plt.barh(x,y, alpha=0.2, height=0.4, color='chartreuse') 5 plt.title("安卓手机UXTOP10趋势图",fontsize=18) 6 plt.legend(loc = "best")#图例 7 plt.xticks(rotation=90) 8 plt.xlabel("总分",)#横坐标名字 9 plt.ylabel("手机")#纵坐标名字
显示结果:
散点图
1 # 散点图 2 x = Android_phone_data['name'].head(30) 3 y = Android_phone_data['phone_cpu'].head(30) 4 plt.scatter(x,y,color='lightgreen',marker='o',s=40,alpha=0.5) 5 plt.xticks(rotation=90) 6 plt.title("安卓手机CPU散点图") 7 plt.xlabel("总分",)#横坐标名字 8 plt.ylabel("手机")#纵坐标名字
显示结果:
1 # 散点图 2 x = Android_phone_data['name'].head(30) 3 y = Android_phone_data['phone_gpu'].head(30) 4 plt.scatter(x,y,color='magenta',marker='o',s=40,alpha=0.5) 5 plt.xticks(rotation=90) 6 plt.title("安卓手机CPU散点图") 7 plt.xlabel("总分",)#横坐标名字 8 plt.ylabel("手机")#纵坐标名字
显示结果:
盒图
1 #盒图 2 3 plt.boxplot(y) 4 plt.title("安卓手机CPU散盒图") 5 plt.show()
显示结果:
3.2.2 回归线性方程
1 #散点图 2 import seaborn as sns 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 import numpy as np 6 import warnings 7 warnings.filterwarnings("ignore") 8 four=pd.DataFrame(pd.read_excel('C:/Users/angel/Desktop/Phone_pop.xlsx')) 9 sns.regplot(x='phone_cpu',y='phone_gpu',data=four,color='r')
显示结果:
1 from sklearn import datasets 2 from sklearn.linear_model import LinearRegression 3 import pandas as pd 4 import numpy as np 5 import seaborn as sns 6 predict_model = LinearRegression() 7 three=pd.DataFrame(pd.read_excel('C:/Users/angel/Desktop/Phone_pop.xlsx')) 8 X = three['phone_cpu'].values 9 X = X.reshape(-1,1) 10 predict_model.fit(X , three['phone_gpu']) 11 np.set_printoptions(precision = 3, suppress = True) 12 a = predict_model.coef_ 13 b = predict_model.intercept_ 14 print("回归方程系数{}".format(predict_model.coef_)) 15 print("回归方程截距{0:2f}".format(predict_model.intercept_)) 16 print("线性回归预测模型表达式为{}*x+{}".format(predict_model.coef_,predict_model.intercept_))
显示结果:
3.2.3 文本分析
1 # 词云 2 import random 3 import wordcloud as wc 4 import matplotlib.pyplot as plt 5 6 bk = np.array(Image.open("wyymuc.jpg")) 7 mask = bk 8 # 定义图片尺寸 9 word_cloud = wc.WordCloud( 10 mask = mask, 11 background_color='mintcream', 12 font_path='msyhbd.ttc', 13 max_font_size=300, 14 random_state=50, 15 ) 16 text = Android_phone_data["name"] 17 text = " ".join(text) 18 # 绘制词云 19 word_cloud.generate(text) 20 plt.imshow(word_cloud) 21 plt.show()
显示结果:
3.3代码汇总
1 import requests 2 from bs4 import BeautifulSoup 3 import time 4 import random 5 import sys 6 import re 7 from tqdm import tqdm 8 from lxml import etree 9 10 # 随机头 11 USER_AGENTS = [ 12 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 13 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", 14 "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 15 "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", 16 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", 17 "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", 18 "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", 19 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", 20 "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", 21 "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", 22 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", 23 "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", 24 "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", 25 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", 26 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", 27 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", 28 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", 29 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", 30 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", 31 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", 32 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER", 33 ] 34 headers = { 35 'User-Agent':random.choice(USER_AGENTS), 36 # 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0', 37 'Connection':'keep-alive', 38 'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' 39 } 40 41 url = 'http://www.antutu.com/ranking/rank1.htm' 42 43 file = open("Phone_pop.xlsx", "a") 44 file.write("name" + "," + "phone_cpu" + "," + "phone_gpu" + "," + "phone_mem" + "," + "phone_ux" + "," + "phone_sum" + '\n') 45 file = file.close() 46 47 def Antutu(): 48 # 请求访问 49 ress = requests.get(url,headers=headers) 50 ress.encoding = 'utf-8' 51 # soup = BeautifulSoup(ress.text,'lxml') 52 html = etree.HTML(ress.text) 53 # print(html) 54 # 初始化查询数据 55 a = 3 56 phone_mem_coun = 4 57 phone_ux_coun = 5 58 phone_sum_coun = 6 59 phone_gpu_coun = 3 60 # 分析手机排行榜信息:手机名称name、手机cpu分数phone_cpu、手机gpu分数phone_gpu、Mem分数phone_me、UX分数phone_ux、总分phone_sum 61 for i in range(3,127): 62 # 使用xpath定位标签 63 name = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[1]/text()".format(a)) 64 phone_cpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[2]/text()".format(a)) 65 phone_gpu = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_gpu_coun)) 66 phone_mem = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_mem_coun)) 67 phone_ux = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_ux_coun)) 68 phone_sum = html.xpath("//*[@id='rank']/div[1]/div/div/div[1]/div/div[1]/div/ul[{}]/a/div[2]/li[{}]/text()".format(a,phone_sum_coun)) 69 a += 1 70 # 以列表的形式储存 71 sum = name + phone_cpu + phone_gpu + phone_mem + phone_ux + phone_sum 72 print(sum) 73 # 保存数据至Phone_pop.xlsx 74 for j in sum: 75 # print(j) 76 with open('Phone_pop.xlsx',"a",encoding='utf-8') as file1: 77 file1.writelines(sum[0] + "," + sum[1] + "," + sum[2] + "," + sum[3] + "," + sum[4] + "," + sum[5] +'\n') 78 79 if __name__ == '__main__': 80 Antutu() 81 82 3.3.2 数据分析 83 import numpy as np 84 import pandas as pd 85 import matplotlib.pyplot as plt 86 Android_phone_data = pd.read_excel(r'C:/Users/angel/Desktop/Phone_pop.xlsx') 87 Android_phone_data 88 # 重复值处理 89 Android_phone_data = Android_phone_data.drop_duplicates('phone_cpu') 90 # Nan处理 91 Android_phone_data = Android_phone_data.dropna(axis = 0) 92 # 删除无效行 93 # Android_phone_data = Android_phone_data.drop(['text'], axis = 1) 94 # cpu降序排列 95 Android_phone_data.sort_values(by=["phone_cpu"],inplace=True,ascending=[False]) 96 Android_phone_data 97 # gpu降序排列 98 Android_phone_data.sort_values(by=["phone_cpu"],inplace=True,ascending=[False]) 99 100 Android_phone_data 101 x = Android_phone_data['name'].head(10) 102 y = Android_phone_data['phone_cpu'].head(10) 103 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 104 plt.rcParams['axes.unicode_minus']=False 105 plt.xticks(rotation=90) 106 plt.bar(x,y,alpha=0.2, width=0.6, color='b', lw=3) 107 plt.legend(loc = "best")#图例 108 plt.title("安卓手机cpuTop趋势图",fontsize=18) 109 plt.show() 110 Android_phone_data.sort_values(by=["phone_gpu"],inplace=True,ascending=[False]) 111 x = Android_phone_data['name'].head(10) 112 y = Android_phone_data['phone_gpu'].head(10) 113 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 114 plt.rcParams['axes.unicode_minus']=False 115 plt.xticks(rotation=90) 116 plt.bar(x,y,alpha=0.2, width=0.6, color='k', lw=3) 117 plt.legend(loc = "best")#图例 118 plt.title("安卓手机gpuTop趋势图",fontsize=18) 119 plt.show() 120 Android_phone_data.sort_values(by=["phone_mem"],inplace=True,ascending=[False]) 121 x = Android_phone_data['name'].head(10) 122 y = Android_phone_data['phone_mem'].head(10) 123 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 124 plt.rcParams['axes.unicode_minus']=False 125 plt.xticks(rotation=90) 126 plt.bar(x,y,alpha=0.2, width=0.6, color='cyan', lw=3) 127 plt.legend(loc = "best")#图例 128 plt.title("安卓手机memTop趋势图",fontsize=18) 129 plt.show() 130 Android_phone_data.sort_values(by=["phone_ux"],inplace=True,ascending=[False]) 131 x = Android_phone_data['name'].head(10) 132 y = Android_phone_data['phone_ux'].head(10) 133 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 134 plt.rcParams['axes.unicode_minus']=False 135 plt.xticks(rotation=90) 136 plt.bar(x,y,alpha=0.2, width=0.6, color='deeppink', lw=3) 137 plt.legend(loc = "best")#图例 138 plt.title("安卓手机UxTOP10趋势图",fontsize=18) 139 plt.show() 140 Android_phone_data.sort_values(by=["phone_sum"],inplace=True,ascending=[False]) 141 x = Android_phone_data['name'].head(10) 142 y = Android_phone_data['phone_sum'].head(10) 143 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 144 plt.rcParams['axes.unicode_minus']=False 145 plt.xticks(rotation=90) 146 plt.bar(x,y,alpha=0.2, width=0.6, color='deepskyblue', lw=3) 147 plt.legend(loc = "best")#图例 148 plt.title("安卓手机总分TOP10趋势图",fontsize=18) 149 plt.show() 150 # 水平图 151 plt.barh(x,y, alpha=0.2, height=0.4, color='lightcoral',label="热度", lw=3) 152 plt.title("安卓手机总分TOP10趋势图",fontsize=18) 153 plt.legend(loc = "best")#图例 154 plt.xticks(rotation=90) 155 plt.xlabel("总分",)#横坐标名字 156 plt.ylabel("手机")#纵坐标名字 157 # 水平图 158 x = Android_phone_data['name'].head(10) 159 y = Android_phone_data['phone_gpu'].head(10) 160 plt.barh(x,y, alpha=0.2, height=0.4, color='darkolivegreen') 161 plt.title("安卓手机GPUTOP10趋势图",fontsize=18) 162 plt.legend(loc = "best")#图例 163 plt.xticks(rotation=90) 164 plt.xlabel("总分",)#横坐标名字 165 plt.ylabel("手机")#纵坐标名字 166 # 水平图 167 x = Android_phone_data['name'].head(10) 168 y = Android_phone_data['phone_mem'].head(10) 169 plt.barh(x,y, alpha=0.2, height=0.4, color='steelblue') 170 plt.title("安卓手机MemTOP10趋势图",fontsize=18) 171 plt.legend(loc = "best")#图例 172 plt.xticks(rotation=90) 173 plt.xlabel("总分",)#横坐标名字 174 plt.ylabel("手机")#纵坐标名字 175 # 水平图 176 x = Android_phone_data['name'].head(10) 177 y = Android_phone_data['phone_ux'].head(10) 178 plt.barh(x,y, alpha=0.2, height=0.4, color='chartreuse') 179 plt.title("安卓手机UXTOP10趋势图",fontsize=18) 180 plt.legend(loc = "best")#图例 181 plt.xticks(rotation=90) 182 plt.xlabel("总分",)#横坐标名字 183 plt.ylabel("手机")#纵坐标名字 184 # 散点图 185 x = Android_phone_data['name'].head(30) 186 y = Android_phone_data['phone_cpu'].head(30) 187 plt.scatter(x,y,color='lightgreen',marker='o',s=40,alpha=0.5) 188 plt.xticks(rotation=90) 189 plt.title("安卓手机CPU散点图") 190 plt.xlabel("总分",)#横坐标名字 191 plt.ylabel("手机")#纵坐标名字 192 # 散点图 193 x = Android_phone_data['name'].head(30) 194 y = Android_phone_data['phone_gpu'].head(30) 195 plt.scatter(x,y,color='magenta',marker='o',s=40,alpha=0.5) 196 plt.xticks(rotation=90) 197 plt.title("安卓手机CPU散点图") 198 plt.xlabel("总分",)#横坐标名字 199 plt.ylabel("手机")#纵坐标名字 200 # 盒图 201 plt.boxplot(y) 202 plt.title("安卓手机CPU盒图") 203 plt.show() 204 205 # 线性回归方程 206 import seaborn as sns 207 import matplotlib.pyplot as plt 208 import pandas as pd 209 import numpy as np 210 import warnings 211 warnings.filterwarnings("ignore") 212 four=pd.DataFrame(pd.read_excel('C:/Users/angel/Desktop/Phone_pop.xlsx')) 213 sns.regplot(x='phone_cpu',y='phone_gpu',data=four,color='r') 214 from sklearn import datasets 215 from sklearn.linear_model import LinearRegression 216 import pandas as pd 217 import numpy as np 218 import seaborn as sns 219 predict_model = LinearRegression() 220 three=pd.DataFrame(pd.read_excel('C:/Users/angel/Desktop/Phone_pop.xlsx')) 221 X = three['phone_cpu'].values 222 X = X.reshape(-1,1) 223 predict_model.fit(X , three['phone_gpu']) 224 np.set_printoptions(precision = 3, suppress = True) 225 a = predict_model.coef_ 226 b = predict_model.intercept_ 227 print("回归方程系数{}".format(predict_model.coef_)) 228 print("回归方程截距{0:2f}".format(predict_model.intercept_)) 229 print("线性回归预测模型表达式为{}*x+{}".format(predict_model.coef_,predict_model.intercept_)) 230 231 # 词云 232 import random 233 import wordcloud as wc 234 import matplotlib.pyplot as plt 235 236 bk = np.array(Image.open("wyymuc.jpg")) 237 mask = bk 238 # 定义图片尺寸 239 word_cloud = wc.WordCloud( 240 mask = mask, 241 background_color='mintcream', 242 font_path='msyhbd.ttc', 243 max_font_size=300, 244 random_state=50, 245 ) 246 text = Android_phone_data["name"] 247 text = " ".join(text) 248 # 绘制词云 249 word_cloud.generate(text) 250 plt.imshow(word_cloud) 251 plt.show()
四、总结
描述完成此项目得到哪些有益的结论?是否达到预期的目标?以及要改进的建议?
1.通过这个cpu、gpu、总分中可以看出手机不同性能与综合之间的比较,在这里可以看出手机性能强、日常使用的手机均衡等。
2.我个人觉得达到预期目标了。因为在此次的课题作业中,让我系统的学习到怎样爬取数据的一些基本的框架过程,还有在数据分析中学习到了如何清洗、分析等。
3.需要改进的地方是,在爬虫过程中会遇到一些了数据无法爬出,编写代码时需要查阅许多的资料,还有就是我自己对代码的认识比较欠缺需要勤加练习,最后希望自己可以在爬虫中运用得更加熟练操作等。