2018年4月15日 星期日

HTML Parsing (爬梳網頁、爬網頁、爬蟲程式)

清晨7:55 Posted by Envisioning U-Commerce Lab


在討論開放資料(Open Data)應用、大數據分析(Big Data),通常需要更多元的資料來源時,就會考慮要針對特定網站的內容進行爬梳,將需要的資料數據取回做更進一步應用或分析。以往,這就必須找懂得寫爬蟲程式(Parsing)的資訊工程師幫忙,但現在有一些工具平台可以讓完全不懂程式的人也能自己爬網頁囉,接下來就介紹幾個這方面的工具平台。

網頁爬蟲的概念就是要由人先從網頁中找到資料的規律,再利用工具或撰寫程式擷取那些規律的資料。這方面其實也可以用Google試算表的一些函數做簡單的資料爬梳,就像如何將網頁內的資料導入到 Google 試算表這篇文章教我們可以用ImportHTML函數對於網頁上的表格內容進行擷取,但是該文章的範例也無法正常執行了,因為要擷取的網頁不再是以<table>語法來呈現表格內容了。但是,如果以另外這篇文章中間提到以ImportHTML抓台灣證交所上櫃股票的資料就可以,因為其網頁確實就是以<table>語法呈現的表格資料。另外,[ Google 試算表 ]如何匯入網頁提供的 CSV 檔案資料這篇文章教我們可以用ImportDATA函數直接匯入網路上公開的CSV檔資料內容。更進一步,【Google 試算表】如何用 ImportXML 抓股價?上市上櫃興櫃可用這篇文章有介紹如何用ImportXML函數就能針對單一頁面單一項目進行資料擷取,但若是用了太多 ImportXML函數會費時較久,使用數量可能需要控制好。


工具平台方面,首先介紹
Listly 自動抓取網頁轉成 Excel 表格是最簡單容易上手的,免費方案限制至多抓取10個網站,這對很多人來說應該夠用了,只是一次只能取得一頁資料,沒辦法繼續自動爬梳第2,3,4,5,...頁資料,是比較陽春的做法。另外使用 import.io 爬梳網頁資料也因為功能更強大而成為常被推薦的平台,只是沒有免費方案,只有7天試用期,所以就暫不考慮了。


需要功能更強大的免費工具平台,在此特別推薦ParseHub,在官網註冊帳號後,還要下載搭配執行的使用者端軟體免費方案限制至多抓取5個網站,且一次在40分鐘內只能自動爬梳200頁資料。接下來,就用三立新聞謠言終結站(該站版面異動過,改用康健雜誌練習吧)進行下列操作示範。不過,在練習之前先用Chrome的開發人員工具觀察Elements,找出要擷取的內容之對應原始碼,並且認識網路爬蟲的原理。



首先,執行ParseHub使用者端軟體並完成登入,然後開始進行新專案(New Project)。(ParseHub操作介面有改版過了,但操作程序邏輯相同,所以此文章就不重新截圖了。)




輸入要爬梳的網址,在此以三立新聞謠言終結站進行示範。




右半邊可以看到三立新聞謠言終結站的網頁內容,首先以滑鼠點選第一則新聞標題。




點選後的標題出現綠色框框,這時判斷出後續第2,3,...則的標題則是以黃色框框標示。




就點選其中一個黃色框框標題吧...




於是就會看到所有標題都變成綠色框框了,在左方指令區出現(30)的數字代表在此頁面共計有30則標題可抓取,且右下方出現讀取到每一則的標題文字及連結網址兩個欄位資料了,確認無誤就再繼續進行下去。




然後自行對欄位進行命名,如下圖所示,在左方指令區把新聞標題改命名為News,而標題文字改命名為title,在右下方出現讀取到的標題文字及連結網址兩個欄位名稱也變成News_title及News_url了。




接下來要開始把其他資料再一一納入爬梳範圍,在左方指令區的News項目點選 + 號,並選擇 "Relative Select"。




以滑鼠點選第一則新聞標題。




滑鼠往下移動,將畫面上出現的箭頭拉到第一則新聞標題下方的簡短敘述文字,點擊確認,代表這敘述文字是對應於該則新聞標題的。




於是可以看到每一則敘述文字及其對應的新聞標題都被標示出來了,且右下方出現讀取到每一則的敘述文字欄位資料了




在左方指令區把新聞敘述文字改命名為description,在右下方出現讀取到的敘述文字欄位名稱也變成News_description了。




再繼續把其他資料納入爬梳範圍,在左方指令區的News項目點選 + 號,並選擇 "Relative Select"。
 



以滑鼠點選第一則新聞標題。




滑鼠往左移動,將畫面上出現的箭頭拉到第一則新聞標題左方的縮圖,點擊確認,代表這縮圖是對應於該則新聞標題的。




於是可以看到每一則縮圖及其對應的新聞標題都被標示出來了,且右下方出現讀取到每一則的縮圖欄位資料了




在左方指令區把縮圖改命名為image,在右下方出現讀取到的縮圖欄位名稱也變成News_image及News_image_url了。




前面的步驟已經將所有要爬梳的資料納入了,最後就要設定如何抓取第2,3,4,...頁的方式,在左方指令區的Select page項目點選 + 號,並選擇 "Select"。




將網頁捲到最下方出現頁數的區域,點選 "下一頁" 這個按鈕。




點選後出現綠色框框




在左方指令區將其命名為nextpage。




在左方指令區將nextpage項目點選 + 號,並選擇 "Click"。




在對話框點選 "Yes" 確認其為跳頁按鈕,然後點選 "Adcanced",在Maximum depth指定要自動抓取的頁面數量(這裡設定10是因為先確認過目前最後一頁為第11頁而總共要跳10次)。不過,可能因為網頁中的跳頁按鈕設計上的差異而導致一些問題,萬一遇到了,ParseHub官網有一些進階操作方式介紹




在左方指令區可再次確認或變更剛剛的設定,確認無誤後就點選 ≡ 號,並選擇 "Run"。




確認執行 "Save and Run"。




就開始爬梳該網站囉。




爬梳完成後,可將資料匯出成CSV或JSON格式的檔案。



下載回來的CSV檔,若打開來為亂碼,怎麼辦? 可以參考這篇文章,就是先用記事本開啟該檔案並存檔一次,應該就可以變正常了。不然,也可以直接用Google試算表開啟也會是正常的。

如果對其他網站爬梳出現了無法解決的問題,可進一步參考官網教學文章官方Youtube頻道
  • 舉例來說,藍姆酒吐司這個網站的內容,若從第一頁開始就無法完成所有頁面的自動爬梳,必須從最後一頁開始逆著做才行。
  • 還有,這是假消息這個網站的內容,若從第一個標題點選,沒辦法自動判斷出全部的標題,而是改成從第三個標題先選才行喔。
  • 至於像康健雜誌的搜尋頁食力的搜尋頁等網站的內容,必須輸入關鍵字做查詢後才能呈現資訊,這樣的網頁爬梳設定就會更複雜一些囉。

////// 講古時間 ////////////////////////////////////////////////////////////////////////////////////////////////////////////


在2020年的1968之亂,我們也開發了另一個PK1968網站,相關過程可參閱EUCL部落格,在課堂上會跟大家分享這些過程及觀點。包含法律面:
  • 首先,仔細閱讀Google 地圖/Google 地球附加服務條款
  • 若無法依據API相關的規定直接利用Google Map,建議還是先徵詢Google公司的同意再行利用。著作權法第52條規定,「為報導、評論、教學、研究或其他正當目的之必要,在合理範圍內,得引用已公開發表之著作。」同法第65條第2項規定,「著作之利用是否合於第四十四條至第六十三條所定之合理範圍或其他合理使用之情形,應審酌一切情狀,尤應注意下列事項,以為判斷之基準:一、利用之目的及性質,包括係為商業目的或非營利教育目的。二、著作之性質。三、所利用之質量及其在整個著作所占之比例。四、利用結果對著作潛在市場與現在價值之影響。」原則上利用愈少,合理使用成立的可能性愈大。但這也正是企業在利用他人著作時可能遇到的最大困難,合理使用的判斷永遠非常個案化。
  • 至於像網路爬蟲抓取公開資料或非公開資料從事非商業用途是否侵權? 在不對外公開自製網站進行分析統計相關數據用途(網站會顯示文字、圖片與影片);研究網路文化趨勢,進一步進行非商業行為的學術分析等觀之,若符合著作權法合理使用之規定(非營利之分析、研究目的),可主張合理使用,而不構成侵害著作權。