[R語言專題] 利用R語言爬蟲抓取網路資料:觀念篇
0Last Updated on 2023-12-10
什麼是網頁爬蟲?要怎麼用R語言爬網頁?寫網頁爬蟲的注意事項和具體流程為何?這篇文章告訴你
看到PTT很多資料想要用爬蟲爬下來嗎?想抓社群網站上的網友留言嗎?想弄一個自定義的比價網嗎?還是單純想要監測股價資料,但厭倦手動記錄了?這些問題,都能用R語言寫爬蟲程式解決。
這篇文章中,我會介紹網路爬蟲的基本概念,還有實際開始寫R語言程式碼前,應該注意什麼重點。
網頁爬蟲的基本概念
定義:什麼是網頁爬蟲?
想像一下,有一種工具可以像網絡探險家一樣,穿梭在互聯網的每個角落,收集和整理資訊-這就是網頁爬蟲的魔力所在。
網頁爬蟲(web scraping),也稱為網路蜘蛛、網頁機器人,可以是動詞、也能是名詞,指的是撰寫程式模仿人類造訪網頁行為,透過HTTP或其他網路協議,從伺服器上擷取網頁、分析內容,提煉出有用的資料。
平常跟工程師、分析師聊天或者解釋專案的時候,我們常常會說,嘿,我正在爬資料(scrape,動詞),這時候就是在說我們的程式碼正在運行,替我們自動抓下資料;如果說我們有一支網路爬蟲的時候,則是在指我們有一支城市/一份程式碼,可以替我們爬下資料。
對象:靜態與動態網頁的差異
繼續我們的網絡探險之旅,深入了解網路爬蟲的工作方式是必不可少的。
網頁爬蟲的核心任務是從網頁中提取資料,而這些網頁大致可分為靜態和動態兩種類型,每種類型都有其獨特的挑戰和對應的爬蟲策略。
靜態網頁,就像是網絡世界中的靜態畫面,它們的內容在頁面加載時就已經定型。HTML程式碼裡包含了所有的數據,這使得對靜態網頁的爬取相對簡單。網路爬蟲可以直接讀取HTML代碼,接著解析(parse)這些程式碼,輕鬆地提取出需要的資料。
對於初學者來說,靜態網頁是理想的學習對象,因為它們的結構清晰,容易理解和操作。
台灣人熟悉的PTT和維基百科,都是靜態網頁,所以很多人剛開始學爬蟲的時候,都是從這兩個網站入手。
動態網頁,則是更複雜的存在。當你訪問一個動態網頁時,其內容可能會根據用戶的互動、時間或其他因素而變化。這些頁面通常依賴於JavaScript或Ajax技術,當頁面載入(load)後,才在瀏覽器中生成或渲染出最終的內容。這意味著網路爬蟲需要模仿瀏覽器的行為,執行JavaScript程式碼,才能獲取到頁面上的數據。
動態網頁的爬取相對複雜,但對於應對現代網頁結構,學會爬取動態內容則顯得尤為重要。
包含Instagram、Facebook和TikTok,都算動態網頁。掌握靜態網頁爬取的方法後,再來學習動態網頁的對應之道會比較好。
目的:爬蟲的資訊有什麼價值?
你可能會有疑惑,為什麼要爬蟲?這跟我直接造訪網站有什麼差別?當資訊充足得已經不是一種稀缺時,我們要思考的問提是,那還有什麼是稀缺?
當資料量本身太大的時候,能夠省時間地搜集資訊是種稀缺,經過整理與編輯的資訊也是。
當AI生成的粗製濫造資訊浮濫出現,具有權威性的資訊是種稀缺,有實地採訪的資訊是種稀缺。
這樣看來,我們可以找到網頁爬蟲能夠處理的稀缺問題:透過廣泛搜集資料,還有過程中的篩選與精煉,能夠將雜亂無章的資訊變成有價值的資訊。
首先,品牌在意消費者意見時,可以用爬蟲爬下橫跨Dcard、PTT、Facebook等平台的用戶留言;消費者在意商品價格時,可以用爬蟲爬下不同電商平台上的商品價格。
接著,他們透過編輯的技巧,篩選與精煉資料,例如利用自然語言處理的技術分類用戶留言的情感,又或者是爬梳商品歷史價格再比價後,推薦給消費者最合適的下單商家。
爬蟲抓下的資料,既可以用在商業上的市場趨勢分析,也能用在政治上的議題好感度探測,使用者可以藉此探索社會的變化趨勢。這個領域也有專有名詞:社群聆聽(socail listening)。
當然,還有另一個重點在於自動化。手動收集和處理資料不僅耗時,而且容易出錯。網頁爬蟲的自動化可以提高搜集資料的效率與準確性。
這樣一來,我們在看中華職棒球員每場得分時,不用一場一場點擊,只要寫爬蟲把每場賽事表下爬下即可;學術研究者也能大量搜集公開資料,可以增加量化視角帶來的注意。
法律和道德考量:爬蟲的合法性與道德限制
當我們談論網頁爬蟲時,絕對不能只想到自己。對想爬下資料的人說,怎麼有效率地抓下資料很重要,如果能夠一秒鐘抓下50萬筆資料,聽起來很美好,但對於網站擁有者來說,瞬間湧進的流量可能是場災難。
所以,討論爬蟲絕對不只是技術和資料的問題,還涉及到法律和道德層面。我們一定一定一定要記得,爬蟲的時候務必謹慎考慮合法性和道德限制,這樣才能維護好的網路環境。
每個國家跟區域對網頁爬蟲的法律規範各有不同,如果是把爬到的資料用在商業使用,很常會遇到版權問題,因為那種通常不算「合理使用」。即便沒有法律直接規範版權,也可能會違反網站的服務條款(terms of service)。
舉例來說,很多網站會在「Robots協議」(robots.txt)文件裡面,告訴寫爬蟲程式的人,有哪些內容開放抓取、哪些禁止訪問的。違反這些規定,想當然爾會有後果,就算沒有入法,人家還是可能會告你,你又永遠不知道法官怎麼想,所以了解並遵守這些規則,是每位爬蟲開發者的責任,可以參考這篇文章:「用爬蟲爬取網路上的資料違法嗎?使用公開資訊要小心!」。
台灣就有滿多例子,例如先前有廠商爬下591租屋網的資料,接著讓使用者在自家應用程式上查詢。這間廠商就是透過增加過濾、篩選等功能,以編輯的方式增加資訊的價值。法院認為,這間廠商的做法影響591的流量,因此減損591賣廣告的商業價值,同時排擠用戶上591的效果,因此構成侵權。
另外,也有法律資料庫廠商互告,內容同樣跟廠商爬下對方資料,藉此賺取流量、獲得營收有關。在學校的時候,也聽老師說過有學生寫論文的時候,為了搜集樣本爬取新聞網站資料,但因為程式寫得不好,對目標網站的伺服器造成負擔,導致對方直接找上學校揪出學生,後續也有一些法律效果。
當然,爬蟲不只跟商家之間的侵權有關,個人隱私也是考慮重點。就以爬IG為例子,如果抓下別人的相片、打卡歷史,接下來你要拿來做什麼?雖然這些資料都是公開的,但不代表我們可以無限制的使用資料,尤其是涉及個資的資料,合理做法還是尊重個人隱私。
我們在寫爬蟲的時候,要記得兩個重點:禮貌造訪,以及合理使用。
禮貌造訪指的是不要給人家網站帶來很大負擔,你可以降低發送請求(request)的頻率,一次抓少量的資料,不要瞬間就把人家網站打爆,另外也要確認對方網站有沒有規範哪些可以抓,哪些不能抓,有講就要遵守。
合理使用則是指抓下資料後,你要拿來做些什麼。如果人家部落格發了很多文章,你抓下來之後只是要賺流量、獲取廣告費用,那很明顯就不是合理使用,因為你會影響其他使用者造訪原本文章作者網站的意願。
R語言與網頁爬蟲
爬下網頁的流程
雖然你已經聽過概念,但可能還是難以想像,到底人造訪網頁跟用R語言造訪網頁,有什麼差異?
不管是靜態還是動態網頁,我們可以將爬網頁分成幾個階段。
- 確定爬蟲目標
- 確定自己想爬取的網頁及目標資料。
- 希望抓文字?還是表格?或者是圖片?
- 例子:我要抓PTT棒球版的文章列表,同時要有文章的超連結。
- 分析網頁結構
- 分析目標網頁的結構、確認網頁運作。
- 網頁是靜態還是動態生成的?你要抓的資料在哪些節點?
- 例子:我發現PTT是靜態生成的,想抓的html節點叫做article。
- 設計爬蟲程式碼
- 思考架構後實際設計程式碼,過程中會運用迴圈、條件判斷等概念。
- 要怎麼自動爬下100篇文章?要怎麼對應不同參數調整程式碼?
- 例子:我不只想爬棒球版,也想爬NBA版。
- 發送網頁請求
- 根據網頁類型向伺服器發送請求以便獲得資料。
- 你要造訪的網頁是不是需要帳密?還是有些參數要設定?
- 例子:用
httr
發送http請求、用RSelenium
模擬使用瀏覽器。
- 擷取資料並解析
- 抓下網頁原始碼後,從中擷取和解析所需資料。
- 例子:用
rvest
取得資料、以jsonlite
應對JSON格式資料。
- 整理並清洗資料
- 將爬取的數據進行清洗和格式化,轉換成可用於分析和視覺化的格式。
- 例子:活用
tidyverse
底下包含tidyr
、dplyr
、magrittr
等套件。
R語言套件
從上面的流程中,我們可以看到幾個常用套件:httr
、rvest
、RSelenium
和jsonlie
。
其中,httr
和RSelenium
主要應用在發送網頁請求(靜態)或者模擬使用者瀏覽(動態)的階段,rvest
和jsonlite
則是擷取資料的階段。
底下就來一一介紹。
- httr:處理靜態網頁的好幫手,主要用來發送與處理HTTP請求
- 它提供了一個簡單直覺的介面,讓你可以輕鬆地對網站發送GET、POST、PUT、DELETE等各式HTTP請求。
- 有一套處理HTTP回應的工具,可以幫你解析回應header、抓取主要內容、處理可能出現的錯誤等等。
- 它還有一些方便的功能,像是處理網路請求時常見的超時、重試、設定agent等問題。
- RSelenium:動態網頁的爬蟲高手,模擬瀏覽器操作
- 模擬真實瀏覽器的行為。包含點擊按鈕、填寫表單,還是滾動頁面,就像有個虛擬的人在網頁上操作一樣。
- 讓程式自動執行JavaScript程式碼,這對於那些需要透過JavaScript才能顯示內容的網頁特別有幫助。
- rvest:網頁資料擷取的好幫手。
- 直接讀取網頁的HTML程式碼,然後像挑選水果一樣挑選你需要的數據。
- 你可以用css或者XPath選擇器定位網頁元素,客製化程度很高。
- 把網頁上的表格、文字、圖片等信息轉換成R語言可以處理的格式。
- jsonlite:處理JSON數據的一個重要套件。
- 提供了一個簡潔而強大的接口,用於在R語言和JSON格式之間轉換數據。
- 使用 httr 從API獲取數據後,通常會用 jsonlite 來解析這些數據,以便進一步的數據處理和分析。
設計爬蟲程式架構
這篇文章是概念篇,所以我們先不直接進入到實際使用各個套件的環節,先來談怎麼架構一支爬蟲程式。
前面有提到,你要先理解目標網頁結構,這牽涉到確認html標籤、css屬性甚至是javascript對網頁內容呈現的影響,我們後續會再提,先假定你已經做完研究,接下來你要思考幾件事。
- 爬蟲的範圍有多大:一開始,先確定範圍。
- 要爬的網頁層級:網站架構有很多層,你要爬幾層
- 要爬的網頁頁數:新聞網站有很多頁,你要爬幾頁
- 要爬的網頁內容:社群網站有文章也有留言,你要哪些
- 爬蟲的流程是什麼:確定範圍後,先在腦中走過一次爬蟲的流程。
- 先後順序:你要爬列表還有列表中的細項時,要怎麼排定爬取順序?
- 預想情境:你遇上不同情境例如網頁不存在或者無結果時,要怎麼處理?
- 儲存資料:目標有很多頁的時候,你要怎麼把不同頁的資料存在一起?
- 爬蟲的程式邏輯:想過情境後,將上面的想法落地。
- 重複性:你要一支程式不斷運轉,所以你會用到迴圈
- 不中斷:你希望減少人為介入省時,所以你會用到條件判斷處理錯誤,同時紀錄錯誤資訊
- 彈性:你要在不同情境下做出不同行動,這也是條件判斷派上用場的時機
- 效率:你要在速度和禮貌之間取得平衡,因此要考慮怎麼增進效率
- 互動性:你不希望爬蟲是黑箱,會想知道進度,要在螢幕上顯示或者傳訊息報告進度
提這些的原因,主要是因為爬蟲需要你深入瞭解網頁結構,巧妙地應用各種程式設計概念,還要考慮到錯誤處理、紀錄流程與進度等,這跟我們單純畫一張圖表、分析一包資料的流程有層次上的差異,相對也更嚴謹一點,所以才會提比較多想法與概念上的東西。
下一篇文章中,我們就會正式進入到實際撰寫R語言程式碼的環節。
網頁爬蟲(web scraping),也稱為網路蜘蛛、網頁機器人,指的是撰寫程式模仿人類造訪網頁行為,透過HTTP或其他網路協議,從伺服器上擷取網頁、分析內容,提煉出有用的資料。
爬下網頁的流程
- 確定爬蟲目標
確定自己想爬取的網頁及目標資料。希望抓文字?還是表格?或者是圖片?
- 分析網頁結構
分析目標網頁的結構、確認網頁運作。網頁是靜態還是動態生成的?你要抓的資料在哪些節點?
- 設計爬蟲程式碼
思考架構後實際設計程式碼,過程中會運用迴圈、條件判斷等概念。要怎麼自動爬下100篇文章?要怎麼對應不同參數調整程式碼?
- 發送網頁請求
根據網頁類型向伺服器發送請求以便獲得資料。你要造訪的網頁是不是需要帳密?還是有些參數要設定?
- 擷取資料並解析
抓下網頁原始碼後,從中擷取和解析所需資料。
- 整理並清洗資料
將爬取的數據進行清洗和格式化,轉換成可用於分析和視覺化的格式。
No Comments