import requests as rq import matplotlib.pyplot as plt import re import pandas as pd #网址 url='https://www.ip138.com/shoudu/' headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"} rp = rq.get(url,headers=headers) rp.encoding='utf-8' #设置编码为utf-8 a=rp.text #转文本用正则表达式分析 x=re.findall('(.+?)|(.+?)', a) #分列表以制作二维数据,分别为国家、面积、英文简称、首都 country=[] square=[] english=[] capital=[] n=1 for i in x: #遍历循环将个数据分离 i=str(i) for j in ['(',')','\'','\"','约','\\xa0',',',' ','⑦']: #将字符串中多余字符删除 i=i.replace(j,'') if n%4==1: country.append(i) n+=1 elif n%4==2: i=eval(i) square.append(i) n+=1 elif n%4==3: english.append(i) n+=1 elif n%4==0: capital.append(i) if i=='开罗': country.append('大阿拉伯利比亚人民社会主义民众国') #此处处理一个正则表达式分析过程中的bug n+=1 n+=1 #建立二维数据 df=pd.DataFrame(columns=['国家','面积','英文名称','首都']) #将信息填入dataframe数据中 df.国家=country df['面积']=square df.英文名称=english df.首都=capital #将数据按照国家面积大小进行排序 f=df.sort_values(by=['面积'],axis=0,ascending=[False]) #绘制饼状图所用编号 bh=['巨型国家','超大型国家','大型国家','中型国家','小型国家','超小型国家','微型国家'] #巨型国家面积大于500万平方千米 jx=f[f['面积']>5000000][['国家','面积']] #超大型国家的面积为100万~500万平方千米 cd=f[f['面积']<5000000][['国家','面积']] ; cdx=cd[cd['面积']>1000000] #大型国家的面积为50~100万平方千米 d=f[f['面积']<1000000][['国家','面积']] ; dx=d[d['面积']>500000] #中型国家的面积为10万~50万平方千米 z=f[f['面积']<500000][['国家','面积']] ; zx=z[z['面积']>100000] #小型国家的面积为5万~10万平方千米 x=f[f['面积']<100000][['国家','面积']] ; xx=x[x['面积']>50000] #超小型国家的面积为1万~5万平方千米 cx=f[f['面积']<50000][['国家','面积']] ; cxx=cx[cx['面积']>10000] #微型国家的面积是1万平方千米以下 wx=f[f['面积']<10000][['国家','面积']] #统计各个国家分类中国家数量 m=[len(jx),len(cdx),len(dx),len(zx),len(xx),len(cxx),len(wx)] plt.pie(m, labels=bh,autopct='%.1f%%',explode=[0.4,0,0,0,0.3,0,0],shadow=True,colors=('r','g','b','c','m','y','w')) #将饼状图和原表格存储 plt.savefig('国家比例.png') df.to_excel('世界各国.xls') ''' start2021/12/14 end2021/12/15 auther王永麟 杨镇 '''