如何取得商品的市場訂價?實作懶人爬蟲,不會寫 code 也能行!

Peter Hao-Cheng Wu
AsiaYo Engineering
Published in
7 min readAug 3, 2018

作為一個平台商業模式,某些情境下,商品價格會是驅動使用者下單的重大要素。

舉例來說,同一間旅館房間的價格,若不同 OTA (Online Travel Agency e.g. Agoda, Booking.com, Expedia, etc. ) 價格有落差,無論是使用比價網站,或是精明地在不同訂房平台比價,使用者都會傾向在最便宜的平台下訂(哪有買貴的道理!)。

所以對平台方來說,搜集同樣商品的訂價資訊、盡可能減低與其他平台價格落差,就成了重要之務。

優化訂價競爭力的目標與策略

通常 developer resource 非常有限且緊繃,PM 就得想辦法用無痛懶人的方式,取得上述資料。一方面是能夠簡單驗證專案與問題重要性,一方面是不需勞煩開發者,動用他們的資源以快速得到結果。

那時候設定目標是

1. 提供業務端「需進行重新訂價的旅宿清單」
2. 提供管理階層「現行線上旅宿與其他 OTA 的訂價狀況」

所以產出必須達成以下條件:

1. 能取得旅宿的訂房服務提供者、物件名稱、與其對應價格
2. 上述 task 可以自動化定期產出,減少人工作業成本

綜上所述,符合簡單快速原則解法是:

其實只要把比價網站的資料爬過來就好了嘛!

懶。

懶人爬蟲的實作

以 Google Spreadsheet 函式,取得網頁資料

剛好平常沒事會去玩 Google Spreadsheet 的函式,知道 importxml 能透過在函式中定義 xpath 路徑,把網頁的資料 load 到 Google 的試算表中。

執行作法這篇文章《無痛爬梳自己來,用 Google Spreadsheet 爬取網頁資料》講得非常清楚,這裡就按下不表。

這裡主要想分享,因為有些網頁參數都直接帶在網址裡面,所以可以透過 Google Spreadsheet 來實作帶特定參數網址的任務,相對應 importxml 輸出的資料也會對應變化(因為就等於不同網址了)。這在想要爬取特定日期入住區間的房價,是很有幫助的小方法。

根據設定網址參數,控制 importxml 爬取的網頁網址

大量批次執行 Google Spreadsheet 函式

基本上會用 importxml 跟簡單的 excel/ Google Spreadsheet 函式,就可以達到小量資料爬取目的。但實測過一個試算表通常只要超過 50 個 importxml 同時執行,就會出現 error(應該是 Google 的避免濫用機制),所以下一步就是去解「大量批次執行」的問題,畢竟超過 50 筆資料的應用場景,蠻多的 XD。

我自己有試過:

  1. 同一個試算表,不同 tab 平行執行數個 importxml 函式
  2. 不同試算表,平行執行數個 importxml 函式,再匯入一 master sheet
  3. 不同 account,平行執行數個 importxml 函式
對,崩潰的。

只能說「通。通。不。堪。用

要嘛是一樣會出現大量執行被 block 的狀況,要嘛是想要修改函數寫法或一些邏輯運算的時候,速度會變非常地慢。

十分崩潰。

複製貼上的 Script,讚!

其實 Google Spreadsheet 有 Google App Script 支援,類似 Excel 的 VBA。無論是讀取、修改試算表內容、進行排序與邏輯判斷,或是將重複的任務交由 script 執行,甚至可以串一些 Google Service,都是 Google App Script 的守備範圍。之前有做過地址清理的 project,就可以把 Google Geocoding API 的一些功能放到 Script 裡面使用(準確度不怎麼樣就是了)。

我寫了一支 Script 來執行重複的工作,概念是這樣的:

1. 一張試算表,只有一個 importxml 函式
2. 將網址交由該 importxml 執行,並將執行後的結果送到指定儲存格
3. 重複執行以上迴圈,直到所有的網址都被執行完畢、取得資料

附上範例試算表本人,有興趣的話可以複製一份去玩玩看。要看原始腳本的可以從試算表的 Menu → “Tools” → “Script Editor” 中查看。

Demo of bulkxml script

針對產出結果,進行訂價分析

有了資料的下一步,就是進行分析,並得出後續 action items 或是商業上的 insight。

前面有說到這個專案,想要達到兩個目標:

1. 提供業務端「需進行重新訂價的旅宿清單」
2. 提供管理階層「現行線上旅宿與其他 OTA 的比價狀況」

所以這邊對應做兩件事:

1. 對資料做邏輯判斷,取出「比價後貴的旅宿」
2. 分析價差的分佈

對資料做邏輯判斷,取出「比價後貴」的旅宿

這部分很簡單,其實就是針對 output 的資料結果,去查找「價格提供者提供」是 AsiaYo,以及其對應價格跟物件名稱。

如果資料輸出的結果順序邏輯很單純,只要拉出最便宜的價格,去做邏輯判斷與排序即可。

因為這個專案的資料表設計,是可以定時批次跑更新與判斷,所以理想上能夠自動化產出有優化價格潛力的旅宿清單給業務單位,進行後續的談價動作。

針對輸出結果,進行運算與邏輯判斷。

分析價差的分佈

只要有價格差異的資料,就可以計算價差百分比,並用樞紐分析表,去畫出一個價差分佈的表格,如下圖(數字都有調亂過)。

有了價差分佈表,一方面可以幫助管理團隊去了解現行平台訂價的狀況(問題重要性),一方面對於優惠/ 折扣活動的計畫,也多少會有些參考價值。

價差分佈表,數字都被調亂過。

可能會踩到的雷

技術實作面

  1. importxml這個函式,只能處理匯入靜態網頁的資料。javascript triggered rendering content 網頁內容,就會抓不到資料。
  2. 如果遇到需要登入的網頁,或是有確認頁之後才 redirect 到主頁的網頁內容,輸出結果也會是 N/A

資料面

  1. 爬取的資料來源可能會有偏誤,好比說競爭者傳送給比價網站的資料有經過刻意減價;或是競爭對手在做優惠活動,爬到的資料比較基準不同,價差分佈表的可參考性會變低。

小結

本篇主要分享使用 Google Spreadsheet 的函式 importxml與 Google App Script 去實作懶人爬蟲的做法,能夠在有限的範圍內取代人工拉取資料,節省作業成本。

另外資料分析,必須能結合商業需求,並確保最後能產出 action items 之後進行實作。

像是本篇的案例中,應還要多去驗證使用者是否有比價行為、業務端在進行商品談價是否有實作上的困難、比價專案營收成長最大的瓶頸是流量 or 轉換率等問題。

參考資料

如果你喜歡本篇分享,歡迎拍手/ 分享給我鼓勵。同時也推薦 AsiaYo Engineering Blog 裡面有許多好文分享!

--

--