【0基礎學爬蟲】爬蟲基礎之檔案儲存

K哥爬蟲發表於2023-04-07
大資料時代,各行各業對資料採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為檔案儲存。

概述

前幾期文章中我們已經瞭解到了請求庫、解析庫的使用,已經學會瞭如何向目標網站傳送請求以及解析響應資訊,那麼我們還需要知道如何將資料進行儲存。資料儲存有很多方式,本期會介紹如何將資料存入文字檔案,如 TXT、JSON、CSV 等。

TXT 檔案儲存

介紹

TXT檔案儲存是最基本的資料儲存方式,TXT 文字檔案基本上相容任何平臺,因此它的應用也非常廣泛。使用程式碼操作 TXT 檔案十分簡單,但是缺點也非常明顯,不利於對資料進行檢索。

使用

Python 中操作 TXT 檔案需要使用到內建的 open() 函式。

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

open() 函式有七個引數分別為:

file:檔案路徑

mode:開啟方式,預設為(r)只讀模式

buffering:檔案緩衝

encoding:字元編碼

errors:報錯級別

newline:換行模式,預設以\n換行

closefd:控制在關閉檔案時是否徹底關閉檔案

檔案開啟方式分為以下幾種:

r:以只讀方式開啟檔案

w:以寫入方式開啟檔案。如果檔案存在則覆蓋原檔案,不存在則新建。

x:建立新檔案並以寫入方式開啟檔案

a:以追加方式開啟檔案。如果檔案存在,則在結尾位置寫入,不存在則新建。

b:二進位制模式

t:文字模式

+:讀取與寫入

wb:以二進位制寫入方式開啟檔案。如果檔案存在則覆蓋原檔案,不存在則新建。

w+:以讀寫方式開啟檔案。如果檔案存在則覆蓋原檔案,不存在則新建。

wb+:以二進位制讀寫方式開啟檔案。如果檔案存在則覆蓋原檔案,不存在則新建。

ab:以二進位制追加方式開啟檔案。如果檔案存在,則在結尾位置寫入,不存在則新建。

ab+:以二進位制追加讀寫方式開啟檔案。如果檔案存在,則在結尾位置寫入,不存在則新建。

f = open('data.txt','r',encoding="utf-8")
f.seek(2) #從指定下標位置開始讀取
data = f.read()
f.close()
f = open('data.txt','w',encoding="utf-8")
f.write('hello')
f.write(' ')
f.write('world')
f.close()
#hello world

上下文管理器

上文中可以看到,對一個檔案進行讀寫操作後需要使用 close() 方法關閉檔案。如果不使用 close() 關閉檔案會導致資源洩露問題。為了避免這個問題和最佳化程式碼,我們可以使用上下文管理器來操作檔案。

with open('data.txt','w',encoding='uutf-8')as f:
    f.write('hello')
    f.write(' ')
    f.write('world')

當 with 語句塊結束後檔案會自動關閉,這樣不需要再呼叫 close() 方法。

JSON 檔案儲存

介紹

JSON 全稱為 JavaScript Object Notation,也就是 JavaScript 物件標記,是一種輕量級的資料交換格式。人們可以很容易的對 JSON 格式的資料進行閱讀和編寫,同時也方便了機器進行解析和生成。JSON 採用完全獨立於程式語言的文字格式,但是也使用了類 C 語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使 JSON 成為理想的資料交換語言。

JSON 透過物件和陣列的組合來表示資料,而在 JavaScript 中,一切皆為物件,因此任何資料型別都可以透過 JSON 來表示。

在 JavaScript 中 JSON 通常以物件或陣列的形式存在。物件形式為被花括號包裹的鍵值對結構,如 { key1 : value1, key2 : value2 },key表示物件的屬性,value表示物件的值。陣列形式與物件形式的區別就在於它是被方括號所包裹,如[{ key1 : value1}, {key2 : value2}]。物件形式與陣列形式可以自由組合,任意巢狀。JSON中字串型別的資料需要以雙引號包圍。

JSON 的這種結構非常簡潔清晰,且結構化程度很高,因而被廣泛使用。

使用

JSON 是一個資料格式,本質上是純字串型別,在 Python 中它可以被轉換為對應的資料型別,如物件形式可以被轉換為字典,陣列型別可以轉換為列表。Python 中內建了一個強大的 JSON 庫,透過它可以簡便的實現 JSON 檔案的讀寫操作。

JSON 庫提高了四個方法:

json.dump():將 JSON 物件寫入檔案

json.dumps():將Python物件編碼成 JSON 字串

json.load():從 JSON 檔案中讀取資料

json.loads():將已編碼的 JSON 字串解碼為Python物件

下面我們以這段資料作為示例:

{
  "1001": {
    "name": "張三",
    "age": 21,
    "gender": "female"
  },
  "1002": {
    "name": "李四",
    "age": 22,
    "gender": "male"
  }
}

讀取資料

data.json 檔案內容為示例 JSON 資料。

with open('data.json','r',encoding='utf-8')as f:
    data = f.read()
    
print(type(data))
#輸出:<class 'str'>

可以看到,我們直接從 JSON 檔案裡面讀取的資料是字串型別,這不利於我們對它進行操作,我們可以使用 json.loads() 方法將 JSON 字串轉換為字典型別。

import json

with open('data.json','r',encoding='utf-8')as f:
    data = f.read()
    
print(type(data))
data = json.loads(data)
print(type(data))
#輸出:
#<class 'str'>
#<class 'dict'>

我們也可以使用更加簡潔的寫法,透過 json.load() ,直接對檔案操作物件進行解析。

import json

data = json.load(open('data.json',encoding='utf-8'))

print(type(data))
#輸出:<class 'dict'>

寫入資料

使用 write() 方法寫入檔案時,它只能傳入字串型別的資料。因此我們需要將字典資料先轉換為 JSON 字串,可以透過 json.dumps() 方法實現。

import json

data = {
  "1001": {
    "name": "張三",
    "age": 21,
    "gender": "female"
  },
  "1002": {
    "name": "李四",
    "age": 22,
    "gender": "male"
  }
}

print(data)
data = json.dumps(data)
print(type(data))
with open('data.json','w',encoding="utf-8")as f:
    f.write(data)
#輸出:
#<class 'dict'>
#<class 'str'>

當然,將資料寫入檔案也有更加簡便的方法。

import json

data = {
  "1001": {
    "name": "張三",
    "age": 21,
    "gender": "female"
  },
  "1002": {
    "name": "李四",
    "age": 22,
    "gender": "male"
  }
}

json.dump(data,open('data.json','w',encoding='utf-8'),indent=2,ensure_ascii=False)

CSV 檔案儲存

介紹

CSV 全稱 Comma-Sparated Values(逗號分隔值),它以純文字形式儲存資料表格。CSV 檔案是一個字元序列,它由任意數目的記錄組成,記錄之間以某種換行符分隔。檔案的每條記錄由欄位和欄位值組成,欄位間的分隔符是其它字元或字串,最常見的是逗號或製表符。CSV 並不是一種單一的、明確定義的文字格式,它泛指具備以下特徵的任何檔案:

  1. 純文字呢,使用某個字符集
  2. 由記錄組成
  3. 每條記錄被分隔符分隔為欄位
  4. 每條記錄都有相同的欄位序列

使用

Python 中提供了一個內建的 csv 庫來對 CSV 檔案進行操作。

寫入

import csv

#writerow預設換行,因此需要透過 newline 將換行符設定為空,避免重複換行
with open('data.csv','w',encoding='utf-8',newline="") as csvfile:
    #delimiter:指定分隔符,預設為逗號
    writer = csv.writer(csvfile,delimiter = " ")
    #寫入一行
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['1001', 'jack', 15])
    writer.writerow(['1002', 'marin', 22])
    writer.writerow(['1003', 'alex', 19])
    #寫入多行
    writer.writerows([['1004', 'lucy', 23],['1005', 'john', 30]])

csv庫也提供了其它的寫入方法

import csv

with open('data.csv','w',encoding='utf-8',newline="") as csvfile:
    #字典寫入物件
    writer = csv.DictWriter(csvfile,fieldnames=['id','name','age'])
    writer.writeheader()
    writer.writerow({'id':'1001','name':'jack','age':21})
    writer.writerow({'id': '1002', 'name': 'marin', 'age': 22})
    writer.writerows([{'id': '1003', 'name': 'lucy', 'age': 23},{'id': '1004', 'name': 'mike', 'age': 22}])

讀取

import csv

with open('data.csv','r',encoding='utf-8')as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

總結

上文中講到了 TXT、JSON、CSV 三種檔案的儲存方式,介紹瞭如何對這些檔案進行讀寫操作。文字檔案儲存的優勢在於簡單、方便,適合儲存少量資訊,但想要規範的儲存資料的話並不推薦使用文字檔案儲存。

相關文章