
今天我們來講用 Google sheet 打造資料爬蟲。
現今我們可以從網路上找到成千上萬的資料,不管是新聞主題、天氣、股票資訊等。但所有我們關心的議題,可能分散在各個網站,且資料量巨大。使用手動查找、複製、貼上,是很耗時間。另一個情況是,我們想要定期觀查一個資料,例如某個商品的價格變化等,你就會很希望有隻小精靈幫你把資料拉回來,做存檔或其它處理,方便你進一步的分析。
但對於非軟體工程師來說來說,要寫爬蟲程式的話就很心累了!你需要學習 Python 或是其它程式語言,同時要有伺服器資源,來部署寫好的爬蟲。
Google 試算表提供了很好的替代方案,它不需要寫程式就提供了多種抓取資料的方法,且因為試算表原本的特性,易資料再處理、支援多種設備等,而且不用再額外購買雲端運算資源。
外部引用函數:IMPORT 系列函數
Google 試算表提供了四種外部引用的函數:IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXML ,個別有不同的使用時機,我們再一一來看。
IMPORTHTML
IMPORTHTML 函數會直接從 HTML 頁面提取 表格 ( Table )和列表 ( List ) 到你的工作表中。這可以省下很多大量表格資料的複製貼上的動作。表格屬性通常在網頁上會長這樣:

我們可以用 IMPORTHTML 在 HTML 頁面中拉出表格和列表
= IMPORTHTML ( URL , QUERY, INDEX, [Language_Codes] )
URL - 想爬取資料的網站連結
QUERY - 查詢的類型是 "Table" 或 "List"
INDEX - 頁面中可能有多組 Table 或 List ,可以指定是第幾個
Language_Code - 頁面的語言代碼若有歧異,可指定特定語言代碼去解析資料。
範例 - 使用 IMPORTHTML 抓取維基百科各國人口資料
=IMPORTHTML("https://zh.wikipedia.org/wiki/各国家和地区人口列表", "table", 2 )
結果

IMPORTDATA
IMPORTDATA 函數可以直接匯入 CSV 資料,尤其是一些政府網站的公開資料,會用 csv 來提供資料,或者是也有人會把 Google Sheet 公開發佈,那也會是 CSV 格式,可以用 IMPORTDATA 來拉取資料。
語法
= IMPORTDATA ( URL )
URL - 想爬取資料的網站連結
範例 - 使用 IMPORTDATA 抓取台中市停車位資訊
=IMPORTDATA("https://datacenter.taichung.gov.tw/swagger/OpenData/c7e10a70-2afc-458a-add1-51e5de386579" )
結果

IMPORTFEED
IMPORTFEED 函數可以拉取 RSS 或是 Atom 格式的資料,特別適合於收集部落格、新聞網站或是其它會推送 RSS 的站台
語法
= IMPORTFEED ( URL, [QUERY], [HEADERS], [NUM_ITEMS] )
URL - 想爬取資料的網站連結
QUERY - 想要匯入的 feed 資料類型。選項包括 "items", "feed", "title", "summary" 等。預設是 "items" 。
HEADERS - 布林值,指定匯入的資料是否包含標頭,預設是 FALSE
NUM_ITEMS - 指定匯入的項目數量,預設為所有
範例 - 使用 IMPORTFEED 抓取 iTunes 最受歡迎的電影
=IMPORTFEED("http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topMovies/xml",,true)
結果

IMPORTXML
IMPORTFEED 函數是最通用函數,可以解析多種結構化資料類型的資料,包括 XML、HTML、CSV、TSV 和 RSS 以及 ATOM 。現在很多網站不是用 table 或 list 來作資料集,而是直接用 div 來做表格,所以就要用 IMPORTXML 來作元素的選擇。
語法
=IMPORTXML(URL, XPath, [Language_Code])
URL - 想爬取資料的網站連結
XPath - XML 節點的查詢語法,有空再來寫一篇,可先參考 https://www.w3school.com.cn/xpath/xpath_syntax.asp
Language_Code - 頁面的語言代碼若有歧異,可指定特定語言代碼去解析資料。
舉個例子,下面是個房屋網站的資料,我們可以使用 IMPORTXML 抓取實價登錄資料

右鍵「檢查」,發現裡頭是 <div> ,所以沒法用 IMPORTHTML 處理

這時,我們改用 IMPORTXML
=IMPORTXML("https://www.sinyi.com.tw/tradeinfo/list/Taipei-city/100-zip/6month-dealtime/datatime-desc/index", "//div[@class='trade-obj-card-web']")
這段 XPath 的意思是要抓取 class='trade-obj-card-web' 的 div ,底下的所有資料
結果

注意事項
Google 試算表 引用外部資料是不是太方便了?但使用上有一些事情要注意
1. IMPORT 函數執行限制
要預留足夠的展開空間
資料引用會拿到不特定數量的資料,若有其它資料會展開失敗。
一個試算表的 IMPORT 系列函式限制
原本有明確限制 50 個引用,但後來拿掉這個限制,但仍可能會發生 IMPORT 使用數量過多的異常,估計可能是用系統運算時間之類來做限制。
即使沒有 50 個引用限制,它仍會造成大量的系統資源消耗,視窗開啟速度也會變慢,務必減少它的使用。如果有興趣的話請留言,我專門來寫一篇關於公式優化。
每日 20,000 次的呼叫 URL 額度
如果你是 Workspace ,每日的呼叫額度是 100,000 次
這是整個帳戶的配額,不是指單檔。所以,雖然額度不低,但還是建議慎重使用。
配額算在擁有者身上,如果檔案有編輯者在修改公式,可能會影響擁有者的額度
2. 更新頻率
在檔案開啟的時候,IMPORTDATA、IMPORTHTML 和 IMPORTXML 會每小時更新。
重新整理或是開啟檔案,並不會引發 IMPORT 資料更新。
若要強迫更新,可以增加 URL 的引數,如 =importdata("url"&A1),把 A1 做成一個下拉,放 "#A1" | "#A2" 。需要強制刷新時就改 A1 的數值,讓整串 URL 改變,來觸發資料更新。
3. 來源網站的限制
配合來源資料的更新週期。我們都希望資料是最新的,但如果來源網站的資料沒有更新,重複拉取資料也只是徒資網路傳輸的消耗。例如每月更新一次的資料,每天或每小時去拉,實質上沒意議。所以應該了解來源資料的更新週期,正確地設定試算表 IMPORT 函數的更新週期,避免不必要的重複資料拉取。
有些網站的使用條款中可能明確禁止自動化爬取資料,或者限制資料的使用方式,例如禁止商業使用。仔細閱讀並遵循網站的使用條款,可以避免爭議。
合理地設定資料抓取頻率和範圍,避免對網站伺服器造成過大負擔。這不只是道德考量,也是避免去觸發網站的防爬機制。
總結
使用 Google 試算表進行網路資料收集,是一種既簡便又強大的方法,既不用寫程式,也不需要額外的網路運算資源。最重要的是,它可以結合試算表既有的資料處理方式,對資料進行加工,例如:
IMPORTHTML( "https://tw.stock.yahoo.com/quote/" & A2 & ".TW" )
FILTER( IMPORTHTML( ... ) )
而這些自動化收集的資料還能再加工成圖表,你就擁有一個即時的儀表板了!
當然,所有工具的使用還是要遵循相關的法律限制,但只要在使用時保持謹慎,你就能用低成本又高效的方式,打造自己的資料倉庫。
希望這篇文對你有啟發!
你有試過使用 Google 試算表來抓取網路資料嗎?
你有嘗試過將抓取到的資料進行分析或可視化嗎?
在工作或個人專案中,哪些場景可以應用這些函數來提高效率?
歡迎訂閱我的電子報,持續關注我的 Google Workspace 高效工作術。
Comments