Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】
Python3 爬蟲學習筆記第九章 —— 【數據儲存系列 — 文件儲存】
文章目錄
- 【9.1】TXT 文本存儲
- 【9.1.1】基本示例
- 【9.1.2】打開方式
- 【9.2】JSON 文件存儲
- 【9.2.1】對象和數組
- 【9.2.2】讀取 JSON
- 【9.2.3】寫入 JSON 文件
- 【9.3】CSV 文本存儲
- 【9.3.1】寫入
- 【9.3.2】讀取
用解析器解析出數據之后,還需要對數據進行保存。保存的形式多種多樣,最簡單的形式是直接保存為文本文件,如 TXT、JSON、CSV 等。
【9.1】TXT 文本存儲
TXT 文本存儲的優點:操作非常簡單,TXT 文本幾乎兼容任何平臺;缺點:不利于檢索。
【9.1.1】基本示例
import requests from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36', } url = "https://blog.csdn.net/qq_36759224"request = requests.get(url, headers=headers) tree = etree.HTML(request.text) title_list = tree.xpath('//h4/a/text()') for title in title_list:with open('blog.txt', 'a', encoding='utf8') as fp:fp.write(title)代碼實現了我的 CSDN 博客首頁所有博文標題的爬取,利用 requests 請求庫發送請求,獲取響應,用 XPath 獲取每一篇博文的標題,然后寫入 blog.txt 文件中:
帝都的凜冬最新屏蔽 CSDN 廣告方法,專注閱讀學習! 使用Github Pages和Hexo搭建自己的獨立博客【超級詳細的小白教程】 Python3 爬蟲學習筆記 C08【解析庫 Beautiful Soup】 Python3 爬蟲學習筆記 C07 【解析庫 lxml】 Python3 爬蟲學習筆記 C06 【正則表達式】 Python3 爬蟲學習筆記 C05 【Selenium + 無界面瀏覽器】 Python3 已經安裝相關庫,Pycharm 仍然報錯 ModuleNotFoundError: No module named 'xxxxxx' 的解決辦法 Windows/Android/iOS 等常見 User-Agent 大全 Selenium 顯式等待條件及其含義 Python3 爬蟲學習筆記 C04 【自動化測試工具 Selenium】 Python3 爬蟲學習筆記 C03 【Ajax 數據爬取】 Python3 爬蟲學習筆記 C02 【基本庫 requests 的使用】 Python3 爬蟲學習筆記 C01 【基本庫 urllib 的使用】 利用官方支持為基于GitHub Pages的Hexo博客啟用HTTPS 光學字符識別 Tesseract-OCR 的下載、安裝和基本用法 Github+jsDelivr+PicGo 打造穩定快速、高效免費圖床 利用Cloudflare為基于GitHub Pages的Hexo博客添加HTTPS支持 Python 中 if __name__ == '__main__': 的理解 Hexo 博客本地預覽報錯:Error: listen EADDRINUSE 0.0.0.0:4000 谷歌瀏覽器檢查更新時出錯:無法啟動更新檢查(錯誤代碼為 3: 0x80080005 -- system level)【9.1.2】打開方式
open() 方法的第二個參數為打開方式,不同的打開方式如下:
| r | 讀取 | 報錯 | 不可寫入 |
| rb | 以二進制方式讀取 | 報錯 | 不可寫入 |
| r+ | 讀取 + 寫入 | 報錯 | 覆蓋寫入 |
| rb+ | 以二進制方式讀取+寫入 | 報錯 | 覆蓋寫入 |
| w | 寫入 | 創建 | 覆蓋寫入 |
| wb | 以二進制方式寫入 | 創建 | 覆蓋寫入 |
| w+ | 讀取 + 寫入 | 創建 | 覆蓋寫入 |
| wb+ | 以二進制方式讀取+寫入 | 創建 | 覆蓋寫入 |
| a | 寫入 | 創建 | 附加寫入 |
| ab | 以二進制方式寫入 | 創建 | 附加寫入 |
| a+ | 讀取 + 寫入 | 創建 | 附加寫入 |
| ab+ | 以二進制方式讀取+寫入 | 創建 | 附加寫入 |
【9.2】JSON 文件存儲
JSON,全稱為 JavaScript Object Notation, 即 JavaScript 對象標記,它通過對象和數組的組合來表示數據,構造簡潔但是結構化程度非常高,是一種輕量級的數據交換格式。
【9.2.1】對象和數組
在 JavaScript 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數字、對象、數組等,但是對象和數組是比較特殊且常用的兩種類型
-
對象:它在 JavaScript 中是使用花括號 {} 包裹起來的內容,數據結構為 {key1:value1, key2:value2, …} 的鍵值對結構。在面向對象的語言中,key 為對象的屬性,value 為對應的值。鍵名可以使用整數和字符串來表示。值的類型可以是任意類型。
-
數組:數組在 JavaScript 中是方括號 [] 包裹起來的內容,數據結構為 [“java”, “javascript”, “vb”, …] 的索引結構。在 JavaScript 中,數組是一種比較特殊的數據類型,它也可以像對象那樣使用鍵值對,但還是索引用得多。同樣,值的類型可以是任意類型。
示例:一個 JSON 對象
[{"name": "TRH","gender": "male","birthday": "1999-01-25" }, {"name": "XXX","gender": "female","birthday": "1999-10-18" }]【9.2.2】讀取 JSON
Python 里面的 JSON 庫可以實現對 JSON 文件的讀寫操作,調用 JSON 庫的 loads 方法將 JSON 文本字符串轉為 JSON 對象、 dumps() 方法將 JSON 對象轉為文本字符串
import jsonstr = ''' [{"name": "TRH","gender": "male","birthday": "1999-01-25" }, {"name": "XXX","gender": "female","birthday": "1999-10-18" }] ''' data = json.loads(str) print(data) print(data[0]['name']) print(data[0].get('name')) print(data[0].get('age')) print(data[0].get('age', 25))使用 loads 方法將字符串轉為 JSON 對象,通過索引來獲取對應的內容,獲取鍵值時有兩種方式,一種是中括號加鍵名,另一種是通過 get 方法傳入鍵名。使用 get 方法,如果鍵名不存在,則不會報錯,會返回 None,get 方法還可以傳入第二個參數(即默認值),嘗試獲取一個原字典中不存在的鍵名,此時默認會返回 None。如果傳入第二個參數(即默認值),那么在不存在的情況下返回該默認值。
[{'name': 'TRH', 'gender': 'male', 'birthday': '1999-01-25'}, {'name': 'XXX', 'gender': 'female', 'birthday': '1999-10-18'}] TRH TRH None 25【9.2.3】寫入 JSON 文件
調用 dumps 方法可以將 JSON 對象轉化為字符串,然后再調用文件的 write 方法即可寫入文本
import jsondata = [{'name': 'TRH','gender': 'male','birthday': '1999-01-25' }] with open('data.json', 'w') as fp:fp.write(json.dumps(data))data.json 文件:
[{"name": "TRH", "gender": "male", "birthday": "1999-01-25"}]添加參數 indent(代表縮進字符個數),將會格式化輸出:
import jsondata = [{'name': 'TRH','gender': 'male','birthday': '1999-01-25' }] with open('data.json', 'w') as file:file.write(json.dumps(data, indent=2))輸出結果:
[{"name": "TRH","gender": "male","birthday": "1999-01-25"} ]如果 JSON 中包含中文字符,需要指定參數 ensure_ascii 為 False,另外還要規定文件輸出的編碼:
import jsondata = [{'name': '小明','gender': '男','birthday': '1999年01月25日' }] with open('data.json', 'w', encoding='utf-8') as file:file.write(json.dumps(data, indent=2, ensure_ascii=False))輸出結果:
[{"name": "小明","gender": "男","birthday": "1999年01月25日"} ]【9.3】CSV 文本存儲
CSV(Comma-Separated Values)是逗號分隔值或字符分隔值的文件格式,其文件以純文本的形式儲存表格數據(數字和文本),CSV 文件的行與行之間用換行符分隔,列與列之間用逗號分隔
【9.3.1】寫入
import csvwith open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id', 'name', 'age'])writer.writerow(['10001', 'TRHX', 20])writer.writerow(['10002', 'Bob', 22])writer.writerow(['10003', 'Jordan', 21])打開 data.csv 文件,調用 CSV 庫的 writer 方法初始化寫入對象,然后調用 writerow 方法傳入每行的數據即可完成寫入,用 Excel 打開 data.csv 文件將是表格形式
id,name,age10001,TRHX,2010002,Bob,2210003,Jordan,21默認每一行之間是有一行空格的,可以使用參數 newline 來去除空行:
import csvwith open('data.csv', 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id', 'name', 'age'])writer.writerow(['10001', 'TRHX', 20])writer.writerow(['10002', 'Bob', 22])writer.writerow(['10003', 'Jordan', 21])輸出結果:
id,name,age 10001,TRHX,20 10002,Bob,22 10003,Jordan,21列與列之間的分隔符是可以修改的,只需要傳入 delimiter 參數即可:
import csvwith open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile, delimiter=' ')writer.writerow(['id', 'name', 'age'])writer.writerow(['10001', 'TRHX', 20])writer.writerow(['10002', 'Bob', 22])writer.writerow(['10003', 'Jordan', 21])輸出結果:
id name age10001 TRHX 2010002 Bob 2210003 Jordan 21調用 writerows 方法也可以同時寫入多行,此時參數就需要為二維列表:
import csvwith open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile, delimiter=' ')writer.writerow(['id', 'name', 'age'])writer.writerows([['10001', 'TRHX', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])輸出結果仍與原來的一樣
此外 CSV 庫中也提供了字典的寫入方式:
import csvwith open('data.csv', 'w') as csvfile:fieldnames = ['id', 'name', 'age']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()writer.writerow({'id': '10001', 'name': 'TRHX', 'age': 20})writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})首先定義 3 個字段,用 fieldnames 表示,然后將其傳給 DictWriter 來初始化一個字典寫入對象,接著可以調用 writeheader 方法先寫入頭信息,然后再調用 writerow 方法傳入相應字典即可
id,name,age10001,TRHX,2010002,Bob,2210003,Jordan,21【9.3.2】讀取
有寫入方法,同樣也可以使用 csv 庫來讀取 CSV 文件:
import csvwith open('data.csv', 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)構造 Reader 對象,遍歷輸出每行的內容,每一行都是一個列表形式。(如果 CSV 文件中包含中文的話,還需要指定文件編碼)讀取結果:
['id', 'name', 'age'] ['10001', 'TRHX', '20'] ['10002', 'Bob', '22'] ['10003', 'Jordan', '21']此外,還可以利用 pandas 的 read_csv 方法將數據從 CSV 中讀取出來(pandas 是基于NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具)
import pandas as pddf = pd.read_csv('data.csv') print(df)讀取結果:
id name age 0 10001 TRHX 20 1 10002 Bob 22 2 10003 Jordan 21總結
以上是生活随笔為你收集整理的Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真的不建议手机电量耗尽再充电:锂电池随用
- 下一篇: 【Python CheckiO 题解】A