用 Google Sheets 製作簡易爬蟲
Posted on Dec 17, 2017 in Google 試算表 by Amo Chen ‐ 2 min read
Google Sheets 有內建幾個能夠用來擷取網頁資料的函式(function) ,例如 IMPORTXML
, IMPORTHTML
, IMPORTDATA
等等。
如果只是簡單的需求,不妨可以考慮用這些函數來幫忙擷取資料。
本文用政府資料開放平臺的網頁及資料及進行示範:
IMPORTDATA
如果需要載入 .csv
, .tsv
2 種格式的資料時,可以利用 IMPORTDATA
。
使用的方法很簡單,只要在 IMPORTDATA
函式放入資料連結即可,例如要載入 YouBike 資料的話,只要在儲存格輸入:
=IMPORTDATA("https://quality.data.gov.tw/dq_download_csv.php?nid=28318&md5_url=45daed3330c8be0e1174e2f17b961d0a")
接著等候一小段時間,就會看到資料載入在 Google Sheets 了。
IMPORTHTML
如果是需要從某個網頁上擷取表格資料,則可以使用 IMPORTHTML
。
雖然函數名稱是 IMPORTHTML
但是此函式只能夠用來擷取 <table>
<ol>
<ul>
3 種 HTML 標籤內的資料。
可以直接輸入 Google 提供的範例,感受一下威能:
=IMPORTHTML("http://en.wikipedia.org/wiki/Demographics_of_India","table",4)
IMPORTHTML
的語法為:
IMPORTHTML(url, query, index)
如前面所述,因為此函式只能夠用來擷取 <table>
<ol>
<ul>
3 種 HTML 標籤內的資料,所以第 2 個參數也只能輸入 table
或是 list
,除了 table
以外的資料就是 list
。
index
則是第幾個的意思,例如要抓取頁面上第 4 個表格就得輸入:
=IMPORTHTML("網址", "table", 4)
如果想知道表格在頁面上是第幾個,可以利用 右鍵
> 檢查元素
,然後在 table 元素(elemnet)上再點 右鍵
> Copy
> Copy Xpath
,然後找個記事本貼上剛剛得到字串,會得到跟以下結果類似的字串:
//*[@id="mw-content-text"]/div/table[6]
上述範例的 6 就是 index 要填的值。
p.s. list 就無法這樣得到 index ,因為 list 可能有 ol, ul 2 種,所以 index 會算不準。
IMPORTXML
因為 IMPORTHTML
有著先天性的限制,如果要做到更彈性的擷取網頁資料,可以使用 IMPORTXML
,然後搭配 IMPORTHTML
所提到的 Copy Xpath 就可以擷取網頁上的任意資料。
IMPORTXML
的語法:
IMPORTXML(url, xpath_query)
例如要抓取 新北市公共自行車租賃系統(YouBike) 的網頁標題可以輸入:
=IMPORTXML("https://data.gov.tw/dataset/28318", "//*[@id='node-28318']/div[1]/div/h1")
p.s. Copy Xpath 會含有雙引號 "
,記得取代成單引號 '
再放入 IMPORTXML
中,否則會出現 #ERROR!
如果要抓取大量資料,建議不要使用此種方式,因為 Google Sheets 並無法控制抓取的速率,很可能會在短時間內對對方的網站發起大量要求(request),變成一種變相的攻擊行為
參考資料
https://support.google.com/docs/answer/3093335
https://support.google.com/docs/answer/3093339
https://support.google.com/docs/answer/3093342