話說最近 Bloomberg 更改了報價頁面,頁面上最新報價的 Class Name 更新增了亂碼!如果讀者嘗試利用早前筆者介紹的方法建立智能秘書,恐怕這回會給 Bloomberg 打敗。但對於有少許程序編寫底子的筆者而言,這次 Bloomberg 的改動也許有點侮辱了筆者以及各編程員的智慧。
筆者的股票監察表建立於 Google Sheets 而股價資料主要來自 GoogleFinance 和 Bloomberg。月初旅行前後開始,筆者發現從 Bloomberg 很多時候都取不到股價。由於 Bloomberg 的股價是利用 XPath 在第三方網站取得的,並不如 GoogleFinance 函數在 Google Sheets 是原始支援,所以起初覺得偶有未能取價的情形也不足為奇。
及後遊日回來,筆者發現取股價的函數沒有一次成功(所以經常顯示筆者今個月股票倉賠了好幾萬元)。於是筆者沒有辦法,只好造訪 Bloomberg 網站看看究竟。
蒲開網站,很明顯的見到版面改動過來。未看原始碼,筆者心中已知道背後的原始碼肯定經過改動,目的就是防止我們這些「網路蛀米蟲」取股價又不看其網頁廣告;看來一些 XPath 工程少不免。資訊提供者往往借改版面更新視聽為名,打壓我們這班在免費資源的窄鏠之中生存的投資人為實。
再利用前文介紹過的方法,Highlight 股價 Inspect Element,筆者發現這回股價的 Class Name 新增了些幾個數字的亂碼
<span class="priceText__1853e8a5">1.16</span>
很明顯這次網頁的改動就是防止一般大眾編程員隨便的擷取股價!在這裡請讓筆者解釋一下。
在以前的 Bloomberg 頁面,股價的原始碼一行是這樣的:
<div class="price">1.16</div>
只要看穿了這個原始碼結構,然後利用 XPath 告訴 Google Sheets 擷取所有在 DIV 標籤內 Class 屬性值為「Price」的內容,就可以輕易取得股價:
=importxml("https://www.bloomberg.com/quote/RW0U:SP","//div[@class='price']")
就算讀者不懂得將上面的一段文字化為 XPath,大概也能理解文字的內容吧!筆者知道坊間其實有些網路小程序,使用家可以在完全不懂編程的情況下擷取網頁資訊(例如股價),其方法就是閱讀用家希望擷取的資訊附近的特徵(DIV 內 Class 屬性為 Price),然後替用家完成編程的部分。所以在從前 Bloomberg 頁面,要取得股價基本上是幼稚園生也能做到的。
好了,現在 Bloomberg 在股價(以及其他資訊)的 Class 值安插了一堆亂碼,以上的方法就不奏效了。為什麼?因為就算讀者根據上面的 screen capture 寫了一下一段 XPath:
=importxml("https://www.bloomberg.com/quote/RW0U:SP","//span[@class='priceText__1853e8a5']")
Google Sheets 在執行 ImportXML 函數時,會重新載入 Bloomberg 頁面,而 Bloomberg 伺服器會在 Class 值重新產生出新的亂碼。結果,ImportXML 函數沒能在新的頁面找到舊的亂碼,回傳結果 #N/A!。利用上述網路小程序擷取股價的話,當然也只有投降了。
但若讀者有少許編程基礎和數據科學的感知,應該不難在新的網頁原始碼找到新的特徵。事實上,筆者認為 Bloomberg 侮辱各位讀者智慧的地方,在於其在新頁面中股價的 Class 值仍然大大隻字寫著 priceText。只要有方法利用 XPath 表達式寫出 Class 值「內含有」(而非「等於」)「priceText」,單憑這點已經完全夠打。
網路資源豐富的今天,要找出如何寫這句其實只需要 30 秒。而答案是:
=importxml("https://www.bloomberg.com/quote/RW0U:SP","//span[contains(@class,'priceText')]")
未知道 Bloomberg 的網路編程員,花了多少時間和資源去修改這個頁面?然後 1 分鐘內就被筆者破解,這故事聽起來有沒有些大衛打到巨人哥利亞的味道?
三十而立,立志追尋「身體健康」(壽)、「心靈富足」(福)、「財務自由」(祿)並存的理想人生。 在網絡上留下成長筆記,記錄這段追夢的心路歷程,盼為日後子孫寫下參考材料,亦望以 Blog 會友,與有志同行之士切磋經驗。
【祿】道高一尺 魔高一丈 Bloomberg 最新股價擷取法
你還可能感興趣的文章
- 【祿】稅局撳錢續集:「雙租族」「半子」慳稅大法Tax Optimization 一門學問果真博大精深,繼去年向稅局改正撳錢後,…
- 【祿】買終身儲蓄保險 30年只儲到一個東歐旅行近日家中一位長輩接到保險公司的函件,信中指出該位長輩一份「已供斷」的儲蓄保險「保…
- 【壽】 筋長一寸 壽長十年 筆者晨早健康習慣大解構所謂「一日之計在於晨」,筆者最近發的幾篇「壽」篇都是早上進行的促進健康好習慣。在…
標籤:
自動化,
個人經驗分享,
財務自由,
Google Sheets
訂閱:
張貼留言 (Atom)
熱門文章
-
近日家中一位長輩接到保險公司的函件,信中指出該位長輩一份「已供斷」的儲蓄保險「保費不足」,需要老人家注資。老人家不明所以,明明多年前已經「供斷」的保單,近十數年來都不用付錢但突然間又要追欠款,遂將函件轉交筆者看過究竟。 供不斷的回魂保單? 筆者一看,發現保單的確...
-
2019 年的第一篇文章,先跟各位讀者報個喜也道個歉:筆者的孩子在今年較早前出世了(一月大 B 贏在起跑線 ?笑),而漫長的無眠夜亦隨即展開,新文章的話恐怕要讓各位讀者更久候了。 無眠夜對男人來說,最傷身體的「陰氣」。陰氣受傷,會讓消化不良、血壓上升,久而久之身體抵抗力...
-
以後每天出門口前,除了看看真的天氣報告決定今天的衣飾,也記得前來本網誌,參考右上方的恆指溫度計,為大市探一探熱,從而決定自己的投資策略吧! 設計「沸騰指數」的緣起,乃是幾個月前一位平時對股票不太感興趣的朋友,問及筆者:「恆指現在 26,000 點了,股...
未知道 Bloomberg 的網路編程員,花了多少時間和資源去修改這個頁面?然後 1 分鐘內就被筆者破解,這故事聽起來有沒有些大衛打到巨人哥利亞的味道?
回覆刪除完全沒有,因為這個大衛智力及收入都比哥利亞高!HAHAHAHAHA
哈哈,以 Bloomberg 整個編程團隊,筆者不可能以智慧和收入超越吧 :)
刪除用亂碼class來阻擋資料擷取?如果真是這樣,這個Bloomberg的程式員沒用過Regular expression吧...這不可能吧,真奇怪...
回覆刪除要對應阻止資料擷取在有經驗的程序員身上只是時間投放的問題。
所以我認為這次 Bloomberg 的做法不是要趕盡殺絕,只是想用最低的成本解決最低層次的 Parsing。即用 1% 資源搞掉也許 40%-50% 的 Traffic。
刪除