前面說過Python爬取的資料可以存儲到檔案、關系型資料庫、非關系型資料庫。前面兩篇文章沒看的,可快速戳這裡檢視!《使用Python将資料存入SQLite3資料庫》
《基于Python的SQLite基礎知識學習》而存儲到檔案的資料一般都具有時效性,例如股市行情、商品資訊和排行榜資訊等等。這樣的資訊是具有動态性的,非特殊要求,可以存放到檔案中,下面讓我們來看一下存入檔案的幾種方法,文章有點長,但全是幹貨,請耐心看完。
Txt檔案存儲
将資料儲存到TXT檔案很簡單,使用如下文法即可打開一個檔案寫入資料。
with open('test.txt','w',encoding='utf-8') as file:
file.write()
這裡來看一個例子:爬取知乎上“發現”頁面的熱門話題部分,将問題和答案統一儲存為txt格式。
import requests
#使用requests庫将網頁源碼擷取下來
from pyquery import PyQuery as pq
#使用pyquery解析庫解析
url = 'http://www.zhihu.com/explore'
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Mobile Safari/537.36'
}
html = requests.get(url,headers = headers).text
doc = pq(html)
items = doc('.explore-tab .feed-item').items()
for item in items:
question = item.find('h2').text()
author = item.find('.author-link-line').text()
answer = pq(item.find('.content').html()).text()
with open('test.txt','w',encoding='utf-8') as file:
file.write('\n'.join([question,author,answer]))
file.write('\n' + '=' * 50 + '\n')

如下圖所示,可以看到這篇文章已經寫入文本檔案了。
JSON檔案存儲
JSON(javaScript Object Notation,也就是JavaScript對象标記)
JSON是通過數組和對象的組合來表示資料,構造簡潔但結構化程度非常高,是一種輕量級的資料交換格式。Python為我們提供了簡單易用的 JSON庫來實作JSON檔案的讀寫操作,我們可以調用 JSON loads()方法将JSON文本字元串轉為JSON對象,可以通過 dumps()方法将 JSON 對象轉為文本字元串,具體看下面代碼。
import json
str = '''[{
"name":"Bob",
"gender":"male",
"birthay":"1992-10-18"
} , {
"name":"Selina",
"gender":"female",
"birthdat":"1995-10-18"
}]'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
另外我們可以使用dumps()方法将JSON對象轉化為字元串,如下圖所示。
import json
data = [{
'name':'Bob',
'gende':'male',
'birthday':'1992-10-18'
}]
with open ('data.json','w') as file:
#如果想儲存為JSON格式的,可以在加一個參數indent=2即可。
file.write(json.dumps(data))
#加參數後的data.json檔案内容如下
'''
[
{
"name": "Bob",
"gende": "male",
"birthday": "1992-10-18"
}
]
'''
還有一種常見的問題,若JSON檔案包含中文字元呢?這樣打開肯定會出現亂碼的,那麼我們該怎麼辦呢?看下面代碼。
import json
data = [{
'name':'小馬',
'gende':'女',
'birthday':'1994-12-30'
}]
with open ('data.json','w') as file:
file.write(json.dumps(data,indent=2))
看到這樣的内容,肯定不是我們想要的結果啊,中文字元都變成了Unicode字元,那麼,為了顯示中文字元,還需要指定參數ensure_asci為 False,另外還需要規定輸出檔案的編碼。這樣就可以完美的将中文顯示出來了,如下圖所示。
with open('data.json','w',encoding='utf-8') as file:
file.write(json.dumps(data,indent=2,ensure_ascii=False))
CSV檔案存儲
CSV(Comma-Separated Values),中文可成為逗号分隔值或字元分隔值,其檔案以純文字形式存儲表格資料。
Python标準庫自帶CSV子產品,不用自行安裝,直接導入即可,代碼如下。
import csv
#這裡如若檔案存在則直接打開,不存在可自動建立,若不設定newline = ''每行資料會隔一行空白行
with open('csv_test.csv','w',newline = '') as csvfile:
#将檔案加載到CSV對象中
write = csv.writer(csvfile)
#寫入一行表頭資料
write.writerow(['姓名','年齡','電話'])
#多行資料寫入
data = {('zhangsan','15','13809391234'),('lisi','25','13512340000')}
#關閉CSV對象
write.writerows(data)
寫資料到CSV使用open函數便可打開檔案,那麼讀CSV資料則使用reader和DictReader,兩者都是接收一個可疊代的對象,傳回一個生成器。reader函數傳回是将一行資料以清單形式傳回,而DictReader函數傳回的是一個字典,字典的值是單元格的值,字典的鍵則是這個單元格的标題,具體可看如下代碼。
import csv
csvfile = open ('csv_test.csv','r')
#以清單形式輸出
reader = csv.reader(csvfile)
#以字典形式輸出,第一行作為字典的鍵
#reader1 = csv.DictReader(csvfile)
rows = [row for in reader]
print(rows)
#以下為輸出結果
#[['姓名', '年齡', '電話'], ['zhangsan', '15', '13809391234'], ['lisi', '25', '13512340000']]
#以字典的形式輸出,第一行作為字典的鍵
import csv
csvfile = open('csv_test.csv','r')
reader = csv.DictReader(csvfile)
for row in reader:
print(row)
#以下為輸出結果
#OrderedDict([('姓名', 'zhangsan'), ('年齡', '15'), ('電話', '13809391234')])
#OrderedDict([('姓名', 'lisi'), ('年齡', '25'), ('電話', '13512340000')])
以上代碼實作了将整個檔案資料全部列印出來了,在實際資料中這也不太現實,我們可能會擷取某行的資料,則可以使用循環全部資料再對每行資料進行判斷,符合條件的資料篩選出來,具體代碼如下。
import csv
csvfile = open('csv_test.csv','r')
#以清單形式輸出
reader = csv.reader(csvfile)
for row in reader:
if 'lisi' in row:
print(row)
#以下是輸出結果
#['lisi', '25', '13512340000']
如果你接觸過pandas的話,使用起來也很友善
>>> import pandas as pd
>>> df = pd.read_csv('csv_test.csv',encoding ='gb2312')
>>> print(df)
姓名 年齡 電話
0 zhangsan 15 13809391234
1 lisi 25 13512340000
>>>
值得注意的是這裡可能會出現亂碼,需要指定字元編碼,csv檔案的編碼為gb2312或utf-8時,指定編碼格式pd.read_csv(name, encoding='gb2312')可解決亂碼問題;如果編碼格式為utf-8,則另存為txt檔案,pd.read_table(name) 不用指定編碼格式,也可以解決亂碼問題。
使用CSV存儲資料相對而言還是簡單的,這個也是經常使用的方式,實用性很強,小夥伴要掌握哦,下面順道說一下EXCEL格式資料的讀寫。
Excel檔案存儲
python操作Excel時,對應的有不同的版本支援庫,若Excel為2003時,需選擇pyExcelerator;若Excel為2007時,需選擇openpyxl;而xlrd庫支援所有版本的資料讀取,xlwt庫支援所有版本的資料寫入。
是以,考慮到相容性一般都選擇使用 xlrd和xlwt,Windows環境CMD下直接使用pip安裝即可。
pip3 install xlrd
pip3 install xlwt
将資料寫入到Excel是比較複雜的,有格式以及公式、插入圖檔等的功能,下面直接看寫入Excel的文法。
import xlwt
#建立一個Excel檔案
wb = xlwt.Workbook()
#在建立的檔案中建立一個名為Python的工作簿
ws = wb.add_sheet(‘Python’,cell_overwrite_ok=True)
#定義字型對齊方式對象
alignment = xlwt.Alignment()
#設定水準方向
#HORZ_GENERAL,HORZ_LEFT,HORZ_CENTER,HORZ_RIGHT,HORZ_FILLED
#HORZ_JUSTIFIED,HORZ_CENTER_ACROSS_SEL,HORZ_DISTRIBUTED
alignment.horz = xlwt.Alignment.HORZ_CENTER
#設定垂直方向
#VERT_TOP,VERT_CENTER,VERT_BOTTOM,VERT_JUSTIFIED,VERT_DISTRIBUTED
alignment.vert = xlwt.Alignment.VERT_CENTER
#定義格式對象
style = xlwt.XFStyle()
style.alignment = alignment
#合并單元格write_merge(開始行,結束行,開始列,結束列,内容,格式)
ws.write_merge(0,0,0,5,'Python資料存儲',style)
#寫入資料we.write(行,列,内容)
for i in range(2,7):
for k in range(5):
ws.write(i,k,i+k)
#Excel公式xlwt.Formula
ws.write(i,5,xlwt.Formula('SUM(A'+srt(i+1)+ ':E'+str(i+1)+')'))
#wb.save('file.xls')
#插入bmp格式圖檔,insert_bitmap(img,x,y,x1,y1,scale_x=0.8,scale_y=1)
#x表示行數,y表示列數,x1表示相對原來位置向下偏移的像素,y1表示相對原來位置像右偏移的像素,scale_x、scale_y表示縮放比例
ws.insert_bitmap('G:\\img.bmp',9,1,2,2,scale_x=0.3,scale_y=0.3)
#儲存檔案
wb.save('file.xls')
Excel中還有其他的單元格顔色,單元格邊框,字型顔色,字型大小,資料類型等等,這裡就不展開描述了,下面來看看Excel讀取資料。
讀取資料需要第三方庫 xlrd 來實作,具體代碼如下。
import xlrd
wb = xlrd.open_workbook('file.xls')
#擷取工作簿的zongshu
ws_count = wb.nsheets
print('Sheets總數:',ws_count)
#通過索引順序擷取Sheets
#ws = wb.sheets() [0]
#ws = wb.sheet_by_index(0)
#通過Sheets名擷取Sheets
ws = wb.sheet_by_name('Python')
#擷取整行的值,以清單形式傳回
row_value = ws.row_values(3)
print('第四行資料為:',row_value)
#擷取整列的值,以清單形式傳回
row_col = ws.col_values(3)
print('D列的資料為:',row_col)
#擷取所有的lie
nrows = ws.nrows
ncols = ws.ncols
print('總行數為:',nrows,'總列數為:',ncols)
#擷取某個單元格内容cell(行,列)
cell_F3 = ws.cell(2,5).value
print('F3單元格内容為:',cell_F3)
#使用行列索引擷取某個單元格的内容
row_F3 = ws.row(2)[5].value
col_F3 = ws.col(5)[2].value
print('F3單元格的内容為:',row_F3, '\n' 'F3單元格的内容為:',col_F3)
看到這裡,順便在說一下怎麼把資料存儲到Word中,Word文檔中存儲的一般為文章、新聞報道和小說這類文字内容較長的資料。
Word資料存儲
Python讀取Word也是需要第三方擴充庫來支援,使用pip install python-docx安裝即可。
下面通過例子說明怎麼使用Python讀取資料吧,廢話不多說,直接看代碼。
from docx import Document
from docx.shared import Inches
#建立對象
document = Document()
#添加标題,其中'0'代表标題類型,一共有4種類型,具體可在Word的開始菜單,樣式下檢視
document.add_heading('Python爬蟲基礎學習',0)
#添加正文内容并設定部分内容格式
p = document.add_paragraph('Python爬蟲-')
#設定内容加粗
p.runs[0].bold = True
#添加内容并加粗
p.add_run('資料存儲-').bold = True
#添加内容
p.add_run('Word-')
#添加内容并設定為斜體
p.add_run('存儲執行個體。').italic = True
#添加正文,設定“樣式”——> "明顯引用"
document.add_paragraph(“樣式-明顯引用”,style = 'IntenseQuote')
#添加正文,設定“項目符号”
document.add_paragraph(
'項目符号1',style = 'ListBullet'
)
document.add_paragraph(
'項目符号2',style = 'ListNumber'
)
#添加圖檔
document.add_picture('G:\\img.bmp',width = Inches(1.25))
#添加表格
table = document.add_table(rows = 1, cols = 3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in range(2):
row_cells = table.add_row().cells
row_cells[0].text = 'a'
row_cells[1].text = 'b'
row_cells[2].text = 'c'
#儲存檔案
document.add_page_break()
document.save('test.docx')
通過以上代碼便将資料寫入到Word,最終結果如下圖所示。
最後在看一眼怎麼讀取Words檔案資料,這個就相對比較簡單了,不用設定格式,直接讀取即可,代碼如下所示。
#讀取資料
import docx
def readDocx(docName):
fullText = []
doc = docx.Document(docName)
#讀取全部内容
paras = doc.paragraphs
#将每行資料存儲到清單
for p in paras:
fullText.append(p.text)
#将清單資料轉換成字元串
return '\n'.join(fullText)
print(readDocx('test.docx'))
通過上圖看出,Word中的圖檔以及表格使用此方法是沒法讀取的,還是不盡如人意啊!
那麼本周分享就到這裡了,内容有點多,慢慢消化哦,下次分享怎麼将資料存儲到MySQL資料庫,小夥伴們準備好小闆凳繼續加油哦!!!
參考資料:黃永祥.清華大學出版社《玩轉Python網絡爬蟲》第九章.文檔資料存儲