Python ptt 3C 版爬蟲|文字雲專案實戰分享

沒想到有一天居然也能寫這個主題,近期在閒暇時間利用 python 寫了一個爬取 ptt 留言並將其轉化成文字雲的專,成品如下圖。在這篇文章中我會分享我是如何進行資料爬取,以及利用 jieba + wordcloud 產出文字雲圖片,由於是第一次寫這類分享,請大家不吝給予回饋~

實際產出圖片

這部份是我在實習期間突發奇想,想利用空暇時間針對網路上對於我們部門新產品的評價做分析,並將其視覺化呈現,於是決定用文字雲作為目標,開始了我這次的小專案。

在視覺化之前,我們是比得先從網路上爬取想要的資料,我這次挑選的是在 ptt 3C 版上,一篇關於 ZenFone 9 的文章,而我要爬取的則是這篇貼文底下的留言。

貼文網址: https://www.ptt.cc/bbs/MobileComm/M.1659445482.A.0AB.html

在最一開始的爬蟲部份,相信大家都能夠在網路上找到許多輔助的資料,爬取 ptt 上的內容也一直是爬蟲入門的必修的第一項專案,我也不遑多讓。這邊就簡單說明一下最初的一些程式碼:

一、利用 import 導入 requests 和 BeautifulSoup 模組

這兩個可說是爬蟲必備的兩個套件,requests 函式庫 ( 模組 ) 是相當流行的 Python 外部函式庫,具備了 GET、POST…等各種 request 用法,透過 requests 能夠輕鬆抓取網頁的資料;BeautifulSoup 則是一個用來解析 HTML 結構的 Python 套件(Package),將取回的網頁 HTML 結構,透過其提供的方法(Method),能夠輕鬆的搜尋及擷取網頁上所需的資料,因此廣泛的應用在網頁爬蟲的開發上。這個部份我不多贅述,有興趣的朋友可以參考下方兩篇文章以及我的程式碼。

import re
import requests
from bs4 import BeautifulSoup

【延伸閱讀】Requests 函式庫

【延伸閱讀】[Python爬蟲教學]7個Python使用BeautifulSoup開發網頁爬蟲的實用技巧

二、抓取網址並利用 Beautiful 來對檔案格式進行分析

第二步便是先用 requests 的 get 語法抓取我們要爬的文章網址,利用 get(url) 來進行運作。接者使用 BeautifulSoup 來解析網頁。

url='https://www.ptt.cc/bbs/MobileComm/M.1659445482.A.0AB.html'
response=requests.get(url)

使用 BeautifulSoup 的語法如下:

bs 物件 = BeautifulSoup(原始碼, 解析器)

因此我前半段的程式碼會長這樣:

import re
import requests
from bs4 import BeautifulSoup as bs
url='https://www.ptt.cc/bbs/MobileComm/M.1659445482.A.0AB.html'
response=requests.get(url)

soup=bs(response.text,'html.parser')#將網頁格式檔案丟入bs4分析

而我的程式碼到現階段長這樣,是因為我在最開始導入的時候就先將其縮寫成 bs,所以只需以縮寫呈現即可,大家在寫的時候也可以留意一下是否在命名上有所調整。

三、選擇要爬取的部分

第三步就會進入到爬取這次專案所需要的內容,由於這次我們要爬取的是留言,所以要先利用網頁的「檢查」模式確認留言的 HTML 結構(可以利用快捷鍵 Ctrl+Shift+I 或按滑鼠右鍵選取檢查網頁)

如同右邊顯示

這時候會出現一個類似看板的畫面,我們可以利用滑鼠的移動來知道每個部份所代表的 HTML 語法為何。關於 HTML,他可以說是前端網頁和爬蟲的基礎,其實嚴格來說並不算程式語言,大家有興趣的話可以看這篇文章,裡面有蠻完整的 HTML 介紹與解析,對理解網頁架構也相當有幫助!

回到正題,在檢查完 ptt 網頁後,我發現留言是被歸類在 class=push 的 <div> 內,因此我的程式碼就會利用剛剛解析完的網頁,搭配上 find_all 語法來爬取這篇貼文底下的所有留言,而這項結果我用 comments 來做命名。

comments=soup.find_all('div','push')

四、建立一個留言的 list,並利用 find 語法爬取留言

在確認完留言的 HTML 後,我就開始進行爬蟲的動作,利用 for 迴圈搭配 find 語法,把留言的內容,aka ‘push-content’ 的部分爬取下來,再利用 append 填滿剛剛建立的 list 就完成啦!到這步時你可以試著用 print 語法來看看你的 result 是否有順利爬取到內容~

push-content 正是留言的文字

五、將爬取到的內容寫入 txt 文字檔

由於製作文字雲需要以文字檔的方式來製作,因此我在這步先將爬取到的內容用 f.write 和 open 開新檔案的方式來將這次的爬取結果寫入 test.txt 這個檔案裡(名字可以自己訂),相關的語法說明可以參考這篇文章,我這次也是依樣畫葫蘆~

三、四、五步程式碼如下:

soup=bs(response.text,'html.parser')#將網頁格式檔案丟入bs4分析
comments=soup.find_all('div','push')


result=[]
for comment in comments:
messages=comment.find('span', class_='push-content').text
result.append(messages)

f = open('test.txt', 'w', encoding='UTF-8')
f.write("".join([str() for in result]) + '\n')
f.close()

六、導入 jieba 與 wordcloud 套件

在整理完我的留言之後,進入到最關鍵的一個部分,如何將這些內容轉化成文字雲?我在網路上找到的資料,大多數人都選擇用 jieba 這個套件搭配 wordcloud 來幫其完成。

簡單來說,結巴(Jieba)是目前其中一個 python 的中文分詞模組,用來解析中文的斷句(畢竟我這次爬的是中文文章);而 wordcloud 正如同他的名稱,是文字雲的視覺化呈現方式。這部份的邏輯就是先用 jieba 針對文字檔的內容作解析,再用 wordcloud 將其視覺化成文字雲圖片。詳細內容可參考這篇文章,我其實到現在都還沒有很熟悉這兩個套件的語法,但其實大架構基本不變,只需要在別人的程式碼上做調整與更動即可~(再次證明寫 code 真的要很會依樣畫葫蘆)

我的程式碼:

jieba.set_dictionary('dict.txt.big.txt')
jieba.del_word('的')
wordlist = jieba.cut(text)
words = " ".join(wordlist)
print(words)

font_path = 'SNsanafonMugiV260.ttf' # 設定字體格式

如果檔案內有一些編碼錯誤,使用 errors=’ignore’ 來忽略錯誤

with open("test.txt", encoding="utf-8", errors='ignore') as f:
text = f.read()

背景顏色預設黑色,改為白色、使用指定字體

wc = WordCloud(background_color='white',
margin=2, # 文字間距
font_path=font_path, # 設定字體
max_words=200, # 取多少文字在裡面
width=1080, height=720, # 長寬解析度
relative_scaling=0.5 # 詞頻與詞大小關聯性
)

myWordClode = WordCloud(background_color='white',font_path='SourceHanSansTW-Regular.otf').generate(words)

plt.imshow(myWordClode)
plt.axis("off")
plt.show()

【延伸閱讀】筆記 for Python (Jieba + Wordcloud)

七、輸出圖檔

寫完之後再將其利用 .to_file 語法轉成圖片檔並存到電腦,這次的文字雲專案就大功告成啦!

myWordClode.to_file('word_cloud.png')

完整程式碼可到我的 GitHub 上看~

總結

說實話,這專案真的不難,而且其實到最後我都不算是有達到我真正想要的文字效果,有些多餘的冗言贅字,我還沒找到如何將其排除在文字雲的製作之外,讓圖片看起來有些不知所云。不過就以我久沒寫程式的情況下,在一週內完成到這個地步我已經阿彌陀佛了,期待之後等我更加上手,能更有效率且直接的產出我要的成果。

下一步應該會是著挑戰將爬取的資料寫入 SQL 資料庫,最近也有看上一門線上課程,預計下周會手刀下單開始上課,之後若有像今天這樣的小專案完成,我也會在這裡分享給大家,以作為紀錄,並幫助更多也想跨入 Python 爬蟲世界的人,共勉之。

收到更多巫師札記的內容

總算在今年做出新嘗試啦!目前還是試營運版本的電子報!每個月我至少會寄出一篇關於我當月文章的摘要與重點整理,你可以針對有興趣的主題來閱讀!除此之外,我也會不定期的寫信分享近期的學習點和心得,也希望透過電子報來和大家有更緊密的互動!

只要訂閱巫師札記電子報,我就會免費寄出一份關於「如何提升閱讀效率」的電子書,幫助大家更有系統的吸收與學習書上的知識。日後也會持續分享有意義的內容,請大家多多支持!