手机APP数据爬虫

一、主题式网络爬虫设计方案

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.这次程序设计任务,数据偏数字多一些,没能做分词处理是有些可惜,但这些数据涉及的方面还是挺多的,就做了很多图表来对比,任务要求做的都有尽可能做到了。

这次主题爬虫整体做下来,感觉难点不在于怎么写程序,而在于怎么分析数据,怎样把两组看似不相关的数据找出内在联系。

猜你喜欢

转载自www.cnblogs.com/Yaoner/p/12638862.html