緣起
我曾經於高中時期接觸過一點程式語言,當時是學習C++,然而後期因為對影像合成方面比較有興趣,就轉往學習Adobe Creative系列,因此程式語言一直都是停留在基礎的演算法階段。
近幾年因為機器學習與人工智慧成為顯學,Python也隨之崛起。綜觀市面上的Python書籍,必定會有關於網頁爬蟲的實作章節,可謂大量、重複性資料收集工作的福音。我雖然對此早有興趣,但先前忙於工作,一直沒有認真研究。
先前因為工作的緣故,經常需要收集、整理常用的司法書狀。然而,光是司法院所提供的範本就有上百種,如果要一個一個瀏覽、篩選,難免會有漏網之魚,且必須耗費大量時間在點網頁、複製資訊這種枯燥的過程上。
於是惰性再次燃起了我學習爬蟲的動力。但如果從頭開始學Python應該是緩不濟急,因此我轉而尋求無須coding的替代方案,而有了這篇學習紀錄。
設定目標
誠如前述,我希望從眾多書狀海中,挑選出常用的書狀類型。在挑選之前必須先知道司法院有哪些書狀,以及更新日期、所適用的法規等等詳細內容。
司法院本身就已經將書狀分為幾大類,並以目錄頁面的形式整理,正是適合爬蟲上場的地方。
準備工作
要進行爬蟲之前,最重要也最困難的就是「觀察網頁」。
由於爬蟲也是程式,程式講求邏輯,想要爬蟲程式幫忙完成重複性高的工作,就必須先找出重複的規律。以網頁爬蟲而言,規律主要可區分為「網址」和「內容」。
網址
首先觀察網址。
(註:首次進入頁面時的網址為https://www.judicial.gov.tw/tw/lp-1365-1.html,但切換至第二頁再切回第一頁時,因為有頁面篩選器作用的緣故,使得第一頁的網址變得與第二頁類似,詳下述)
但每個狀的子頁面網址就沒那麼幸運,後綴編號都不一樣而且沒有規律。
簡單抓三個書狀的網址來比較,可以發現幾乎是沒有任何規律可言,因此無法單純透過網址規律變化的方式進行爬蟲。
內容
雖然每個狀的子頁面網址沒有規律,但每個頁面的布局、欄位的命名都相同,因此只要進到各個書狀的子頁面就能快速抓取特定位置的內容。
小結
因此,大致上可以總結出來,目錄頁面的網址具有規律;各個書狀的網址沒有規律,但頁面架構一致。
不同網站可能有不一樣的佈局跟規律,必須要逐一、個別觀察,沒有放諸四海皆準的原則。但如果有架站經驗或是經常觀察網址的人,會更容易找到其中的規律,簡而言之就是熟能生巧。
爬蟲實作
爬蟲工具
市面上現成的爬蟲工具眾多,都是不需要直接coding的,有安裝在本機上的,也有免安裝的。
由於我習慣使用Chrome瀏覽器,因此就選擇了免安裝的Chrome擴充功能 - Web Scraper,作為本次實作爬蟲的工具。
安裝
Web Scraper 會整合在Chrome右鍵的「檢查」欄,或是直接按擴充功能也可開啟。開啟Web Scraper後會先要求變更版面配置,必須更換成上下的版面配置。
建立爬蟲
Create sitemap
更換版面配置後按下「Create new sitemap → Create sitemap」,這邊主要是指定要進行爬蟲的網頁範圍。
(註:如果是以等比增加,例如第一頁為10、第二頁為20,以10為公比,則可輸入成 [10-20:10] )
輸入完成後按下 Create Sitemap 即可進入爬蟲步驟頁面。
Selectors
Web Scraper 的爬蟲工具有好幾種型態,最常見的是Text,也就是擷取純文字。第二個是Link,與Text不同的地方在於Link是擷取超連結的網址,而不是文字本身。
舉例而言,當使用Text抓取「法人登記聲請書(法人設立登記、變更登記)」項目時,就會抓下這一串純文字;如用Link抓取,則會抓取這串文字背後的超連結,也就是https://www.judicial.gov.tw/tw/cp-1365-57442-44b2f-1.html,並且可以進入該頁面進行子頁面的抓取工作。
回到上面的範例,我們必須先在目錄頁建立Link爬蟲,讓爬蟲依序將所有目錄中的書狀網址都爬下來,因此先按「Add new Selector」新增一個Link爬蟲
由於目錄頁有多個Link需要抓取,因此底下的「Multiple」方塊必須勾選。
接著按下「Select」選取要擷取的東西,先點一下第一項「法人登記聲請書(法人設立登記、變更登記)」,呈現紅框時就是已經選取,接著再選取第二項的「夫妻財產制契約登記聲請書」,此時爬蟲會直接判斷並選取所有相類似的物件,全部的書狀名稱就會一次全部選取起來,最後按下「Done selecting」
選取完成後爬蟲就會標註出需要擷取的範圍是「書狀名稱欄位」,也可以再按一下旁邊的Data preview預覽一下抓取的結果
設定完成後就可以按下最下方的Save selector,這樣就新增完第一個爬蟲步驟。
如果目錄頁還有其他要抓取的東西,可以依樣畫葫蘆繼續新增,但在這個例子中,目錄頁已經沒有其他要抓取的東西,而是要進入子頁面進行抓取,因此按一下剛剛新增完的Link步驟,會進入另一個新增步驟的頁面,也就是爬蟲藉由Link進入子頁面後要進行的動作。
這時再點選網頁上的「法人登記聲請書(法人設立登記、變更登記)」,進入第一個子頁面,繼續設定子頁面的爬蟲。
在子頁面中,預計要抓取三項內容,分別是:相關條文、使用說明、下載連結、更新日期。
其中相關條文、使用說明、更新日期都是純文字內容,因此使用Text爬蟲抓取即可;至於下載連結,則可以使用HTML型態進行抓取。
設定完成後,Link下的爬蟲步驟共有四個,分別是三個Text和一個HTML。由於各個Text或HTML步驟都只擷取一項內容,因此底下的Multiple方塊就都不用勾選。
完成之後請按上一頁回到目錄頁,也就是Start URL的地方,並且按下選單「Sitemap test → Scrape」開始進行爬蟲。
開始前還可設定載入和延遲時間,如果碰到網頁反應比較慢,可以增加數值,以免網頁還沒跑出來,爬蟲就爬了空值下來。這邊使用預設的2000 ms。設定完成後按下 Start scraping。
開始爬蟲時會跳出一個單獨的視窗,並快速的進出子頁面進行爬蟲作業,待爬蟲完成時,視窗會自動關閉。
爬蟲完成後,請按下「refresh」載入剛剛爬下來的資料。如果爬下來的資料不符合預期,可能是剛剛的範圍或爬蟲型態有誤,可以多調整幾次。
Export data
如果資料沒有問題,可以按下選單「Sitemap test → Export data」匯出資料,免費版本的 Web Scraper 可以匯出成excel檔或csv檔,這邊選擇csv以便進行後續資料清理。
到此為止,就已經完成一次爬蟲作業,匯出的csv檔即是所謂的raw data。
資料清理與應用
在大數據的領域中,匯出的raw data可以再使用資料工具進行清理(data cleaning),以便後續分析應用。舉例而言,前面提到的書狀下載連結,爬蟲直接爬下的HTML內容如下:
<a href="<https://www.judicial.gov.tw/tw/dl-51346-463fedd5e22a4991a5c72a1dec938971.html>" title="民事聲請支付命令(以多張支票聲請者).odt">民事聲請支付命令(以多張支票聲請者).odt</a><br><a href="<https://www.judicial.gov.tw/tw/dl-51347-5b445d12dbfe4f9b856e75347ac32ed6.html>" title="民事聲請支付命令(以多張支票聲請者).pdf">民事聲請支付命令(以多張支票聲請者).pdf</a>
想要得到單純的下載連結,就必須在此步驟進行切割、清理。由於資料清理的工具非常多,在此不多做贅述。清理完成後就可以繼續進行後續的分析、利用,以下是我清理後的部分結果:
總結
俗話說的好:科技始終來自於人性。網頁爬蟲工具,可以幫助人類完成重複性高且枯燥、瑣碎的收集過程。我透過本次有目的的實作,也算是初嘗網頁爬蟲的甜頭,未來應該還是會努力學習Python,畢竟能自己寫程式,就代表能自動化處理更多種樣態的工作。
最後不免俗地還是要加註警語:任何網站上的內容都是有著作權的,我國的著作權也不以登記為必要。換句話說,當網頁寫好的那一瞬間就自動取得著作權。因此在使用爬蟲收集網頁資訊時,必須注意著作權的相關規範 (相關文章:網頁爬蟲的相關法律責任)。科技沒有好壞之分,爬蟲可以是省時的利器,也可以是侵權的凶器,使用前應詳閱著作權法規範。