一、主题式网络爬虫设计方案
1.主题式网络爬虫名称:App应用数据爬虫。
2.要爬取的内容有很多,例如月独立设备使用,月使用次数,月使用时间等等。
数据特征:数据包含面广,可以用分为多组数据进行分析比对。
3.实现思路:通过网站源代码找到要爬取的数据对象,爬取到数据后放入dataframe中再进行绘图和分析。
技术难点:该网站是动态网站,相比以前爬取的静态网站来说,动态网站的数据存放的位置和形式都有所不同。
二、主题页面的结构特征分析
将要爬取的网站页面如下:
这是一个动态网站,首先F12查看源代码如下:
先试探性地用网站的url爬取一下源代码,结果如下:
只有短短几行,并不存在要爬取的目标,只能另寻他路。具体方法如下:
便会弹出如下页面:
这便是所要爬取的url链接和内容了,全都被打包放在了一起,用requests将整个源代码爬取下来:
import requests from bs4 import BeautifulSoup url = \'https://index.iresearch.com.cn/app/GetDataList2?classId=0&classLevel=0&timeid=85&orderBy=2\' headers = {\'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\'} r = requests.get(url,timeout = 30,headers = headers) r.encoding = \'utf-8\' html = r.text print(html)
打印html结果如下:
但是有一点值得注意,这里的html内容虽然看上去是字典,实则不然,这里我用type检查一下:
发现是字符串格式,具体来说是json字符串,那么就需要进行转换,转换过程也很简单:
成功转换成字典后就可以开始分析字典内容了:
不难发现,目标数据存放于‘List’所对应的列表里,进一步分析发现,这个列表是由多个字典组成的,并且一个字典对应着一个APP的数据,并且比网页上显示的数据要多得多。
再用get()和索引就可以得到各APP的全部数据了。
三、网络爬虫程序设计
1.数据爬取与采集
首先将json字符串转换成字典,并提取出字典中’List‘的值中的第一个字典:
dict0 = json.loads(html).get(\'List\')[0]
再将提取到的字典的键值对拆分成并放到两个列表里,但是键只需要提取一次,因为每个字典的键都是一样的。
lst0 = list(dict0.values())
col = list(dict0.keys())
将所有字典拆分完成后再通过DataFrame整合:
df = pd.DataFrame([lst0,lst1,lst2,lst3,lst4,lst5,lst6,lst7,lst8,lst9],columns = col)
结果如下:
2.对数据进行清洗和处理
先对无效列进行删除,即数据分析用不上的值:
df.drop(\'Id\',axis=1,inplace=True) df.drop(\'TimeRank\',axis=1,inplace=True) df.drop(\'DmRank\',axis=1,inplace=True) df.drop(\'TimeId\',axis=1,inplace=True) df.drop(\'Appid\',axis=1,inplace=True) df.drop(\'AppLogo\',axis=1,inplace=True) df.drop(\'Fclassid\',axis=1,inplace=True) df.drop(\'Kclassid\',axis=1,inplace=True) df.drop(\'TimeType\',axis=1,inplace=True) df.drop(\'DmGrowth\',axis=1,inplace=True) df.drop(\'Company\',axis=1,inplace=True) df.drop(\'IsService\',axis=1,inplace=True) df.drop(\'AppType\',axis=1,inplace=True) df.drop(\'Domain\',axis=1,inplace=True) df.drop(\'IsChanged\',axis=1,inplace=True) df.drop(\'CRank\',axis=1,inplace=True) df.drop(\'IsMark\',axis=1,inplace=True) df.drop(\'TimeGrowth\',axis=1,inplace=True) df.drop(\'Growth\',axis=1,inplace=True)
初步删除后得到结果如下:
但又发现,第八行的数据严重缺失,考虑删除
df.drop(7,axis=0,inplace=True)
其中axis=0是行,axis=1是列
再进行查找重复值:
df.duplicated()
发现并没有重复值
再查找缺失值:
df.isnull()
同样没有缺失值
确认数据并无大碍后即清洗数据完成,再将清洗完的数据保存到excel里:
3.数据分析和可视化
根据数据类型,我选择采用直方图,饼图,3D散点图和组合柱状图进行数据分析和可视化。
首先要让中文和负号能正常显示出来:
plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] matplotlib.rcParams[\'axes.unicode_minus\']=False
绘制直方图:
#画布尺寸 plt.figure(figsize=(10,7)) #构造数据 #x轴 x = df[\'AppName\'] #y轴 y1 = df[\'UseNum\'] plt.bar(x,y1) #设置标题 plt.title(\'2020年2月各APP的月独立设备数(万台)\') #横坐标 plt.xlabel(\'App名称\') #纵坐标 plt.ylabel(\'独立设备数\') #将图片保存到file文件夹下 plt.savefig(\'D:\\file\\1-1.jpg\') plt.show()
结果如下:
绘制饼图:
plt.figure(figsize=(7,7)) #标签名 labels = df[\'AppName\'] #构造数据 data = df[\'MachineODayTime\'] #绘制图形 plt.pie(data,labels=labels,autopct=\'%1.1f%%\') plt.title(\'月度使用次数占比\') plt.savefig(\'D:\\file\\2-1.jpg\') plt.show()
结果如下:
绘制散点图:
fig = plt.figure() #基于ax变量绘制三维图 ax = Axes3D(fig) #构造数据 x1 = df[\'DayUseNum\'] y1 = df[\'MachineODayNum\'] z1 = df[\'DayMachineNum\'] ax.scatter(x1,y1,z1) #设置坐标轴 ax.set_xlabel(\'日独立设备数\') ax.set_ylabel(\'日独立设备增长数\') ax.set_ylabel(\'日覆盖人数\') #将图片保存到file文件夹下 plt.savefig(\'D:\\file\\3-1.jpg\') plt.show()
结果如下:
绘制组合柱状图:
#绘制组合柱状图 plt.figure(figsize=(10,7)) #构建数据 x0 = df[\'AppName\'] UseNum = df[\'UseNum\'] UseTime = df[\'UseTime\'] x = list(range(len(UseNum))) #设置间距 bar_width = 0.3 #在偏移间距位置绘制柱状图 for i in range(len(x)): x[i] -= bar_width plt.bar(x,height=UseNum,width=bar_width,label=\'月独立设备数\',fc=\'teal\') for a,b in zip(x,UseNum): plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) for i in range(len(x)): x[i] += bar_width plt.bar(x,height=UseTime,width=bar_width,label=\'月使用次数\',tick_label=x0,fc=\'darkorange\') for a,b in zip(x,UseTime): plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) #设置标题 plt.title(\'月独立设备数和月使用次数对比\') #设置横纵坐标 plt.xlabel(\'APP名称\') plt.ylabel(\'数量\') #显示图例 plt.legend() #将图片保存到file文件夹下 plt.savefig(\'D:\\file\\4-1.jpg\') plt.show()
结果如下:
4.画出散点图并建立变量之间的回归方程
首先我是用月独立设备数和月使用次数进行分析,画出散点图如下:
稍加思索,感觉还是更趋向于一元二次方程,便使用二次方程作为拟合函数,在测试多次拟合参数p0后选择了p0=[1,15,20],最后进行拟合。
#设置中文字体 plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] #需要拟合的函数func,根据散点图指定函数的形状 def func1(p,x): a,b,c = p return a*x*x+b*x+c #偏差函数 def error1(p,x,y): return func1(p,x)-y #画样本图像,即散点图 plt.scatter(df[\'UseNum\'],df[\'UseTime\']) #设置样本数据 X = df.UseNum/10000 Y = df.UseTime/10000 plt.figure(figsize=(8,6)) #设置函数拟合参数 p0 = [1,15,20] #进行最小二乘拟合 para = leastsq(error1,p0,args=(X,Y)) a,b,c = para[0] #读取结果 print(\'a=\',a,\'b=\',b,\'c=\',c) print("求解的拟合直线为:") print("y="+str(round(a,2))+"x*x"+str(round(b,2))+"x+"+str(round(c,2))) #画拟合曲线 plt.scatter(X,Y,color=\'green\',label=\'样本数据\',linewidth=2) x = np.linspace(1,15,20) y = a*x*x+b*x+c plt.plot(x,y,color=\'red\',label=\'拟合曲线\',linewidth=2) plt.legend() plt.title(\'\') plt.grid() #将图片保存到file文件夹下 plt.savefig(\'D:\\file\\5-1.jpg\') plt.show()
结果如下:
后面我还选另外两个变量做了一次方程的拟合:
#拟合函数 def func2(p,x): a,b = p return a*x+b #偏差函数 def error2(p,x,y): return func2(p,x)-y plt.scatter(df[\'MachineODayTime\'],df[\'MachineOTimeTime\']) X = df.MachineODayTime Y = df.MachineOTimeTime plt.figure(figsize=(8,6)) p0 = [0,15] para = leastsq(error2,p0,args=(X,Y)) a,b = para[0] print(\'a=\',a,\'b=\',b) print("求解的拟合直线为:") print("y="+str(round(a,2))+"x+"+str(round(b,2))) plt.scatter(X,Y,color=\'green\',label=\'样本数据\',linewidth=2) x = np.linspace(0,25) y = a*x+b plt.plot(x,y,color=\'red\',label=\'拟合曲线\',linewidth=2) plt.legend() plt.title(\'\') plt.grid() #将图片保存到file文件夹下 plt.savefig(\'D:\\file\\5-2.jpg\') plt.show()
结果如下:
最后附上完整程序代码:
1 # 导入相关库 2 import requests 3 import json 4 import pandas as pd 5 import numpy as np 6 import matplotlib.pyplot as plt 7 import matplotlib 8 import seaborn as sns 9 from scipy.optimize import leastsq 10 from PIL import Image 11 from mpl_toolkits.mplot3d import Axes3D 12 13 14 # 获取html文本 15 def getHTMLText(url): 16 17 try: 18 # 将爬虫伪装成浏览器 19 headers = {\'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\'} 20 r = requests.get(url, timeout=30, headers=headers) 21 r.raise_for_status() 22 # 更改为utf-8编码 23 r.encoding = \'utf-8\' 24 return r.text 25 except: 26 return "" 27 28 29 # 数据爬取与清洗 30 def getAPPData(html): 31 32 #将json字符串转换为字典 33 dict0 = json.loads(html).get(\'List\')[0] 34 35 #再将字典的键值对拆开到不同列表里 36 lst0 = list(dict0.values()) 37 dict1 = json.loads(html).get(\'List\')[1] 38 lst1 = list(dict1.values()) 39 dict2 = json.loads(html).get(\'List\')[2] 40 lst2 = list(dict2.values()) 41 dict3 = json.loads(html).get(\'List\')[3] 42 lst3 = list(dict3.values()) 43 dict4 = json.loads(html).get(\'List\')[4] 44 lst4 = list(dict4.values()) 45 dict5 = json.loads(html).get(\'List\')[5] 46 lst5 = list(dict5.values()) 47 dict6 = json.loads(html).get(\'List\')[6] 48 lst6 = list(dict6.values()) 49 dict7 = json.loads(html).get(\'List\')[7] 50 lst7 = list(dict7.values()) 51 dict8 = json.loads(html).get(\'List\')[8] 52 lst8 = list(dict8.values()) 53 dict9 = json.loads(html).get(\'List\')[9] 54 lst9 = list(dict9.values()) 55 56 \'\'\' 57 创建DataFrame便于处理和清洗数据 58 将df改成全局变量方便后面的函数使用 59 \'\'\' 60 61 global df 62 col = list(dict0.keys()) 63 df = pd.DataFrame([lst0,lst1,lst2,lst3,lst4,lst5,lst6,lst7,lst8,lst9],columns = col) 64 65 \'\'\' 66 进行数据清洗 67 删除无效列 68 像Id,TimeRank,DmRank,TimeId等等都是在分析中并不需要的列,需要删除 69 df.duplicated()查找重复值,并没有 70 df.isnull()查找缺失值,也没有 71 \'\'\' 72 73 df.drop(\'Id\',axis=1,inplace=True) 74 df.drop(\'TimeRank\',axis=1,inplace=True) 75 df.drop(\'DmRank\',axis=1,inplace=True) 76 df.drop(\'TimeId\',axis=1,inplace=True) 77 df.drop(\'Appid\',axis=1,inplace=True) 78 df.drop(\'AppLogo\',axis=1,inplace=True) 79 df.drop(\'Fclassid\',axis=1,inplace=True) 80 df.drop(\'Kclassid\',axis=1,inplace=True) 81 df.drop(\'TimeType\',axis=1,inplace=True) 82 df.drop(\'DmGrowth\',axis=1,inplace=True) 83 df.drop(\'Company\',axis=1,inplace=True) 84 df.drop(\'IsService\',axis=1,inplace=True) 85 df.drop(\'AppType\',axis=1,inplace=True) 86 df.drop(\'Domain\',axis=1,inplace=True) 87 df.drop(\'IsChanged\',axis=1,inplace=True) 88 df.drop(\'CRank\',axis=1,inplace=True) 89 df.drop(\'IsMark\',axis=1,inplace=True) 90 df.drop(\'TimeGrowth\',axis=1,inplace=True) 91 df.drop(\'Growth\',axis=1,inplace=True) 92 93 #发现第七行数据缺失严重,考虑删除 94 df.drop(7,axis=0,inplace=True) 95 96 #清洗完数据后,将dataframe保存到excel表格 97 #自定义路径方便后期查看 98 df.to_excel(\'D:\\file\\df.xls\') 99 100 101 \'\'\' 102 由于数据基本都是数字,我这里就不做分词可视化了 103 数据分析与可视化 104 为了更直观地展示数据,这里我用直方图,饼图,3D散点图和组合柱状图为例,进行数据可视化 105 并将图片保存到电脑 106 \'\'\' 107 108 def PlotData(): 109 110 #将默认字体改为中文字体 111 plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] 112 #解决负号不正常显示的问题 113 matplotlib.rcParams[\'axes.unicode_minus\']=False 114 115 #绘制第一张直方图 116 #图画比例 117 plt.figure(figsize=(10,7)) 118 #构造数据 119 #x轴 120 x = df[\'AppName\'] 121 #y轴 122 y1 = df[\'UseNum\'] 123 124 plt.bar(x,y1) 125 #设置标题 126 plt.title(\'2020年2月各APP的月独立设备数(万台)\') 127 #横坐标 128 plt.xlabel(\'App名称\') 129 #纵坐标 130 plt.ylabel(\'独立设备数\') 131 #将图片保存到file文件夹下 132 plt.savefig(\'D:\\file\\1-1.jpg\') 133 plt.show() 134 135 #绘制第二张直方图 136 plt.figure(figsize=(10,7)) 137 y2 = df[\'DayUseNum\'] 138 139 plt.bar(x,y2) 140 plt.title(\'2020年2月各App的日独立设备数(万台)\') 141 plt.xlabel(\'App名称\') 142 plt.ylabel(\'独立设备数\') 143 plt.savefig(\'D:\\file\\1-2.jpg\') 144 plt.show() 145 146 #绘制第三张直方图 147 plt.figure(figsize=(10,7)) 148 y3 = df[\'MachineODayNum\'] 149 150 plt.bar(x,y3) 151 plt.title(\'2020年2月各App的独立设备增量(台)\') 152 plt.xlabel(\'App名称\') 153 plt.ylabel(\'独立设备数\') 154 plt.savefig(\'D:\\file\\1-3.jpg\') 155 plt.show() 156 157 #绘制第四张直方图 158 plt.figure(figsize=(10,7)) 159 y4 = df[\'UseTime\'] 160 161 plt.bar(x,y4) 162 plt.title(\'2020年2月各App的月使用时间(小时)\') 163 plt.xlabel(\'App名称\') 164 plt.ylabel(\'使用时间\') 165 plt.savefig(\'D:\\file\\1-4.jpg\') 166 plt.show() 167 168 #绘制第五张直方图 169 plt.figure(figsize=(10,7)) 170 y5 = df[\'DayMachineNum\'] 171 172 plt.bar(x,y5) 173 plt.title(\'2020年2月各App的日使用时间(小时)\') 174 plt.xlabel(\'App名称\') 175 plt.ylabel(\'使用时间\') 176 plt.savefig(\'D:\\file\\1-5.jpg\') 177 plt.show() 178 179 #绘制第一张饼图 180 plt.figure(figsize=(7,7)) 181 #标签名 182 labels = df[\'AppName\'] 183 #构造数据 184 data = df[\'MachineODayTime\'] 185 186 #绘制图形 187 plt.pie(data,labels=labels,autopct=\'%1.1f%%\') 188 plt.title(\'月度使用次数占比\') 189 plt.savefig(\'D:\\file\\2-1.jpg\') 190 plt.show() 191 192 #绘制第二张饼图 193 plt.figure(figsize=(7,7)) 194 labels = df[\'AppName\'] 195 data = df[\'MachineOTimeTime\'] 196 197 plt.pie(data,labels=labels,autopct=\'%1.1f%%\') 198 plt.title(\'月度总有效使用时间占比\') 199 plt.savefig(\'D:\\file\\2-2.jpg\') 200 plt.show() 201 202 #绘制第三张饼图 203 plt.figure(figsize=(7,7)) 204 labels = df[\'AppName\'] 205 data = df[\'UseNum\'] 206 207 plt.pie(data,labels=labels,autopct=\'%1.1f%%\') 208 plt.title(\'月度独立设备数占比\') 209 plt.savefig(\'D:\\file\\2-3.jpg\') 210 plt.show() 211 212 #绘制第一张3D散点图 213 fig = plt.figure() 214 #基于ax变量绘制三维图 215 ax = Axes3D(fig) 216 #构造数据 217 x1 = df[\'DayUseNum\'] 218 y1 = df[\'MachineODayNum\'] 219 z1 = df[\'DayMachineNum\'] 220 221 ax.scatter(x1,y1,z1) 222 #设置坐标轴 223 ax.set_xlabel(\'日独立设备数\') 224 ax.set_ylabel(\'日独立设备增长数\') 225 ax.set_ylabel(\'日覆盖人数\') 226 #将图片保存到file文件夹下 227 plt.savefig(\'D:\\file\\3-1.jpg\') 228 plt.show() 229 230 #绘制第二张散点图 231 fig = plt.figure() 232 ax = Axes3D(fig) 233 x2 = df[\'UseNum\'] 234 y2 = df[\'DayMachineNum\'] 235 z2 = df[\'UseTime\'] 236 237 ax.scatter(x2,y2,z2) 238 ax.set_xlabel(\'月独立设备数\') 239 ax.set_ylabel(\'日覆盖人数\') 240 ax.set_ylabel(\'月使用次数\') 241 plt.savefig(\'D:\\file\\3-2.jpg\') 242 plt.show() 243 244 #绘制组合柱状图 245 plt.figure(figsize=(10,7)) 246 #构建数据 247 x0 = df[\'AppName\'] 248 UseNum = df[\'UseNum\'] 249 UseTime = df[\'UseTime\'] 250 x = list(range(len(UseNum))) 251 #设置间距 252 bar_width = 0.3 253 254 #在偏移间距位置绘制柱状图 255 for i in range(len(x)): 256 x[i] -= bar_width 257 plt.bar(x,height=UseNum,width=bar_width,label=\'月独立设备数\',fc=\'teal\') 258 for a,b in zip(x,UseNum): 259 plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) 260 261 for i in range(len(x)): 262 x[i] += bar_width 263 plt.bar(x,height=UseTime,width=bar_width,label=\'月使用次数\',tick_label=x0,fc=\'darkorange\') 264 for a,b in zip(x,UseTime): 265 plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) 266 267 #设置标题 268 plt.title(\'月独立设备数和月使用次数对比\') 269 #设置横纵坐标 270 plt.xlabel(\'APP名称\') 271 plt.ylabel(\'数量\') 272 #显示图例 273 plt.legend() 274 #将图片保存到file文件夹下 275 plt.savefig(\'D:\\file\\4-1.jpg\') 276 plt.show() 277 278 #绘制第二张组合柱状图 279 plt.figure(figsize=(10,7)) 280 #注意变量名不能和上面的变量名重复 281 x1 = df[\'AppName\'] 282 MachineODayTime = df[\'MachineODayTime\'] 283 MachineOTimeTime = df[\'MachineOTimeTime\'] 284 z = list(range(len(MachineODayTime))) 285 bar_width = 0.3 286 287 for i in range(len(z)): 288 z[i] -= bar_width 289 plt.bar(z,height=MachineODayTime,width=bar_width,label=\'使用次数占比\',fc=\'teal\') 290 for a,b in zip(z,MachineODayTime): 291 plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) 292 293 for i in range(len(z)): 294 z[i] += bar_width 295 plt.bar(z,height=MachineOTimeTime,width=bar_width,label=\'有效时间占比\',tick_label=x1,fc=\'darkorange\') 296 for a,b in zip(z,MachineOTimeTime): 297 plt.text(a,b,b,ha=\'center\',va=\'bottom\',fontsize=10) 298 299 plt.title(\'使用次数占比和月有效时间占比对比\') 300 plt.xlabel(\'APP名称\') 301 plt.ylabel(\'占比(%)\') 302 plt.legend() 303 plt.savefig(\'D:\\file\\4-2.jpg\') 304 plt.show() 305 306 307 #分析两组数据并画散点图和建立回归方程 308 def AnalyzeData(): 309 310 #设置中文字体 311 plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] 312 313 #嵌套函数 314 #需要拟合的函数func,指定函数的形状 315 def func1(p,x): 316 317 a,b,c = p 318 return a*x*x+b*x+c 319 320 #偏差函数 321 def error1(p,x,y): 322 323 return func1(p,x)-y 324 325 #画样本图像 326 plt.scatter(df[\'UseNum\'],df[\'UseTime\']) 327 328 #设置样本数据 329 X = df.UseNum/10000 330 Y = df.UseTime/10000 331 plt.figure(figsize=(8,6)) 332 333 #设置函数拟合参数 334 p0 = [1,15,20] 335 336 #进行最小二乘拟合 337 para = leastsq(error1,p0,args=(X,Y)) 338 a,b,c = para[0] 339 340 #读取结果 341 print(\'a=\',a,\'b=\',b,\'c=\',c) 342 print("求解的拟合直线为:") 343 print("y="+str(round(a,2))+"x*x"+str(round(b,2))+"x+"+str(round(c,2))) 344 345 #画拟合曲线 346 plt.scatter(X,Y,color=\'green\',label=\'样本数据\',linewidth=2) 347 x = np.linspace(1,15,20) 348 y = a*x*x+b*x+c 349 plt.plot(x,y,color=\'red\',label=\'拟合曲线\',linewidth=2) 350 plt.legend() 351 plt.title(\'\') 352 plt.grid() 353 #将图片保存到file文件夹下 354 plt.savefig(\'D:\\file\\5-1.jpg\') 355 plt.show() 356 357 #拟合函数 358 def func2(p,x): 359 360 a,b = p 361 return a*x+b 362 363 #偏差函数 364 def error2(p,x,y): 365 366 return func2(p,x)-y 367 368 plt.scatter(df[\'MachineODayTime\'],df[\'MachineOTimeTime\']) 369 370 X = df.MachineODayTime 371 Y = df.MachineOTimeTime 372 plt.figure(figsize=(8,6)) 373 374 p0 = [0,15] 375 para = leastsq(error2,p0,args=(X,Y)) 376 a,b = para[0] 377 378 print(\'a=\',a,\'b=\',b) 379 print("求解的拟合直线为:") 380 print("y="+str(round(a,2))+"x+"+str(round(b,2))) 381 382 plt.scatter(X,Y,color=\'green\',label=\'样本数据\',linewidth=2) 383 x = np.linspace(0,25) 384 y = a*x+b 385 plt.plot(x,y,color=\'red\',label=\'拟合曲线\',linewidth=2) 386 plt.legend() 387 plt.title(\'\') 388 plt.grid() 389 #将图片保存到file文件夹下 390 plt.savefig(\'D:\\file\\5-2.jpg\') 391 plt.show() 392 393 394 #定义主函数 395 def main(): 396 397 #要爬取的网站的url链接 398 url = \'https://index.iresearch.com.cn/app/GetDataList2?classId=0&classLevel=0&timeid=85&orderBy=2\' 399 #获取网站的html 400 html = getHTMLText(url) 401 getAPPData(html) 402 PlotData() 403 AnalyzeData() 404 405 406 #执行主函数 407 if __name__ == \'__main__\': 408 main()
所有保存的图片和文件:
四、结论
1.经过上面的分析和可视化我发现,手机APP的月度使用次数占比和月度使用有效时间占比的关系会根据APP类型不同而有所不同,像爱奇艺,腾讯视频,抖音这些视频服务类APP,月度使用有效时间占比往往多于月度使用次数占比。
而其他类型的APP多半是日使用次数占比多于日有效时间占比。另外,不得不说的一点就是,我才发现微信的数据简直高得离谱,月独立设备数,月使用次数,月度使用次数占比,月度使用有效时间占比,都远远高于其他APP。
2.这次程序设计任务,数据偏数字多一些,没能做分词处理是有些可惜,但这些数据涉及的方面还是挺多的,就做了很多图表来对比,任务要求做的都有尽可能做到了。
这次主题爬虫整体做下来,感觉难点不在于怎么写程序,而在于怎么分析数据,怎样把两组看似不相关的数据找出内在联系。