iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Python

Python大戰之網頁爬蟲系列 第 23

[Day 23] 爬蟲實戰 - ptt之NBA版 - 資料彙整

  • 分享至 

  • xImage
  •  

接續昨天的內容,我們剛剛所要蒐集的三個資料:「文章標題」、「文章人氣」、
以及「發文日期」都抓取出來了,那現在就要把他們轉換成易於閱讀的檔案。

相對於之前我們做過的將檔案轉成csv格式,並儲存在EXCEL內,
我這次會嘗試另外一個方法,也就是將檔案存成「JSON格式」,來看看會有什麼不同。

JSON:

JSON ( JavaScript Object Notation ) 是一種使用結構化資料
呈現 JavaScript 物件的標準格式,同時也是一個相當普及的輕量級資料交換格式
( JSON 本質其實只是純文字格式 ),
幾乎所有與網路開發相關的語言都有處理 JSON 的函式庫。

(資料來源:
https://steam.oxxostudio.tw/category/python/library/json.html)

那知道什麼是JSON後,我們就直接來看新增的程式碼吧:
https://ithelp.ithome.com.tw/upload/images/20241006/20169196nykO2d5vjP.png
(新增的程式碼都有用箭頭標示出來)

那這邊就針對新增的程式碼做一些講解:
(有一些是重複的格式,我就會挑其中的一個出來講而已)

import json

這邊就是在Python內引入 json這個模塊。
這是 Python 內建的用來處理 JSON 資料的模塊。
因為上面有解釋過了,這邊就點到為止。

data_list = []

這行則是定義了一個空的列表 data_list。
這個列表將會用來存儲所有從網頁中提取的文章數據。
在最後每篇文章的數據都將以字典的形式存儲在這個列表中。

data = {}

在爬取每篇文章的數據時,我們需要定義一個空字典 data。
這個字典要用來存儲每篇文章的具體信息,比如標題、人氣和日期。這
樣才可以為每篇文章建立一個結構化的數據條目。

data["標題"] = title

這邊就是我們在上面說到的「具體訊息」。在提取到標題後,
我們就可以將它存儲在 data 字典中。

在這個範例裡面,鍵是 "標題",而值則是文章的標題 title。

data_list.append(data)

在每次從網頁中成功提取一篇文章的標題、人氣和日期後,
就會把這些信息組合成的 data 字典添加到 data_list 列表中。

而append在這邊的意思就是「新增」、「追加」的意思。

with open("data.json", "w", encoding="utf-8") as file:

這裡就跟我們之前的撰寫差不多,設置開啟的模式以及編碼,僅此而已。

*json.dump(data_list, file, ensure_ascii=False, indent=4)

這行代碼將實際數據寫入 JSON 文件,
那裏面有幾行比較沒看過的,這邊挑出來看一下:

ensure_ascii=False

這個選項確保中文字符會正確地寫入文件,而不會被轉換成 ASCII 編碼的字符。
這樣可以讓我們人類比較好閱讀(畢竟是給人看不是給機器看)

這樣講可能還是有點模糊,我們看個範例:

https://ithelp.ithome.com.tw/upload/images/20241006/20169196a2VQpe0Pff.png

ensure_ascii=False時,我們就可以確保中文的呈現是「中文」,
而不是變成我們看不懂的ACSII編碼。

indent=4

這個選項使 JSON 文件更加易讀,每個層級縮進 4 個空格,使數據有結構化的格式。
換句話說,其實就是「縮排」的概念,讓文件變得更容易閱讀。


那在看完並理解完新增的程式碼後,我們就來看看它執行的結果如何:
https://ithelp.ithome.com.tw/upload/images/20241006/20169196XhbLpRlKvE.png

可以看到在左邊新增了一個JSON檔案,那我們就把它點開來看看:
https://ithelp.ithome.com.tw/upload/images/20241006/20169196psIQxPZuqK.png

裡面就是我們排版完的資料了,是不是美觀很多了!!!


上一篇
[Day 22] 爬蟲實戰 - ptt之NBA版
下一篇
[Day 24] Ajax爬蟲
系列文
Python大戰之網頁爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言