一、主题式网络爬虫设计方案
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.这次程序设计任务,数据偏数字多一些,没能做分词处理是有些可惜,但这些数据涉及的方面还是挺多的,就做了很多图表来对比,任务要求做的都有尽可能做到了。
这次主题爬虫整体做下来,感觉难点不在于怎么写程序,而在于怎么分析数据,怎样把两组看似不相关的数据找出内在联系。