03-數(shù)據(jù)持久化--openpyxl(附國(guó)家稅務(wù)局稅收政策庫(kù)爬蟲(chóng)案例)

日常工作中仗嗦,一般我們自己使用python寫(xiě)入數(shù)據(jù)時(shí)可训,會(huì)選擇txt昌妹、csv等文件格式,或者直接寫(xiě)入數(shù)據(jù)庫(kù)握截,但是在幫別人寫(xiě)外包爬蟲(chóng)飞崖,或者職場(chǎng)中需要使用office時(shí),我們就需要將數(shù)據(jù)寫(xiě)入Excel了谨胞。而在python中操作excel固歪,有一個(gè)非常好用的庫(kù)叫openpyxl,今天我們就來(lái)介紹一下它胯努。

下文從4個(gè)方面描述openpyxl的用法:
1.創(chuàng)建操作
2.寫(xiě)入操作
3.保存操作
4.讀取操作

01.創(chuàng)建操作

將數(shù)據(jù)寫(xiě)入Excel的第一步是創(chuàng)建工作簿牢裳,基本步驟如下:

1. 導(dǎo)入openpyxl相關(guān)庫(kù)
2. 創(chuàng)建工作簿對(duì)象
3. 獲取工作簿的活動(dòng)表

'''
1. 導(dǎo)入相關(guān)庫(kù)
'''
from openpyxl import Workbook

'''
2. 創(chuàng)建工作簿 -- 創(chuàng)建新的、空的excel文件
默認(rèn)創(chuàng)建的工作表命名為sheet
'''
wb = Workbook()
'''
3. 獲取工作簿的活動(dòng)表
默認(rèn)指向索引為0的工作表【即第一張表】
'''
sheet = wb.active 

以上基本操作基本可以滿足大部分需求叶沛,但是有時(shí)候我們想要創(chuàng)建更多的工作表蒲讯,或者更改工作表的表名,那就要通過(guò)以下代碼實(shí)現(xiàn)灰署。

'''
sheet = wb.create_sheet(命名判帮,插入位置)
'''
sheet = wb.create_sheet("Mysheet") # 在末尾插入(default)
sheet = wb.create_sheet("Mysheet", 0) # 在最前端插入
sheet = wb.create_sheet("Mysheet", -1) # 插入在倒數(shù)第二個(gè)位置

'''
sheet.title = "新表名"
'''
sheet.title = '重命名的工作表'

02.寫(xiě)入操作

創(chuàng)建完工作簿后,我們就可以寫(xiě)入數(shù)據(jù)了氓侧,寫(xiě)入數(shù)據(jù)一般有以下兩種方法
1. 逐個(gè)單元格寫(xiě)入
2. 逐行寫(xiě)入
實(shí)際工作中我們可以根據(jù)不同的實(shí)際情況使用不同的方法脊另,下面就來(lái)一一介紹下他們

'''
1. 操作單個(gè)單元格
      sheet1["A1"] = "內(nèi)容"        
      這種方法操作不是很友好,不推薦使用

      Worksheet.cell(row = ,column = ,value = ) 方法          
      操作單個(gè)單元格约巷,推薦使用這種方法
'''

sheet['A1'] = 666

sheet.cell(row=1,column=2,value="123")
'''
2. 逐行寫(xiě)入
      工作表對(duì)象.append(iterable) 
      寫(xiě)入列表
           sheet.append(list)
      寫(xiě)入字典
            sheet.append(dict)
'''
sheet.append(['Value1','Value2','Value3'])  #寫(xiě)入列表

sheet.append({'Key1': 'Value1','Key2': 'Value2'}) # 寫(xiě)入字典

與在單個(gè)單元格內(nèi)寫(xiě)入不同偎痛,寫(xiě)入iterable對(duì)象需要注意以下幾點(diǎn):

1. iterable必須是list,tuple,dict,range等類型
2.寫(xiě)入完成后,如果重新打開(kāi)進(jìn)行append寫(xiě)入独郎,則本次寫(xiě)入會(huì)覆蓋上次寫(xiě)入的內(nèi)容
3. 如果是list踩麦,將list從頭到尾寫(xiě)入
4. 如果是dict枚赡,則會(huì)按照相應(yīng)的鍵添加對(duì)應(yīng)的值

03.保存操作

寫(xiě)入完成后,我們需要保存數(shù)據(jù)谓谦,往往需要存入指定路徑的指定文件夾內(nèi)贫橙,下面就來(lái)介紹下如何保存我們的操作

'''使用os模塊生成指定的文件夾,然后將數(shù)據(jù)保存到指定文件夾內(nèi)'''
import os

# 判斷路徑是否存在反粥,如果不存在就創(chuàng)建
if not os.path.exists(path):
    os.mkdir(path)
    wb.save("path + "/" + 文件名.xlsx")   #保存數(shù)據(jù)

這種方法可以幫助我們將excel文件存入指定文件名的文件夾內(nèi)卢肃,如果不需要將excel存入指定文件夾,直接使用wb.save()即可才顿。

04.讀取操作

讀取數(shù)據(jù)到python中進(jìn)行操作莫湘,分為以下幾步:
1. 導(dǎo)入庫(kù)
2. 打開(kāi)文件
3. 獲取需要操作的表table
4. 讀取相關(guān)操作

'''導(dǎo)入庫(kù)'''
from openpyxl import load_workbook

'''
打開(kāi)指定文件
wb = load_workbook("文件路徑")
'''
wb = load_workbook('sample.xlsx')

'''
獲取需要操作的表table
table = wb['表名']
'''
table = wb['sheet1']

'''讀取相關(guān)操作'''
row = table.max_row             #獲取最大行數(shù)
column = table.max_column       #獲取最大列數(shù)

'''讀取單個(gè)單元格的值'''
Data = table.cell(row=1, column=1).value   # 【注意】行和列是指excel里的行和列,均從1開(kāi)始

'''獲取表名'''
sheet_names = wb.sheetnames
sheet1 = sheet_names[0]

通過(guò)上述方法將數(shù)據(jù)讀取到python后郑气,便可以對(duì)數(shù)據(jù)進(jìn)行操作了幅垮,是不是很簡(jiǎn)單?注意操作完成后尾组,別忘了wb.save()操作忙芒。

上述介紹的方法基本可以滿足大部分的excel操作需求,如果需要更多的功能讳侨,可以查閱官方文檔 http://yumos.gitee.io/openpyxl3.0/index.html#document-tutorial

最后呵萨,附上一個(gè)爬取國(guó)家稅務(wù)總局稅收政策庫(kù)的小案例,使用openpyxl寫(xiě)入excel跨跨,實(shí)戰(zhàn)操作一下openpyxl甘桑。【由于寫(xiě)的比較急歹叮,沒(méi)有封裝成類拉,大家將就看~】

"""
目標(biāo)地址:http://www.chinatax.gov.cn/chinatax/n810346/n810825/index.html
1. 采集
    采集以下欄目:
    國(guó)家稅務(wù)總局稅收政策庫(kù)的文號(hào)铆帽、標(biāo)題咆耿、發(fā)文時(shí)間

2. 保存
    將所有信息保存到`稅務(wù)局.xlsx`文件,依據(jù)欄目名創(chuàng)建數(shù)據(jù)表爹橱,每個(gè)欄目的數(shù)據(jù)保存到對(duì)應(yīng)的數(shù)據(jù)表
"""
import requests
import openpyxl

headers = {
    "Cookie":"yfx_c_g_u_id_10003701=_ck20031023441411141558717747518; yfx_mr_10003701=%3A%3Amarket_type_free_search%3A%3A%3A%3Abaidu%3A%3A%3A%3A%3A%3A%3A%3Awww.baidu.com%3A%3A%3A%3Apmf_from_free_search; yfx_key_10003701=; yfx_f_l_v_t_10003701=f_t_1583855054108__r_t_1589904305879__v_t_1589904305879__r_c_1; _Jo0OQK=261D27D4607C671C636D8A35FCD2ACFE9E27EB5478B194EBDD749A125A8EF78DFD2D5393D3C153447D3605F1E5747E3E1661A3EF7EF39AEA38073124D83FC3789EC34275DAD340EB4DDFFF13AA80B4DD4EFFFF13AA80B4DD4EF022996074D0538508C9AF81BA121EF63GJ1Z1QA==; CPS_SESSION=017508EBB5815EE597456BCBBEF0B89B",
    "Host":"www.chinatax.gov.cn",
    "Referer":"http://www.chinatax.gov.cn/chinatax/n810346/n810825/index.html",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
}
url ="http://www.chinatax.gov.cn/api/query"
params = {
    'siteCode': 'bm29000fgk',
    'tab': 'all',
    'key': '9A9C42392D397C5CA6C1BF07E2E0AA6F',
}
wb = openpyxl.Workbook() # 創(chuàng)建新表時(shí)萨螺,不能重復(fù)使用openpyxl.Workbook(),否則會(huì)覆蓋原數(shù)據(jù)

def main():
    number = 1  #main函數(shù)循環(huán)的次數(shù)
    while True:
        C6 = input("輸入要查詢的稅種名")
        list_all = []
        for page in range(1,10):
            data = {
                "timeOption": "0",
                "C6": C6,
                "page": page,
                "pageSize": "10",
                "keyPlace": "1",
                "sort": "dateDesc",
                "qt": "*",
            }
            data_list = get_data(url,data)
            list_all.append(data_list)

        list_all = [j for i in list_all for j in i ]
        print(list_all)
        save_date(list_all,number,C6,wb)
        number += 1


def get_data(url,data):
    data_list =[]
    response = requests.post(url,data=data,params=params,headers=headers)
    response.encoding  = response.apparent_encoding
    json = response.json()
    print(json)

    dict_list = json["resultList"]
    for dict in dict_list:
        publishTime = dict["publishTime"]
        title = dict["title"]
        file_number= dict["customHs"]["DOCNOVAL"]
        link = dict["url"]
        list = [publishTime,title,file_number,link]
        data_list.append(list)

    return data_list

def save_date(list_all,number,C6,wb):
    """
    保存數(shù)據(jù)到excel
    :param list_all: 需要寫(xiě)入的數(shù)據(jù)
    :param number:創(chuàng)建工作表的參數(shù)
    :param C6:輸入的稅種關(guān)鍵字
    :param wb:創(chuàng)建的工作簿對(duì)象
    :return:
    """
    
    sheet = wb.create_sheet(str(number))  # 使用create_sheet創(chuàng)建新表
    sheet.title = f"{C6}"

    for data in list_all:
        sheet.append(data)

    wb.save("稅務(wù)文件.xlsx")


if __name__ == '__main__':
    main()

作者:愛(ài)學(xué)習(xí)愧驱,也愛(ài)女票的于餅喵

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慰技,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子组砚,更是在濱河造成了極大的恐慌吻商,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糟红,死亡現(xiàn)場(chǎng)離奇詭異艾帐,居然都是意外死亡乌叶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門柒爸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)准浴,“玉大人,你說(shuō)我怎么就攤上這事捎稚±趾幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵今野,是天一觀的道長(zhǎng)葡公。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腥泥,這世上最難降的妖魔是什么匾南? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蛔外,結(jié)果婚禮上蛆楞,老公的妹妹穿的比我還像新娘。我一直安慰自己夹厌,他們只是感情好豹爹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著矛纹,像睡著了一般臂聋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或南,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天孩等,我揣著相機(jī)與錄音,去河邊找鬼采够。 笑死肄方,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬癌。 我是一名探鬼主播权她,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逝薪!你這毒婦竟也來(lái)了隅要?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤董济,失蹤者是張志新(化名)和其女友劉穎步清,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體感局,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼啡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年暂衡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崖瞭。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狂巢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出书聚,到底是詐尸還是另有隱情唧领,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布雌续,位于F島的核電站斩个,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驯杜。R本人自食惡果不足惜受啥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸽心。 院中可真熱鬧滚局,春花似錦、人聲如沸顽频。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)糯景。三九已至嘁圈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀淮,已是汗流浹背最住。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怠惶,地道東北人温学。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甚疟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逃延,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349