python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图
開發環境
- Windows 10 企業版
- Pycharm 2019.01 EAP Community Edition
- Python 3.7
前言
四川省統計局提供了過去若干月份的統計數據。統計局提供的數據內容豐富,數據完整,包括了給規模以上工業增加值,規模以上工業企業經濟效益等等信息。但是如下圖所示各個月份的統計數據在不同的表格中,無法形象地表現各類數據在不同時間點的變化情況。
四川省統計局數據下載頁面(2020年1月28日)
準備工作
因此為了快速將過去若干個月的數據進行整理并分析獲取相關信息的變化情況,因此接下來構思了數據統計的方法。
1.使用python的Request庫獲取網頁內容。
2.將網站提供的文件.xlxs文件下載保存。
3.對下載的數據進行整理解析。
4.使用matplotlib對對齊的數據進行繪圖。
查看網頁源代碼
網頁源代碼,箭頭位置即下載的文件
獲取數據
獲取網頁內容
#四川省統計局網址 url = 'http://tjj.sc.gov.cn/sjfb/sjxz/' #獲取網頁內容 r = requests.get(url)使用python爬蟲的本質是程序模擬瀏覽網頁,并獲取到網頁上顯示的內容。
requests.get()可以獲取網頁內容。
由于網頁中提供下載的文件命名不是按照有意義的命名方式進行命名,因此需要將文件名和文件鏈接進行分別存儲在不同的列表中。
file_lst 用于保存文件鏈接。
file_name 用于保存文件名。
爬取到的網站數據,一共10個Excel文件
解析數據
# encoding: utf-8 """ @version: 1.0 @author: Jarrett_UESTC @file: xlrd @time: 2020/1/23 15:56 """import xlrd import os import pandas as pd import re import matplotlib.pyplot as pltdef get_filelist(dir):Filelist = []File_name_lst = []for home, dirs, files in os.walk(path):for filename in files:# 文件名列表,包含完整路徑Filelist.append(os.path.join(home, filename))# # 文件名列表,只包含文件名#re.findall(r'd',str1)month = re.findall(r'd', (filename))month = ''.join(month)File_name_lst.append(int(month))passreturn Filelist, File_name_lstpath = './file'file_list, file_name = get_filelist(path) file_name = sorted(file_name) #print(file_name)def read(file, sheet_index=0):""":param file: 文件路徑:param sheet_index: 讀取的工作表索引:return: 二維數組"""workbook = xlrd.open_workbook(file)# all_sheets_list = workbook.sheet_names()# print("本文件中所有的工作表名稱:", all_sheets_list)# 按索引讀取工作表sheet = workbook.sheet_by_index(sheet_index)#print(sheet_index)#print("工作表名稱:", sheet.name)#print("行數:", sheet.nrows)#print("列數:", sheet.ncols)# 按工作表名稱讀取數據# second_sheet = workbook.sheet_by_name("b")# print("Second sheet Rows:", second_sheet.nrows)# print("Second sheet Cols:", second_sheet.ncols)# 獲取單元格的數據# cell_value = sheet.cell(1, 0).value# print("獲取第2行第1列的單元格數據:", cell_value)data = []for i in range(0, sheet.nrows):data.append(sheet.row_values(i))return data#print(read(file_list[0]))file = [] for j in range(len(file_name)):for i in range(len(file_list)):if (file_list[i]).find(str(file_name[j])) > -1:file.append(file_list[i])continueelse:pass#print(file)all_data = pd.DataFrame() for i in range(len(file_name)):if file_name[i]%3 == 0:data = pd.DataFrame(read(file[i], sheet_index = 3))else:data = pd.DataFrame(read(file[i]))data = data.Tif i == 0:all_data = dataelse:data.drop(index=0, inplace=True)all_data = all_data.append(data)data_index = all_data.loc[0] #獲取第一行數據 all_data.drop(index=0, inplace=True) #刪除首行數據 all_data.reset_index(drop=True, inplace=True) print(data_index) all_data = all_data.fillna(0) print(all_data) data1 = all_data.iloc[[0,2,4,6,8,10,12,14,16,18,]] data2 = all_data.iloc[[1,3,5,7,9,11,13,15,17,19]]print(data1) print(data2)代碼解析:
get_filelist(dir):獲取在路徑中的文件內容,分別返回在路徑中的文件地址和文件名。由于我們的需求是希望按照月份獲取不同的文件,因此需要按順序讀取月份。
month = re.findall(r'd', (filename)) 采用re正則表達式提取文件名中的數值。
由于sorted()函數只能對列表中的數字進行排序,因此需要將文件名列表轉換為只有數值的列表。
在對文件名進行排序的基礎上對文件路徑也進行排序:
file = [] for j in range(len(file_name)):for i in range(len(file_list)):if (file_list[i]).find(str(file_name[j])) > -1:file.append(file_list[i])continueelse:passread(file, sheet_index=0): 讀取excel文件的函數。
Excel表格中縱軸信息0 規模以上工業增加值
1 工業增加值
2 一、采礦業
3 制造業
4 電力、熱力、燃氣及水生產和供應業
5 二、國有企業
6 集體企業
7 股份合作企業
8 股份制企業
9 外商及港澳臺商投資企業
10 其他經濟類型企業
11 # 國有控股企業
12 產銷率(%)
13 說明:規模以上工業統計范圍為主營業務收入2000萬元以上的工業企業。
由于獲取到的不同月份的數據是橫向存儲的數據結構,不利于縱列操作。python對DataFrame數據轉置的操作語句是data.T。
data = data.T0 本月±% ... 0
1 累計±% 7.8 -11.4 9.9 5.3 ... 4.5 97.9 0
2 本月±% 8.59917 10.2769 8.57273 7.82264 ... 7.97941 0
3 累計±% 8.09946 9.57373 8.3171 5.59089 ... 8.17587 97.5 0
4 本月±% 8.19936 4.8707 8.60466 7.82713 ... 11.7472 0
5 累計±% 8.0997 8.79899 8.24435 6.138 ... 9.2568 97.3 0
6 本月±% 8.39919 12.8727 8.52713 4.04696 ... 11.1338 0
7 累計±% 8.19936 11.0549 8.23284 5.62991 ... 9.1104 97 0
8 本月±% 7.99986 6.82139 8.6297 3.46406 ... 6.53752 0
9 累計±% 8.19952 10.61 8.26665 5.52924 ... 8.7852 97.2 0
10 本月±% 7.89968 6.37955 8.24926 6.47463 ... 8.38832 0
11 累計±% 8.09979 9.98552 8.21664 5.72195 ... 8.76858 97.4 0
12 本月±% 7.8 5.51805 8.13193 7.36263 ... 7.06552 0 0
13 累計±% 8.1 9.32167 8.26085 6.00397 ... 8.63433 97.5 0 0
14 本月±% 8.6 5.96442 9.13242 6.37795 ... 8.7 0
15 累計±% 8.2 9.19974 8.44314 5.90009 ... 8.8 97.6 0
16 本月±% 7.2 5.30024 7.16615 8.54786 ... 7.6
17 累計±% 8.09982 10.2048 8.16261 5.88815 ... 8.65569 97.7
18 本月±% 7.7 5.98313 8.09603 5.9083 ... 5.2
19 累計±% 8 8.98966 8.19198 5.98343 ... 7.99959 97.9
0 本月±% ... 0
2 本月±% 8.59917 10.2769 8.57273 7.82264 ... 7.97941 0
4 本月±% 8.19936 4.8707 8.60466 7.82713 ... 11.7472 0
6 本月±% 8.39919 12.8727 8.52713 4.04696 ... 11.1338 0
8 本月±% 7.99986 6.82139 8.6297 3.46406 ... 6.53752 0
10 本月±% 7.89968 6.37955 8.24926 6.47463 ... 8.38832 0
12 本月±% 7.8 5.51805 8.13193 7.36263 ... 7.06552 0 0
14 本月±% 8.6 5.96442 9.13242 6.37795 ... 8.7 0
16 本月±% 7.2 5.30024 7.16615 8.54786 ... 7.6
18 本月±% 7.7 5.98313 8.09603 5.9083 ... 5.2
1 累計±% 7.8 -11.4 9.9 5.3 ... 4.5 97.9 0
3 累計±% 8.09946 9.57373 8.3171 5.59089 ... 8.17587 97.5 0
5 累計±% 8.0997 8.79899 8.24435 6.138 ... 9.2568 97.3 0
7 累計±% 8.19936 11.0549 8.23284 5.62991 ... 9.1104 97 0
9 累計±% 8.19952 10.61 8.26665 5.52924 ... 8.7852 97.2 0
11 累計±% 8.09979 9.98552 8.21664 5.72195 ... 8.76858 97.4 0
13 累計±% 8.1 9.32167 8.26085 6.00397 ... 8.63433 97.5 0 0
15 累計±% 8.2 9.19974 8.44314 5.90009 ... 8.8 97.6 0
17 累計±% 8.09982 10.2048 8.16261 5.88815 ... 8.65569 97.7
19 累計±% 8 8.98966 8.19198 5.98343 ... 7.99959 97.9
接下來將對獲取的數據進行繪圖。
繪圖
對本月百分比采用柱狀圖繪圖,累計百分比采用折線圖繪圖。
繪圖結果如下圖所示。
繪圖結果
源代碼
以下是數據解析和繪圖的源代碼,僅供參考。
# encoding: utf-8 """ @version: 1.0 @author: Jarrett_UESTC @file: xlrd @time: 2020/1/23 15:56 """import xlrd import os import pandas as pd import re import matplotlib.pyplot as pltdef get_filelist(dir):Filelist = []File_name_lst = []for home, dirs, files in os.walk(path):for filename in files:# 文件名列表,包含完整路徑Filelist.append(os.path.join(home, filename))# # 文件名列表,只包含文件名#re.findall(r'd',str1)month = re.findall(r'd', (filename))month = ''.join(month)File_name_lst.append(int(month))passreturn Filelist, File_name_lstpath = './file'file_list, file_name = get_filelist(path) file_name = sorted(file_name) #print(file_name)def read(file, sheet_index=0):""":param file: 文件路徑:param sheet_index: 讀取的工作表索引:return: 二維數組"""workbook = xlrd.open_workbook(file)# all_sheets_list = workbook.sheet_names()# print("本文件中所有的工作表名稱:", all_sheets_list)# 按索引讀取工作表sheet = workbook.sheet_by_index(sheet_index)#print(sheet_index)#print("工作表名稱:", sheet.name)#print("行數:", sheet.nrows)#print("列數:", sheet.ncols)# 按工作表名稱讀取數據# second_sheet = workbook.sheet_by_name("b")# print("Second sheet Rows:", second_sheet.nrows)# print("Second sheet Cols:", second_sheet.ncols)# 獲取單元格的數據# cell_value = sheet.cell(1, 0).value# print("獲取第2行第1列的單元格數據:", cell_value)data = []for i in range(0, sheet.nrows):data.append(sheet.row_values(i))return data#print(read(file_list[0]))file = [] for j in range(len(file_name)):for i in range(len(file_list)):if (file_list[i]).find(str(file_name[j])) > -1:file.append(file_list[i])continueelse:pass#print(file)all_data = pd.DataFrame() for i in range(len(file_name)):if file_name[i]%3 == 0:data = pd.DataFrame(read(file[i], sheet_index = 3))else:data = pd.DataFrame(read(file[i]))data = data.Tif i == 0:all_data = dataelse:data.drop(index=0, inplace=True)all_data = all_data.append(data)data_index = all_data.loc[0] #獲取第一行數據 all_data.drop(index=0, inplace=True) #刪除首行數據 all_data.reset_index(drop=True, inplace=True) print(data_index) all_data = all_data.fillna(0) print(all_data) data1 = all_data.iloc[[0,2,4,6,8,10,12,14,16,18,]] data2 = all_data.iloc[[1,3,5,7,9,11,13,15,17,19]]print(data1) print(data2) x1 = file_nameplt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 #有中文出現的情況,需要u'內容'fig,axes = plt.subplots(2,5,figsize=(18, 8)) fig.tight_layout()#調整整體空白,致密布局 fig.subplots_adjust(top=0.95) plt.subplots_adjust(wspace =0.3, hspace =0.3)#調整子圖間距 for i in range(len(data_index)):if i == 0 or i == 11 or i == 12 or i == 13 or i == 14 or i == 15:passelse:y1 = (data1.loc[:, i]).tolist()y1[0] = 0y2 = (data2.loc[:, i]).tolist()if i <= 5:ax1 = axes[0,i-1]else:ax1 = axes[1,i-6]#ax3 = axes[0,2]ax1.bar(x1,y1)ax1_1 = ax1.twinx()ax1_1.plot(x1,y2,'r')ax1.set_xlabel(u'月份')ax1.set_ylabel(u'累計')ax1_1.set_ylabel(u'同比')ax1.set_title(u'四川省統計局n'+data_index[i]) plt.show()展望與結論
3.繪制的圖片結果不夠完美,可以更進一步的優化,例如在官方提供的數據中有空格或無效字符應該去除。
后言
- 如果在程序運行中遇到任何問題,歡迎交流學習。
- 希望獲取到四川省統計局某一項的數據分析結果可以私信我。
總結
以上是生活随笔為你收集整理的python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的迭代器—— Iterator
- 下一篇: websocket python爬虫_p