(一)、選題的背景
國內生產總值(GDP)是指按國家市場價格計算的一個國家(或地區)所有常駐單位在一定時期內生產活動的最終成果,常被公認為是衡量國家經濟狀況的最佳指標。國內生產總值GDP是核算體系中一個重要的綜合性統計指標;也是我國新國民經濟核算體系中的核心指標,它反映了一國(或地區)的經濟實力和市場規模。近年來隨着我國經濟的快速發展,國內生產總值也顯著提升,我想通過此次的爬取對我國近幾年來gdp的分析。
(二)、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱
國內GDP的爬取
2.主題式網絡爬蟲爬取的內容與數據特征分析
對該網站的國內生產總值和第一、第二、第三產業的數據值和同比增長的爬取。
3.主題式網絡爬蟲設計方案概述
爬取該網站的gdp數據找到對應的標簽鏈接的有關數據,然后對此數據的數據清洗和數據可視化分析。
(三)、主題頁面的結構特征分析
1.主題頁面的結構與特征分析
爬取主頁面

近幾年來各個季度的國內生產總值和第一二三產業的生產值及各自的同比增長比值
2.Htmls 頁面解析

然后元素審查找到合適采取的數據框
3.節點(標簽)查找方法與遍歷方法
對網站進行元素審查,然后找到對應的body標簽下的div class下所吻合的數據頁面。
(四)、網絡爬蟲程序設計
1.數據爬取與采集
1 from bs4 import BeautifulSoup 2 import requests 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 import csv 6 def getHTMLText(url): 7 try: 8 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 9 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 10 r=requests.get(url,headers=headers) 11 r.raise_for_status()#如果狀態不是200,就會引發HTTPError異常 12 r.encoding = r.apparent_encoding 13 print(r) 14 return r.text 15 except: 16 return "no" 17 18 url="https://market.cnal.com/historical/gdp.html" 19 a=getHTMLText(url) 20 soup=BeautifulSoup(a)
2.對數據進行清洗和處理
1 fff=[] 2 3 for i in soup.find_all("tr")[2:]: 4 fd=[] 5 gg=0 6 for a in i: 7 if gg==1: 8 fd.append(a) 9 elif gg==3: 10 fd.append(a) 11 elif gg==5: 12 fd.append(a) 13 elif gg==7: 14 fd.append(a) 15 elif gg==9: 16 fd.append(a) 17 elif gg==11: 18 fd.append(a) 19 elif gg==13: 20 fd.append(a) 21 elif gg==15: 22 fd.append(a) 23 elif gg==17: 24 fd.append(a) 25 gg=gg+1 26 fff.append(fd)ght=[] 27 for gtk in fff: 28 hv=[] 29 for i in gtk: 30 hv.append(str(i)[4:-5]) 31 ght.append(hv)with open("D:\\李坤斌python程序設計\\hk1.csv","w",encoding="utf_8_sig") as fi: 32 writer=csv.writer(fi) 33 writer.writerow(["季度", 34 "國內生產總值", 35 "同比增長", 36 "第1產業", 37 "同比增長", 38 "第2產業", 39 "同比增長", 40 "第3產業", 41 "同比增長"])#給每列的數據列名 42 for da in ght: 43 writer.writerow(da) 44 fi.close() 45 df=pd.read_csv("D:\\李坤斌python程序設計\\hk1.csv") 46 df
3 數據分析與可視化
散點圖:
1 for hji in range(len(df["季度"])): 2 df.loc[hji,"國內生產總值"]=float("".join(str(df.loc[hji,"國內生產總值"]).split(","))) 3 df.loc[hji,"第1產業"]=float("".join(str(df.loc[hji,"第1產業"]).split(","))) 4 df.loc[hji,"第2產業"]=float("".join(str(df.loc[hji,"第2產業"]).split(","))) 5 df.loc[hji,"第3產業"]=float("".join(str(df.loc[hji,"第3產業"]).split(","))) 6 df.loc[hji,"同比增長"]=float(str(df.loc[hji,"同比增長"])[0:-2])/100 7 df.loc[hji,"同比增長.1"]=float(str(df.loc[hji,"同比增長.1"])[0:-2])/100 8 df.loc[hji,"同比增長.2"]=float(str(df.loc[hji,"同比增長.2"])[0:-2])/100 9 df.loc[hji,"同比增長.3"]=float(str(df.loc[hji,"同比增長.3"])[0:-2])/100import seaborn as sns 10 plt.scatter(df["國內生產總值"], 11 df["第1產業"]) 12 13 plt.show()
1 plt.scatter(df["第1產業"], 2 df["第3產業"], 3 s=None, 4 c="k", 5 marker="+", 6 cmap=None, 7 norm=0.7, 8 vmin=None, 9 vmax=None, 10 alpha=0.5, 11 linewidths=None, 12 verts=None, 13 edgecolors=None, 14 data=None) 15 plt.show()
盒圖:
1 #通過盒圖了解平均生產值在什么位置數量分布情況 2 plt.subplot(2,2,1) 3 plt.boxplot(df["國內生產總值"], 4 notch=True, 5 sym=None, 6 vert=None, 7 whis=None, 8 positions=None, 9 widths=None, 10 patch_artist=True, 11 meanline=None, 12 showmeans=None, 13 showcaps=None, 14 showbox=None, 15 showfliers=None, 16 boxprops=None, 17 labels=None, 18 flierprops=None, 19 medianprops=None, 20 meanprops=None, 21 capprops=None, 22 whiskerprops=None) 23 plt.title("國內生產總值") 24 plt.ylabel("數量") 25 plt.subplot(2,2,2) 26 plt.boxplot(df["第1產業"], 27 notch=True, 28 sym=None, 29 vert=None, 30 whis=None, 31 positions=None, 32 widths=None, 33 patch_artist=True, 34 meanline=None, 35 showmeans=None, 36 showcaps=None, 37 showbox=None, 38 showfliers=None, 39 boxprops=None, 40 labels=None, 41 flierprops=None, 42 medianprops=None, 43 meanprops=None, 44 capprops=None, 45 whiskerprops=None) 46 plt.title("第1產業") 47 plt.ylabel("數量") 48 plt.subplot(2,2,3) 49 50 plt.boxplot(df["第2產業"], 51 notch=True, 52 sym=None, 53 vert=None, 54 whis=None, 55 positions=None, 56 widths=None, 57 patch_artist=True, 58 meanline=None, 59 showmeans=None, 60 showcaps=None, 61 showbox=None, 62 showfliers=None, 63 boxprops=None, 64 labels=None, 65 flierprops=None, 66 medianprops=None, 67 meanprops=None, 68 capprops=None, 69 whiskerprops=None) 70 plt.title("第2產業") 71 plt.ylabel("數量") 72 plt.subplot(2,2,4) 73 plt.boxplot(df["第3產業"], 74 notch=True, 75 sym=None, 76 vert=None, 77 whis=None, 78 positions=None, 79 widths=None, 80 patch_artist=True, 81 meanline=None, 82 showmeans=None, 83 showcaps=None, 84 showbox=None, 85 showfliers=None, 86 boxprops=None, 87 labels=None, 88 flierprops=None, 89 medianprops=None, 90 meanprops=None, 91 capprops=None, 92 whiskerprops=None) 93 plt.title("第3產業") 94 plt.ylabel("數量") 95 plt.show()
條形圖:
1 import requests 2 from bs4 import BeautifulSoup 3 import matplotlib.pyplot as plt 4 import seaborn as sns 5 import pandas as pd 6 #df=pd.read_csv("C:\\Users\\wei\\data.csv") 7 ggf=df.sort_values(by="國內生產總值", 8 axis=0, 9 ascending=False,) 10 bk=ggf["第1產業"][0:6] 11 zk=ggf["第2產業"][0:6] 12 city_1=ggf["第3產業"][0:6] 13 #顯示中文標簽,處理中文亂碼問題 14 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 15 plt.rcParams['axes.unicode_minus']=False 16 plt.figure(figsize=(10,6)) 17 x=list(range(len(zk))) 18 #給圖片設置間距 19 total_width=0.8 20 n=3 21 width=total_width/n 22 for i in range(len(x)): 23 x[i]-=width 24 plt.bar(x, 25 bk, 26 width=width, 27 label="第1產業", 28 fc="teal" 29 ) 30 for aa,ab in zip(x,bk): 31 plt.text(aa, 32 ab, 33 ab, 34 ha="center", 35 va='bottom', 36 fontsize=10) 37 for i in range(len(x)): 38 x[i]+=width 39 plt.bar(x, 40 zk, 41 width=width,#寬度 42 label="第2產業", 43 tick_label=city_1, 44 color="b" 45 ) 46 for aa,ab in zip(x,zk): 47 plt.text(aa, 48 ab, 49 ab, 50 ha="center", 51 va='bottom', 52 fontsize=10) 53 54 for i in range(len(x)): 55 x[i]+=width 56 plt.bar(x, 57 city_1, 58 width=width, 59 label="第3產業", 60 color="r" 61 ) 62 for aa,ab in zip(x,city_1): 63 plt.text(aa, 64 ab, 65 ab, 66 ha="center", 67 va='bottom', 68 fontsize=10) 69 plt.legend() 70 plt.xlabel("產業") 71 plt.ylabel("gdp") 72 plt.title("產業gdp貢獻對比") 73 plt.grid() 74 plt.show()
餅圖:
1 #整理畫圖數據 2 hi=df.sort_values(by="國內生產總值", 3 axis=0, 4 ascending=False,) 5 for ikl in range(len(df["國內生產總值"])): 6 if ikl==29: 7 fa=hi.loc[ikl,"國內生產總值"] 8 elif ikl==60: 9 fb=hi.loc[ikl,"國內生產總值"] 10 elif ikl==90: 11 fc=hi.loc[ikl,"國內生產總值"] 12 a_25=0 13 a_50=0 14 a_75=0 15 a_100=0 16 DF=len(hi["國內生產總值"]) 17 for gh in range(DF): 18 if hi.loc[gh,"國內生產總值"]>fa: 19 a_100=a_100+1 20 elif hi.loc[gh,"國內生產總值"]>fb: 21 a_75=a_75+1 22 elif hi.loc[gh,"國內生產總值"]>fc: 23 a_50=a_50+1 24 else: 25 a_25=a_25+1 26 a_data=[a_25,a_50,a_75,a_100] 27 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 28 plt.rcParams['axes.unicode_minus']=False 29 #構造數據 30 explode = [0, 0, 0, 0] 31 labels = ["0-25%", "25-50%", "50-75%", "75-100%"] 32 colors = ['#9ACD32', 'mistyrose', '#DDA0DD', '#FF0000'] 33 plt.pie( 34 a_data, #繪圖數據 35 explode=explode, #指定餅圖某些部分的突出顯示,即呈現爆炸式 36 labels=labels, 37 colors=colors, 38 autopct='%.2f%%', 39 pctdistance=0.8, 40 labeldistance=1.1, 41 startangle=180, 42 radius=1.2, 43 counterclock=False, 44 wedgeprops={'linewidth':1.5,'edgecolor':'r'}, 45 textprops={'fontsize':10,'color':'black'}, 46 ) 47 #添加圖標題 48 plt.title('數量分布') 49 #顯示圖形 50 plt.show()
.4 數據持久化
5 將以上各部分的代碼匯總,附上完整程序代
1 from bs4 import BeautifulSoup 2 import requests 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 import csv 6 def getHTMLText(url): 7 try: 8 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 9 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 10 r=requests.get(url,headers=headers) 11 r.raise_for_status()#如果狀態不是200,就會引發HTTPError異常 12 r.encoding = r.apparent_encoding 13 print(r) 14 return r.text 15 except: 16 return "no" 17 18 url="https://market.cnal.com/historical/gdp.html" 19 a=getHTMLText(url) 20 soup=BeautifulSoup(a)fff=[] 21 22 for i in soup.find_all("tr")[2:]: 23 fd=[] 24 gg=0 25 for a in i: 26 if gg==1: 27 fd.append(a) 28 elif gg==3: 29 fd.append(a) 30 elif gg==5: 31 fd.append(a) 32 elif gg==7: 33 fd.append(a) 34 elif gg==9: 35 fd.append(a) 36 elif gg==11: 37 fd.append(a) 38 elif gg==13: 39 fd.append(a) 40 elif gg==15: 41 fd.append(a) 42 elif gg==17: 43 fd.append(a) 44 gg=gg+1 45 fff.append(fd)ght=[] 46 for gtk in fff: 47 hv=[] 48 for i in gtk: 49 hv.append(str(i)[4:-5]) 50 ght.append(hv) 51 with open("D:\\李坤斌python程序設計\\hk1.csv","w",encoding="utf_8_sig") as fi: 52 writer=csv.writer(fi) 53 writer.writerow(["季度", 54 "國內生產總值", 55 "同比增長", 56 "第1產業", 57 "同比增長", 58 "第2產業", 59 "同比增長", 60 "第3產業", 61 "同比增長"])#給每列的數據列名 62 for da in ght: 63 writer.writerow(da) 64 fi.close() 65 df=pd.read_csv("D:\\李坤斌python程序設計\\hk1.csv") 66 df 67 for hji in range(len(df["季度"])): 68 df.loc[hji,"國內生產總值"]=float("".join(str(df.loc[hji,"國內生產總值"]).split(","))) 69 df.loc[hji,"第1產業"]=float("".join(str(df.loc[hji,"第1產業"]).split(","))) 70 df.loc[hji,"第2產業"]=float("".join(str(df.loc[hji,"第2產業"]).split(","))) 71 df.loc[hji,"第3產業"]=float("".join(str(df.loc[hji,"第3產業"]).split(","))) 72 df.loc[hji,"同比增長"]=float(str(df.loc[hji,"同比增長"])[0:-2])/100 73 df.loc[hji,"同比增長.1"]=float(str(df.loc[hji,"同比增長.1"])[0:-2])/100 74 df.loc[hji,"同比增長.2"]=float(str(df.loc[hji,"同比增長.2"])[0:-2])/100 75 df.loc[hji,"同比增長.3"]=float(str(df.loc[hji,"同比增長.3"])[0:-2])/100 76 mport seaborn as sns 77 plt.scatter(df["國內生產總值"], 78 df["第1產業"]) 79 80 plt.show() 81 plt.scatter(df["第1產業"], 82 df["第3產業"], 83 s=None, 84 c="k", 85 marker="+", 86 cmap=None, 87 norm=0.7, 88 vmin=None, 89 vmax=None, 90 alpha=0.5, 91 linewidths=None, 92 verts=None, 93 edgecolors=None, 94 data=None) 95 plt.show() 96 #通過盒圖了解平均生產值在什么位置數量分布情況 97 plt.subplot(2,2,1) 98 plt.boxplot(df["國內生產總值"], 99 notch=True, 100 sym=None, 101 vert=None, 102 whis=None, 103 positions=None, 104 widths=None, 105 patch_artist=True, 106 meanline=None, 107 showmeans=None, 108 showcaps=None, 109 showbox=None, 110 showfliers=None, 111 boxprops=None, 112 labels=None, 113 flierprops=None, 114 medianprops=None, 115 meanprops=None, 116 capprops=None, 117 whiskerprops=None) 118 plt.title("國內生產總值") 119 plt.ylabel("數量") 120 plt.subplot(2,2,2) 121 plt.boxplot(df["第1產業"], 122 notch=True, 123 sym=None, 124 vert=None, 125 whis=None, 126 positions=None, 127 widths=None, 128 patch_artist=True, 129 meanline=None, 130 showmeans=None, 131 showcaps=None, 132 showbox=None, 133 showfliers=None, 134 boxprops=None, 135 labels=None, 136 flierprops=None, 137 medianprops=None, 138 meanprops=None, 139 capprops=None, 140 whiskerprops=None) 141 plt.title("第1產業") 142 plt.ylabel("數量") 143 plt.subplot(2,2,3) 144 145 plt.boxplot(df["第2產業"], 146 notch=True, 147 sym=None, 148 vert=None, 149 whis=None, 150 positions=None, 151 widths=None, 152 patch_artist=True, 153 meanline=None, 154 showmeans=None, 155 showcaps=None, 156 showbox=None, 157 showfliers=None, 158 boxprops=None, 159 labels=None, 160 flierprops=None, 161 medianprops=None, 162 meanprops=None, 163 capprops=None, 164 whiskerprops=None) 165 plt.title("第2產業") 166 plt.ylabel("數量") 167 plt.subplot(2,2,4) 168 plt.boxplot(df["第3產業"], 169 notch=True, 170 sym=None, 171 vert=None, 172 whis=None, 173 positions=None, 174 widths=None, 175 patch_artist=True, 176 meanline=None, 177 showmeans=None, 178 showcaps=None, 179 showbox=None, 180 showfliers=None, 181 boxprops=None, 182 labels=None, 183 flierprops=None, 184 medianprops=None, 185 meanprops=None, 186 capprops=None, 187 whiskerprops=None) 188 plt.title("第3產業") 189 plt.ylabel("數量") 190 plt.show() 191 #整理畫圖數據 192 hi=df.sort_values(by="國內生產總值", 193 axis=0, 194 ascending=False,) 195 for ikl in range(len(df["國內生產總值"])): 196 if ikl==29: 197 fa=hi.loc[ikl,"國內生產總值"] 198 elif ikl==60: 199 fb=hi.loc[ikl,"國內生產總值"] 200 elif ikl==90: 201 fc=hi.loc[ikl,"國內生產總值"] 202 a_25=0 203 a_50=0 204 a_75=0 205 a_100=0 206 DF=len(hi["國內生產總值"]) 207 for gh in range(DF): 208 if hi.loc[gh,"國內生產總值"]>fa: 209 a_100=a_100+1 210 elif hi.loc[gh,"國內生產總值"]>fb: 211 a_75=a_75+1 212 elif hi.loc[gh,"國內生產總值"]>fc: 213 a_50=a_50+1 214 else: 215 a_25=a_25+1 216 a_data=[a_25,a_50,a_75,a_100] 217 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 218 plt.rcParams['axes.unicode_minus']=False 219 #構造數據 220 explode = [0, 0, 0, 0] 221 labels = ["0-25%", "25-50%", "50-75%", "75-100%"] 222 colors = ['#9ACD32', 'mistyrose', '#DDA0DD', '#FF0000'] 223 plt.pie( 224 a_data, #繪圖數據 225 explode=explode, #指定餅圖某些部分的突出顯示,即呈現爆炸式 226 labels=labels, 227 colors=colors, 228 autopct='%.2f%%', 229 pctdistance=0.8, 230 labeldistance=1.1, 231 startangle=180, 232 radius=1.2, 233 counterclock=False, 234 wedgeprops={'linewidth':1.5,'edgecolor':'r'}, 235 textprops={'fontsize':10,'color':'black'}, 236 ) 237 #添加圖標題 238 plt.title('數量分布') 239 #顯示圖形 240 plt.show() 241 import requests 242 from bs4 import BeautifulSoup 243 import matplotlib.pyplot as plt 244 import seaborn as sns 245 import pandas as pd 246 #df=pd.read_csv("C:\\Users\\wei\\data.csv") 247 ggf=df.sort_values(by="國內生產總值", 248 axis=0, 249 ascending=False,) 250 bk=ggf["第1產業"][0:6] 251 zk=ggf["第2產業"][0:6] 252 city_1=ggf["第3產業"][0:6] 253 #顯示中文標簽,處理中文亂碼問題 254 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 255 plt.rcParams['axes.unicode_minus']=False 256 plt.figure(figsize=(10,6)) 257 x=list(range(len(zk))) 258 #給圖片設置間距 259 total_width=0.8 260 n=3 261 width=total_width/n 262 for i in range(len(x)): 263 x[i]-=width 264 plt.bar(x, 265 bk, 266 width=width, 267 label="第1產業", 268 fc="teal" 269 ) 270 for aa,ab in zip(x,bk): 271 plt.text(aa, 272 ab, 273 ab, 274 ha="center", 275 va='bottom', 276 fontsize=10) 277 for i in range(len(x)): 278 x[i]+=width 279 plt.bar(x, 280 zk, 281 width=width,#寬度 282 label="第2產業", 283 tick_label=city_1, 284 color="b" 285 ) 286 for aa,ab in zip(x,zk): 287 plt.text(aa, 288 ab, 289 ab, 290 ha="center", 291 va='bottom', 292 fontsize=10) 293 294 for i in range(len(x)): 295 x[i]+=width 296 plt.bar(x, 297 city_1, 298 width=width, 299 label="第3產業", 300 color="r" 301 ) 302 for aa,ab in zip(x,city_1): 303 plt.text(aa, 304 ab, 305 ab, 306 ha="center", 307 va='bottom', 308 fontsize=10) 309 plt.legend() 310 plt.xlabel("產業") 311 plt.ylabel("gdp") 312 plt.title("產業gdp貢獻對比") 313 plt.grid() 314 plt.show()
(五)、總結
1.經過對主題數據的分析與可視化,可以得到哪些結論?是否達到預期的目標?
通過這次的課程設計,我對於近年來我國GDP的增長和下降和各自產業的情況有着清晰的認識,對當今我國的經濟國情有着更深的認識。
2.在完成此設計過程中,得到哪些收獲?以及要改進的建議?
在這次的課程中,使我掌握更深層次的爬蟲知識,也激發了我對爬蟲、對python的的興趣。在設計過程中也遇到許多難點,
通過上網的資料查找和網上的視頻教學,使我對此的課程設計有很大的幫助,
總之這此的設計使我受益匪淺也讓我明白我還有很多的知識要學。我會繼續加油,努力學習。