一、主題式網絡爬蟲設計方案
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.這次程序設計任務,數據偏數字多一些,沒能做分詞處理是有些可惜,但這些數據涉及的方面還是挺多的,就做了很多圖表來對比,任務要求做的都有盡可能做到了。
這次主題爬蟲整體做下來,感覺難點不在於怎么寫程序,而在於怎么分析數據,怎樣把兩組看似不相關的數據找出內在聯系。
