各位早阿,今天就接續昨天的部分,繼續抓取留言和匯出成json檔吧!
觀察一下PTT的留言區,可以看到留言分成三種,分別是"推"、"噓"和"→",每則留言都有標籤、作者、內容和時間這些資訊,接下來就是要取得這些資訊並依照標籤分類。
隨便對一則留言右鍵>>檢查,發現留言是在class="push"
的<div>
內,資訊則分別在class="push-tag"、"push-userid"、"push-content"、"push-ipdatetime"
中。
因此程式碼就很單純:
# 抓出所有留言
comments = main_content.find_all("div", class_="push")
for comment in comments:
push_tag = comment.find(
"span", class_="push-tag").string # 分類標籤
push_userid = comment.find(
"span", class_="push-userid").string # 使用者ID
push_content = comment.find(
"span", class_="push-content").string # 留言內容
push_time = comment.find(
"span", class_="push-ipdatetime").string # 留言時間
為了分類,我建立三個list,分別存放"推"、"→"、"噓"三種標籤。
push_dic = []
arrow_dic = []
shu_dic = []
再來就用字典型式將所有資料塞好塞滿,然後再依照標籤分類就好囉~
dict1 = {"push_userid": push_userid, "push_content": push_content, "push_time": push_time}
if push_tag == "推 ":
push_dic.append(dict1)
if push_tag == "→ ":
arrow_dic.append(dict1)
if push_tag == "噓 ":
shu_dic.append(dict1)
現在雖然可以抓下文章清單中的資料了,但只有第一頁的文章而已,要怎麼樣才能抓其他頁的文章呢??
想一下,我們想要看上一頁時,會做什麼事?
廢話! 當然就是按 "上頁" 按鈕阿!
對上方導覽列的 "上頁" 按鈕右鍵>>檢查,上一頁的連結就在string="‹ 上頁"
的<a>
中。
更新url變數,然後用for迴圈想抓幾頁就抓幾頁!
url = "https://www.ptt.cc/"+soup.find("a", string="‹ 上頁")["href"]
目前都只是將抓到的資料印在terminal上,如果之後要用到這些資料做後續分析的話,就很不方便了,所以我們要將資料轉成json格式並存在電腦中。
json畢竟是第一次提到,還是來介紹一下什麼是json。
JSON(JavaScript Object Notation)是由道格拉斯·克羅克福特構想和設計的一種輕量級資料交換格式。其內容由屬性和值所組成,因此也有易於閱讀和處理的優勢。
JSON是獨立於程式語言的資料格式,其不僅是JavaScript的子集,也採用了C語言家族的習慣用法,目前也有許多程式語言都能夠將其解析和字串化,其廣泛使用的程度也使其成為通用的資料格式。-- 維基百科
另外,python和json格式上有很高的對應關係。底下是兩者各自對應到的物件。
所以,我們要做的前置作業就是把資料整理好,以利將其轉成json檔。剛才也看到了python和json格式上的對應關係,這裡只要將資料整理成由list和dictionary所組成的複合型態就好了。
json資料的架構:
程式碼:
data = [] # 全部文章的資料
article_data = {} # 單篇文章的資料
comment_dic = {} # 所有留言
article_data["author"] = author
article_data["title"] = title
article_data["time"] = time
article_data["content"] = content
comment_dic["推"] = push_dic
comment_dic["→"] = arrow_dic
comment_dic["噓"] = shu_dic
article_data["comment"] = comment_dic
data.append(article_data)
更佛心的是,Python內建有json套件,利用dump()
這個函數就能將其轉成json格式並匯出囉!
# 輸出JSON檔案
with open('data.json', 'w', encoding='utf-8') as file:
json.dump(data, file)
執行後,在同個目錄下就會出現data.json
這個檔案,用記事本打開後如果有東西那就是成功了。
不過看到的應該是一大串編碼,沒辦法知道資料是不是對的,這邊偷偷告訴你一個好康的,到 json editor 這個網站,幫你將json資料轉為樹狀顯示,就可以很方便的確認資料是否正確~
點 "Open from disk" 就可以匯入剛才的json檔囉。
完整程式碼請到GitHub上面看~ (不想貼出來佔空間了)
PTT八卦板爬蟲就教到這邊,希望大家看完後對爬蟲都已經有一些基礎的認知了,明天起就會搭配專題介紹比較進階的爬蟲技巧,讓你體會到爬蟲真正的強大之處,我認為應該是比較有趣的部分,大家敬請期待~
如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~
本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~