Python大作业准备(一)
Python大作业 / 爬虫+可视化(day1)
开始搞python大作业了,纯手敲,可参考,不可直接copy
思路:对全国各省的地区生产总值进行爬取,并可视化展示
爬取网站: http://data.stats.gov.cn/
所用库:time,re,selenium,pandas,matplotlib,bs4,csv
结果展示:静态(如果时间够的话准备下动态的吧)
爬取过程:动态模拟鼠标+静态分析
可视化过程:数据处理+matplotlib绘图
数据爬取部分:
import time
import re
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from bs4 import BeautifulSoup
import pandas as pd
#国家数据、中华人民共和国国家统计局
url = "http://data.stats.gov.cn"
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)
xRdata = '//*[@id="nav"]/ul/li[6]/a' #地区数据
ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
time.sleep(3)
xPdata = '//*[@id="menuE01"]/li[3]/a' #分省年度数据
ActionChains(driver).click(driver.find_element_by_xpath(xPdata)).perform()
time.sleep(4) #加载页面,停留时间长一些
xTable = '//*[@id="main-container"]/div[2]/div[2]/div[2]/div/div[3]/table/tbody' #数据表
table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML')
soup = BeautifulSoup(table,'html.parser') #解析表单
tb = soup.find_all('tr') #查找表内tr标签
tb_p = [] #各省市名字
tb_ = []
tb_1 = [[],[],[],[],[],[],[],[],[]]
for row in tb:
row_text = row.text
#查找第一个数字的索引
ret1 = re.search('\d',row_text).start()
#将各个省份写入列表中
tb_p.append(row_text[:ret1])
#截断至第一个数字
row_text = row_text[ret1:]
for i in range(9):
try:
#顺序查找点
ret = row_text.find('.')
#将第一年年数据保存到列表中
tb_.append(row_text[:ret+3])
#删去第一年的数据
row_text = row_text[ret+3:]
except:
break
for i in range(9):
for j in range(i,len(tb_),9):
try:
tb_1[i].append(tb_[j])
except:
break
data = {'省份':tb_p,
'2018年数据':tb_1[0],
'2017年数据':tb_1[1],
'2016年数据':tb_1[2],
'2015年数据':tb_1[3],
'2014年数据':tb_1[4],
'2013年数据':tb_1[5],
'2012年数据':tb_1[6],
'2011年数据':tb_1[7],
'2010年数据':tb_1[8]}
dataframe = pd.DataFrame(data)
dataframe.to_csv('Province_GDP.csv',index=False,sep=',',encoding='utf-8-sig')
driver.close()
数据爬取结果:
初级可视化部分:
import matplotlib.pyplot as plt
import csv
plt.rcParams['font.sans-serif']=['SimHei'] # 将plt的汉语设置为黑体
f = open('Province_GDP.csv', 'r',encoding='utf-8')
csvreader = csv.reader(f)
final_list = list(csvreader)
# 将表格中的每个数据的格式改为float类型(之前的为str)
del(final_list[0])
final_ = []
for i in range(len(final_list)):
fin = list(map(lambda x :float(x),final_list[i][1:]))
fin.insert(0,final_list[i][0])
final_.append(fin)
# 将数据以2018年数据排序
final_ = sorted(final_,key=lambda x:x[1],reverse=True)
#print(final_)
days = list(range(2010,2019))
sub_plots = [221,222,223,224]
for j in range(4):
plt.suptitle('全国各省2010-2018年GDP变化折线图(x:年,y:亿元)\n根据各省2018年GDP排序')
plt.subplot(sub_plots[j])
if j != 3:
for i in range(8*j,8+8*j):
shuju =(final_[i][1:])[::-1]
plt.plot(days, shuju,'.-',label = final_[i][0])
plt.legend(loc=2) #将图例放在左上角
else :
for i in range(8*j,8+8*j-1):
shuju =(final_[i][1:])[::-1]
plt.plot(days, shuju,'.-',label = final_list[i][0])
plt.legend(loc=2)
plt.show()
初级可视化结果:
初稿结束,后期会加以修改
做的时候无聊顺便就做了个九年GDP总和的柱状图(属实丑)我也不知道我为什么写了这么多,应该四五行就能解决吧?
import matplotlib.pyplot as plt
import csv
plt.rcParams['font.sans-serif']=['SimHei']
f = open('Province_GDP.csv', 'r',encoding='utf-8')
csvreader = csv.reader(f)
final_list = list(csvreader)
final = []
list_province = []
list_Gdp = []
dit = {}
for i in range(31):
final.append([])
for i in range(1,len(final_list)):
for j in range(1,10):
final[i-1].append(float(final_list[i][j]))
for i in range(31):
sums = sum(final[i])
dit.setdefault(final_list[i+1][0],sums)
list_sorted = sorted(dit.items(), key = lambda i:i[1],reverse = True)
for i in range(len(list_sorted)):
list_province.append(list_sorted[i][0])
list_Gdp.append(list_sorted[i][1])
sub_plots = [221,222,223,224]
for j in range(4):
plt.suptitle('2010-2018共9年各省GDP总和排行')
plt.subplot(sub_plots[j])
for i in range(1+8*j,9+8*j):
plt.bar(list_province[1+8*j:9+8*j],list_Gdp[1+8*j:9+8*j],fc='g')
plt.show()
结果视图: