日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图

發布時間:2025/3/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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對對齊的數據進行繪圖。


查看網頁源代碼


網頁源代碼,箭頭位置即下載的文件

|<ul class="f14"> | | | <li><span>2019-12-31</span> | | | <a href="[./201912/P020191231644906597282.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201912/P020191231644906597282.xlsx)" target="_bank" title="11月統計月報">11月統計月報</a></li> | | | | | | <li><span>2019-12-05</span> | | | <a href="[./201912/P020191205637063227715.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201912/P020191205637063227715.xlsx)" target="_bank" title="10月統計月報">10月統計月報</a></li> | | | | | | <li><span>2019-11-12</span> | | | <a href="[./201911/P020191112537765946834.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191112537765946834.xlsx)" target="_bank" title="9月統計月報">9月統計月報</a></li> | | | | | | <li><span>2019-10-10</span> | | | <a href="[./201911/P020191114628665804316.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191114628665804316.xlsx)" target="_bank" title="8月統計月報">8月統計月報</a></li> | | | | | | </ul> | | | | | | <div class="blankH12"></div> | | | <ul class="f14"> | | | | | | <li><span>2019-09-10</span> | | | <a href="[./201911/P020191118344715996243.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118344715996243.xlsx)" target="_bank" title="7月統計月報">7月統計月報</a></li> | | | | | | <li><span>2019-07-10</span> | | | <a href="[./201911/P020191118350091450271.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118350091450271.xlsx)" target="_bank" title="6月統計月報">6月統計月報</a></li> | | | | | | <li><span>2019-06-10</span> | | | <a href="[./201911/P020191118385640636026.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118385640636026.xlsx)" target="_bank" title="5月統計月報">5月統計月報</a></li> | | | | | | <li><span>2019-05-10</span> | | | <a href="[./201911/P020191118393966687607.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118393966687607.xlsx)" target="_bank" title="4月統計月報">4月統計月報</a></li> | | | | | | </ul> | | | | | | <div class="blankH12"></div> | | | <ul class="f14"> | | | | | | <li><span>2019-04-10</span> | | | <a href="[./201911/P020191118398490226826.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118398490226826.xlsx)" target="_bank" title="3月統計月報">3月統計月報</a></li> | | | | | | <li><span>2019-03-12</span> | | | <a href="[./201911/P020191118402541238839.xlsx](http://tjj.sc.gov.cn/sjfb/sjxz/201911/P020191118402541238839.xlsx)" target="_bank" title="2月統計月報">2月統計月報</a></li> | | | | | | </ul> | | | |

獲取數據

獲取網頁內容

#四川省統計局網址 url = 'http://tjj.sc.gov.cn/sjfb/sjxz/' #獲取網頁內容 r = requests.get(url)

使用python爬蟲的本質是程序模擬瀏覽網頁,并獲取到網頁上顯示的內容。
requests.get()可以獲取網頁內容。

file_lst = [] #保存文件鏈接 file_name = [] #保存文件名 bs = BeautifulSoup(r.content, "html.parser") #解析網頁,比如加上.content的內容。 hyperlink = bs.find_all('a') for h in hyperlink:hh = h.get('href')if hh and '.xlsx' in hh:file_lst.append(hh)file_name.append(h.string)

由于網頁中提供下載的文件命名不是按照有意義的命名方式進行命名,因此需要將文件名和文件鏈接進行分別存儲在不同的列表中。
file_lst 用于保存文件鏈接。
file_name 用于保存文件名。

# encoding: utf-8 """ @version: 1.0 @author: Jarrett_UESTC @file: tongji @time: 2020/1/19 22:35 """import requests from bs4 import BeautifulSoup import os from urllib.request import urlretrieve #方法直接將遠程數據下載到本地url = 'http://tjj.sc.gov.cn/sjfb/sjxz/'r = requests.get(url)file_lst = [] file_name = [] bs = BeautifulSoup(r.content, "html.parser") #解析網頁,比如加上.content的內容。 hyperlink = bs.find_all('a') for h in hyperlink:hh = h.get('href')if hh and '.xlsx' in hh:file_lst.append(hh)file_name.append(h.string)def download(url, savepath, filename):"""download file from internet:param url: path to download from:param savepath: path to save files:return: None"""def reporthook(a, b, c):"""顯示下載進度:param a: 已經下載的數據塊:param b: 數據塊的大小:param c: 遠程文件大小:return: None"""t = (a * b * 100.0 / c)if t >= 100:t = 100print("rdownloading: %5.1f%%" % t, end="")#filename = os.path.basename(url)# 判斷文件是否存在,如果不存在則下載if not os.path.isfile(os.path.join(savepath, filename)):print('Downloading data from %s' % url)urlretrieve(url, os.path.join(savepath, filename), reporthook=reporthook)print('nDownload finished!')else:print('File already exsits!')# 獲取文件大小filesize = os.path.getsize(os.path.join(savepath, filename))# 文件大小默認以Bytes計, 轉換為Mbprint('File size = %.2f Mb' % (filesize/1024/1024))#print(file_lst) #print(file_name) for i in range(len(file_lst)):download(url+file_lst[i][2:], savepath='./file/', filename = file_name[i]+'.xlsx')


爬取到的網站數據,一共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:pass

read(file, sheet_index=0): 讀取excel文件的函數。

Excel表格中縱軸信息

0 規模以上工業增加值
1 工業增加值
2 一、采礦業
3 制造業
4 電力、熱力、燃氣及水生產和供應業
5 二、國有企業
6 集體企業
7 股份合作企業
8 股份制企業
9 外商及港澳臺商投資企業
10 其他經濟類型企業
11 # 國有控股企業
12 產銷率(%)
13 說明:規模以上工業統計范圍為主營業務收入2000萬元以上的工業企業。

2-11月份規模以上工業增加值的數據

由于獲取到的不同月份的數據是橫向存儲的數據結構,不利于縱列操作。python對DataFrame數據轉置的操作語句是data.T。

data = data.T

0 本月±% ... 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()

展望與結論

  • 采用Requests方法爬取該網站時幾乎沒有難度,根據api接口說明及相關案例可以解決大部分問題。
  • 讀取Excel時可以采用速度更快的方法。
    3.繪制的圖片結果不夠完美,可以更進一步的優化,例如在官方提供的數據中有空格或無效字符應該去除。
  • 后言

    • 如果在程序運行中遇到任何問題,歡迎交流學習。
    • 希望獲取到四川省統計局某一項的數據分析結果可以私信我。

    總結

    以上是生活随笔為你收集整理的python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。