世界各国GDP网络爬虫及数据清洗分析
一、选课的背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?
要抓取的网站是世界各国历年来的GDP数据,对爬取得到的数据进行数据清洗提取得到可用数据,来分析,近年来的GDP走势,以及各大洲的GDP占比情况等,进一步探究世界各国、各大洲的发展情况
二、主题式网络爬虫设计方案
1.网络爬虫名称:“世界各国GDP网络爬虫及数据清洗分析”。
2.网络爬虫爬取的内容与数据特征分析: 爬取GDP网站得到国家、洲、GDP、世界占比、年份等数据,然后存储到本地。
3.网络爬虫设计方案概述:
需多个步骤实现: 数据的爬取,使用的是python里面的requests库,这个库可以对网站发起请求获取到对应的数据,再利用lxml库使用xpath技术解析出我们要的数据,然后存储到本地
所需页面代码:

四、网络爬虫程序设计
数据爬取及采集:
import requests from lxml import etree import pandas as pd import matplotlib.pyplot as plt import warnings #忽略警告 warnings.filterwarnings("ignore") #显示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] #浏览器的UA headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'} def get_data(url): for n in range(20): try: dfs = requests.get(url,headers = headers,timeout = 5,verify=False).text except Exception: pass else: break return dfs #新建表格存储数据 datas = pd.DataFrame() #循环爬取每一年的数据 for year in range(1960,2020): print(year) #构造链接 url1 = 'https://www.kylc.com/stats/global/yearly/g_gdp/'+str(year)+'.html' #获取网页源码 df1 = get_data(url1) #转化为HTML格式数据 html1 = etree.HTML(df1) #提取对应数据 df1 = html1.xpath('//tbody/tr/td[2]/text()') df2 = html1.xpath('//tbody/tr/td[3]/text()') df3 = html1.xpath('//tbody/tr/td[4]/text()') df4 = html1.xpath('//tbody/tr/td[5]/text()') #找到不要的数据标签 index1 = df1.index('全世界') #删除数据 del df1[index1] del df3[index1] del df4[index1] index2 = df1.index('欧盟地区') del df1[index2] del df3[index2] del df4[index2] print(df1) print(df2) print(df3) print(df4) #存入dataframe表格 data = pd.DataFrame() data['国家'] = df1 data['洲'] = df2 data['GDP'] = df3 data['占世界%'] = df4 data['year'] = year #合并到大表格 datas = pd.concat([datas,data]) datas.to_excel('数据.xlsx',index = None)

爬取运行生成一个excel文件:

数据清洗:
#清洗数据 datas['gdp'] = datas['GDP'].map(lambda x:float(x.split('(')[-1].split(')')[0].replace(',',''))) #去掉占比的百分号 datas['占比'] = datas['占世界%'].map(lambda x:float(x.replace('%',''))) #去掉不要的列 datas.drop(['GDP','占世界%'],axis = 1,inplace = True) #存入excel datas.to_excel('清洗后数据.xlsx',index = None)
清洗后数据:

数据可视化:
#计算全球gdp总和 df = datas.groupby('year')[['gdp']].sum().reset_index()
df
| year | gdp | |
|---|---|---|
| 0 | 1960 | 1.159706e+12 |
| 1 | 1961 | 1.207084e+12 |
| 2 | 1962 | 1.320428e+12 |
| 3 | 1963 | 1.422081e+12 |
| 4 | 1964 | 1.557861e+12 |
| 5 | 1965 | 1.705823e+12 |
| 6 | 1966 | 1.851065e+12 |
| 7 | 1967 | 1.976137e+12 |
| 8 | 1968 | 2.139612e+12 |
| 9 | 1969 | 2.360420e+12 |
| 10 | 1970 | 2.806582e+12 |
| 11 | 1971 | 3.102306e+12 |
| 12 | 1972 | 3.579873e+12 |
| 13 | 1973 | 4.366792e+12 |
| 14 | 1974 | 5.034752e+12 |
| 15 | 1975 | 5.622097e+12 |
| 16 | 1976 | 6.112821e+12 |
| 17 | 1977 | 6.909353e+12 |
| 18 | 1978 | 8.147986e+12 |
| 19 | 1979 | 9.462034e+12 |
| 20 | 1980 | 1.068434e+13 |
| 21 | 1981 | 1.096273e+13 |
| 22 | 1982 | 1.086737e+13 |
| 23 | 1983 | 1.111460e+13 |
| 24 | 1984 | 1.154188e+13 |
| 25 | 1985 | 1.214148e+13 |
| 26 | 1986 | 1.436572e+13 |
| 27 | 1987 | 1.644069e+13 |
| 28 | 1988 | 1.895365e+13 |
| 29 | 1989 | 1.977146e+13 |
| 30 | 1990 | 2.254026e+13 |
| 31 | 1991 | 2.357993e+13 |
| 32 | 1992 | 2.502218e+13 |
| 33 | 1993 | 2.548967e+13 |
| 34 | 1994 | 2.737334e+13 |
| 35 | 1995 | 3.050036e+13 |
| 36 | 1996 | 3.117760e+13 |
| 37 | 1997 | 3.105015e+13 |
| 38 | 1998 | 3.100268e+13 |
| 39 | 1999 | 3.214485e+13 |
| 40 | 2000 | 3.321171e+13 |
| 41 | 2001 | 3.304667e+13 |
| 42 | 2002 | 3.432365e+13 |
| 43 | 2003 | 3.854125e+13 |
| 44 | 2004 | 4.346284e+13 |
| 45 | 2005 | 4.708461e+13 |
| 46 | 2006 | 5.105395e+13 |
| 47 | 2007 | 5.755437e+13 |
| 48 | 2008 | 6.315511e+13 |
| 49 | 2009 | 5.989670e+13 |
| 50 | 2010 | 6.554976e+13 |
| 51 | 2011 | 7.283549e+13 |
| 52 | 2012 | 7.452482e+13 |
| 53 | 2013 | 7.665770e+13 |
| 54 | 2014 | 7.877401e+13 |
| 55 | 2015 | 7.407544e+13 |
| 56 | 2016 | 7.524604e+13 |
| 57 | 2017 | 8.012449e+13 |
| 58 | 2018 | 8.511852e+13 |
| 59 | 2019 | 8.574098e+13 |
plt.plot(df['year'],df['gdp'],alpha=0.8,linewidth = 3) plt.xlabel("year",fontsize=14) plt.ylabel('gdp',fontsize=14) plt.title('每年全球GDP变化') plt.grid() # 生成网格 plt.show()

#看看历年gdp均值排名前20的国家 df1 = datas.groupby('国家')[['gdp']].mean().reset_index().sort_values(by = 'gdp',ascending = False).iloc[:20] df1
| 国家 | gdp | |
|---|---|---|
| 167 | 美国 | 7.457538e+12 |
| 121 | 日本 | 2.781435e+12 |
| 2 | 中国 | 2.374242e+12 |
| 103 | 德国 | 2.015667e+12 |
| 132 | 法国 | 1.229240e+12 |
| 174 | 英国 | 1.228984e+12 |
| 104 | 意大利 | 9.847651e+11 |
| 17 | 俄罗斯 | 9.572053e+11 |
| 96 | 巴西 | 6.988986e+11 |
| 30 | 加拿大 | 6.711231e+11 |
| 42 | 印度 | 6.258005e+11 |
| 184 | 西班牙 | 5.686355e+11 |
| 197 | 韩国 | 4.812252e+11 |
| 73 | 墨西哥 | 4.631568e+11 |
| 142 | 澳大利亚 | 4.511172e+11 |
| 175 | 荷兰 | 3.707321e+11 |
| 135 | 波兰 | 3.192625e+11 |
| 41 | 印尼 | 2.866730e+11 |
| 56 | 土耳其 | 2.713791e+11 |
| 152 | 瑞士 | 2.645515e+11 |
plt.figure(figsize = (10,6)) plt.bar(df1['国家'],df1['gdp'],alpha=0.8) plt.xlabel("国家",fontsize=14) plt.ylabel('gdp',fontsize=14) plt.title('GDP均值国家排名TOP20') plt.grid() # 生成网格 plt.xticks(rotation=90)#x轴标签旋转90度 plt.show()

#五大洲历年GDP总和 df2 = datas.groupby('洲')[['gdp']].sum().reset_index() df2['占比'] = df2['gdp']/df2['gdp'].sum() df2
| 洲 | gdp | 占比 | |
|---|---|---|---|
| 0 | 亚洲 | 4.922058e+14 | 0.286408 |
| 1 | 大洋洲 | 3.175282e+13 | 0.018477 |
| 2 | 欧洲 | 5.446584e+14 | 0.316929 |
| 3 | 美洲 | 6.052931e+14 | 0.352212 |
| 4 | 非洲 | 4.463778e+13 | 0.025974 |
#准备数据 values = list(df2['占比']) #准备标签 labels = list(df2['洲']) #使用自定义颜色 colors = ['red','pink','magenta','purple','orange'] #将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆 plt.axes(aspect='equal') #控制X轴和Y轴的范围(用于控制饼图的圆心、半径) plt.xlim(0,8) plt.ylim(0,8) #不显示边框 plt.gca().spines['right'].set_color('none') plt.gca().spines['top'].set_color('none') plt.gca().spines['left'].set_color('none') plt.gca().spines['bottom'].set_color('none') #绘制饼图 plt.pie(x=values, #绘制数据 labels=labels,#添加编程语言标签 colors=colors, #设置自定义填充色 autopct='%.1f%%',#设置百分比的格式,保留3位小数 pctdistance=0.5, #设置百分比标签和圆心的距离 labeldistance=1.2,#设置标签和圆心的距离 startangle=180,#设置饼图的初始角度 center=(4,4),#设置饼图的圆心(相当于X轴和Y轴的范围) radius=3.8,#设置饼图的半径(相当于X轴和Y轴的范围) counterclock= False,#是否为逆时针方向,False表示顺时针方向 wedgeprops= {'linewidth':1,'edgecolor':'green'},#设置饼图内外边界的属性值 textprops= {'fontsize':12,'color':'black'},#设置文本标签的属性值 frame=1) #是否显示饼图的圆圈,1为显示 #不显示X轴、Y轴的刻度值 plt.xticks(()) plt.yticks(()) #添加图形标题 plt.title('') #显示图形 plt.show()

五、结论
1、每年全球的GDP都是处于增长情况,并且2000年之后增长的比较快速;
2、往年GDP平均水平比较高的国家有如下几个:美国、日本、中国、德国、法国;
3、五大洲中GDP的排名分别是:美洲>欧洲>亚洲>非洲>大洋洲
六、反思与总结
1.对于matplotlib这个库的使用,一开始是奔着用起来比较简单去的,但是画出来的图可能比较丑,所以想把图画好看还是得花一些功夫的,在这期间我对这个库也更加了解了,自己可以调节很多方面的东西。
2.这次实验对于python的使用让我学到了很多,也了解到了原来python能干这么多事,而且出来的效果很不错,体会到了大数据的魅力。使用python制作出一些东西,完成一次实验让我很有成就感,本次实验让我收获良多。

浙公网安备 33010602011771号