2017年8月29日 星期二

用 Google 試算表追蹤網拍商品價格變化 (上)


想在網拍買 3C 用品,但又不想錯過特價,因此每天都造訪同樣的網頁看看價格,浪費很多時間?這篇教學文章利用 Google 試算表強大的功能,定期追蹤商品價格,並在價格發生變化時,自動傳送 E-mail 給自己。
本文適合對 Excel 或其他試算表軟體有簡單基礎的人,分為上下兩篇。上篇先解析網拍平台的價格資訊如何儲存,接著介紹兩個 Google 試算表特有的函數,讓我們可以取得網路上的資料;下篇則介紹如何使用簡單的程式,讓試算表每日自動更新,並在價格有變化時通知。

網路購物平台網頁解析

PCHome 網路購物是本次介紹所參考的價格來源,我們的第一步要從網頁中找到價格資訊。現在的網頁常常採用動態載入,PCHome 的網路購物平台就是如此,商品名稱﹑價格等,都是使用 JavaScript 在使用者端載入,所以下載下來的 HTML 文件中並沒有價格資訊。只要在網頁上點右鍵選檢視原始碼,就可以發現原始碼是找不到價格的。
因此,我們第一步就是要找到啇品的價格資訊藏在哪裡?本來以為這會是很麻煩的工作,但所幸現在幾乎所有的瀏覽器都有很好的開發者工具幫助我們找到想要的資訊。以 Google Chrome 為例,只要按下 F12 就可以打開開發者工具,接著連接到商品網頁,從開發者工具可知道連線過程中下載了哪些檔案。
用 Chrome 的開發者工具偷看價格資訊從哪來。
按照上圖,先選擇 JS,因為這些動態資訊很可能是用 javascript 的方式取得;接著,一個個偷看下載下來了 JS 檔案內容;很幸運地,在第二個檔案之中,所取得的 javscript 中就包含商品的價格資訊了,內容如下:
try{jsonp_prod({"DXAO3M-A90084OMU-000":{"Seq":18001522,"Id":"DXAO3M-A90084OMU-000","Name":"GARMIN Forerunner 935 \u5168\u65b9\u4f4d\u9435\u4eba\u904b\u52d5\u9336","Nick":"<font color=blue>\u3010\u71b1\u92b7\u88dc\u8ca8\u518d\u958b\u8ce3\u3011<\/font><br>GARMIN Forerunner 935 \u5168\u65b9\u4f4d\u9435\u4eba\u904b\u52d5\u9336","Store":"DXAO3M","PreOrdDate":"","SpeOrdDate":"","Price":{"M":0,"P":16990},"Discount":0,"Pic":{"B":"\/items\/DXAO3MA90084OMU\/000001_1498036929.jpg","S":"\/items\/DXAO3MA90084OMU\/000002_1500861719.jpg"},"Weight":0.3,"ISBN":"","Qty":0,"Bonus":0,"isBig":0,"isSpec":1,"isCombine":0,"isDiy":0,"isRecyclable":0,"isCarrier":0,"isMedical":0,"isBigCart":1,"isSnapUp":0,"isDescAndIntroSync":0,"isFoodContents":0,"isHuge":0,"isEnergySubsidy":0}});}catch(e){if(window.console){console.log(e);}}
一起得到的資訊還有商品代號﹑品名﹑商品圖片等資訊。
在 JS 清單中對著第二個檔案按右鍵,選 Copy/Copy link address,就可以取得網址如下:
http://ecapi.pchome.com.tw/ecshop/prodapi/v2/prod/DXAO3M-A90084OMU-000&fields=Seq,Id,Name,Nick,Store,PreOrdDate,SpeOrdDate,Price,Discount,Pic,Weight,ISBN,Qty,Bonus,isBig,isSpec,isCombine,isDiy,isRecyclable,isCarrier,isMedical,isBigCart,isSnapUp,isDescAndIntroSync,isFoodContents,isHuge,isEnergySubsidy&_callback=jsonp_prod&1503199800?_callback=jsonp_prod
把網址直接餵瀏覽器,沒問題,正常下載到我們想要的資訊,看起來沒有做額外的屏蔽。網址中的DXAO3M-A90084OMU-000 就是商品代號,想得到不同的商品的資訊,只要把這裡換掉就好了。

使用 Google 試算表載入商品資訊

得到能取得價格資訊的網址後,第二步就是如何用 Google 試算表把資料擷取下來。
雖然我們得到的是一段 JavaScript,但這裡我們並不需要知道他的含意,只要把他當成一段普通的文字,再以試算表提供的工具取得想要的資訊。

運用 IMPORTDATA 函數,從網路上下載資訊

IMPORTDATA 函數需傳入網址,他會將指定網址的資料以 .csv (逗號分隔值) 或 .tsv (Tab 分隔值) 格式匯入。上述的價格資訊其實並非 csv 或 tsv 格式,但我們在此只是需要一個方法把網路上的資料轉換到表格中。在儲存格中鍵入 =importdata("http://...") 後按下 Enter,再等待一段時間,可以發現本來的那段 Javascript 已經被匯入試算表,並且以逗號分隔,被置入不同的欄中,如下表。

結果第九欄的資訊為 P:16990},正是我們想要的價格被夾在片段的 javscript 中。

使用正規表示式,把所需資料取出

雖然第九欄已經包含了我們想要的資訊了,但總是不很滿意,因為他還是一段文字而非一個數字。因此,我們要用另一個的函數:REGEXTRACT,把我們想要的數字部分取出。REGEXTRACT 函數需要兩個輸入,第一個是輸入文字 text,第二個是「正規表示式」,函數會回傳 text 中「第一個」符合正規表示式的子字串。

以上表為例,當輸入的正規表示式為 [0-9],即任何 1 個數字時,以輸入字串為例,會傳回第一個數字 1。當輸入表示式為 [0-9]+,即表示 1 至無限多個數字時,則會回傳 1200。同樣的道理,正規表示式也可以用來處理英文字母或其他特殊字元,如上表所示。
因為從 PCHome 取得的字串為 P:16990},我們只要用 [0-9]+ 這個正規表示式,即可把數字部分取出,相關公式如下圖所示。

結語

只要套用以上學到的兩個函數,我們就可以使用 Google 試算表下載 PCHome 上的價格資訊了,這對曾經使用過 Excel 的人並不困難,可以自己在 Google 試算表中練習。 下一篇教學,我們將使用簡單的程式,讓 Google 試算表自動地更新、記錄價格,並在價格更新時寄送 E-mail 給自己。
有興趣的朋友請酌參下篇「用 Google 試算表追蹤網拍商品價格變化 (下) 」。

2 則留言

  1. 回覆
    1. 你好:終於有了,請參考!

      https://lifelab-2015.blogspot.com/2019/01/google-spreadsheet-price-track-2.html

      刪除