世界各国GDP网络爬虫及数据清洗分析

一、选课的背景

为什么要选择此选题?要达到的数据分析的预期目标是什么?

要抓取的网站是世界各国历年来的GDP数据,对爬取得到的数据进行数据清洗提取得到可用数据,来分析,近年来的GDP走势,以及各大洲的GDP占比情况等,进一步探究世界各国、各大洲的发展情况

 

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

1.网络爬虫名称:“世界各国GDP网络爬虫及数据清洗分析”。

2.网络爬虫爬取的内容与数据特征分析: 爬取GDP网站得到国家、洲、GDP、世界占比、年份等数据,然后存储到本地。

3.网络爬虫设计方案概述:

需多个步骤实现: 数据的爬取,使用的是python里面的requests库,这个库可以对网站发起请求获取到对应的数据,再利用lxml库使用xpath技术解析出我们要的数据,然后存储到本地

 

三、主题页面的结构特征分析

数据来源:https://www.kylc.com/stats/global/yearly/g_gdp/2008.html

 

 

 

 

 

所需页面代码:

 

 

四、网络爬虫程序设计

数据爬取及采集:

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
 yeargdp
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制作出一些东西,完成一次实验让我很有成就感,本次实验让我收获良多。

posted @ 2021-06-24 20:00  lunaticplus  阅读(1517)  评论(0)    收藏  举报