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()

结果视图:

全部评论

相关推荐

美丽的查理斯不讲武德:包kpi的啊,感觉虾皮一点hc都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务