Hi 你們好,我是張小豬。今天小豬不作 leetcode 題解啦,而是把視線放在一件最近很讓人揪心的事情,那就是新型冠狀病毒。html
小豬不是生物學生或者醫學生,因此對於病毒自己的分析或者相關 paper 閱讀真是無能爲力。不過相信小夥伴們也從其餘渠道瞭解到不少相關的信息了。小豬會注意到這個事情,是由於本身最近兩天看一些社交平臺和朋友圈,一直被這個東西刷屏,那就是...口罩!口罩!口罩!前端
因爲被官方欽點了是一種有效的防護病毒的手段,這種平時相對少見的東西一會兒成了各類公共場合的必需品。相應的,『醫用外科口罩』和『n95口罩』也就一會兒成了風靡一時的詞語。隨之而來的,即是線上和線下的搶購風潮。因而乎在一些社交平臺逐漸出現了各類關於口罩價格瘋漲的評論,以及各式各樣的截圖和吐槽。小豬我的對於這種發國難財的行爲不想作過多評論,因此也沒太上心。git
再發展到今天(22號),小豬看到了各大電商平臺官方發文,大致都是關於「啓動補貼,禁止漲價,違者下架」這些內容展開的。小豬本身其實對於這些電商平臺的官方行爲仍是蠻感動的。不過轉念一想,很是好奇如今真實的情況究竟如何。那就來找找數據看看吧。github
按照以往慣例,這裏應該會出現一個單詞 Python。然而小豬偏不,小豬就要用 JS,哼(纔不是由於小豬不會寫 Python 呢...segmentfault
那麼先看看大致思路吧:(如下凡是涉及到關於平臺自身信息的部分,不會說的太詳細)promise
關鍵字這裏小豬並無想太多,直接就用了『醫用外科口罩』和『n95口罩』。關於電商平臺,小豬根據我的愛好把視角鎖定在了某知名電商平臺,也是官方發文了要控制口罩價格的平臺之一。首先去看了一下請求,發現該平臺的商品搜索列表仍是很容易能拿到的。不過因爲作了 SSR,因此其實拿到的是一段 HTML 代碼。這裏本身寫 parser 有點太不必了,因此小豬直接用了開源的 lib 進行 parse。dom
這裏推薦幾個我之前用過以爲還不錯的 lib 吧,分別是 jsdom、cheerio 和 htmlparser2。這三者若是單純從 parse html 的性能來看,順序應該是 htmlparser2 > cheerio > jsdom。不過因爲 htmlparser2 其實只是一個單純的 parser,因此比另外二者快也是很正常的。另外二者在 parse 的基礎上,增長了不少外圍的功能補充,例如一些選擇器和 dom 操做等。從它們擴展的接口和功能來看,順序應該是 jsdom > cheerio > htmlparser2。因此具體場景下要使用哪個,小夥伴們就自行取捨啦。我這裏是本身寫了幾個特定的相似於 querySelector
的 helper,而後就直接用了 htmlparser2 來進行單純快速的 parse。性能
當咱們處理完以上數據以後,便能獲得一個基於關鍵字的商品列表了。記下來小豬又把視角看到了一個本身經常使用的第三方比價平臺,一樣去看了看請求,發現仍是很容易拿到的。不過其中有一個特殊的 token 看起來比較棘手,由於小豬翻了好久各類請求和 response 內容,都沒有發現這一串 token 的來源。最後無奈的只能使用個人魔法咒語了,『巴拉巴拉 張小豬是最棒(pang)噠』,而後我就驚異的發現這個 token 居然是前端生成的。hmmm...有點意思。而且更有意思的是,爲了讓這一點不那麼容易被識破,這裏前端 encrypt 過程使用的代碼通過了特殊的混淆。一眼望去,滿臉懵逼;二眼望去,更加懵逼。但是,小豬原本就是笨笨的鴨,因此就正好被我發現瞭如何使用。因而最後就愉快的本身生成 token 啦。不是豬年還這麼幸運,嘿嘿嘿 >.<測試
以上步驟都測試完之後,小豬把它們封裝成了一些簡單的 job,而後根據命令行參數去獲取關鍵字和頁面數量。這時候又怕請求太頻繁會被 ban IP,因而特地讓一個個 promise 又串行又 delay。爲了 20 頁的數據愣是等了一小會才跑完,趁機去偷吃了一點零食,嘿嘿嘿,是不會長胖的零食喲。spa
終於到了這個激動人心的時刻啦,接下來就打算看看獲得的一堆 JSON 數據裏有沒有什麼有意思的信息。例若有沒有商家瘋狂漲價卻沒有被下架呀,哈哈哈,小豬真是太壞啦。這裏仍是再說一下此次收集的商品列表,是來自某知名電商平臺的『醫用外科口罩』和『n95口罩』這兩個關鍵字,搜索結果的前 20 頁。那麼接下里咱們一塊兒來康康吧。
首先是一個意外發現。在分析數據的過程當中,小豬才第一次知道本身平時經常使用的這個知名電商平臺,在搜索結果列表裏實際上是有廣告的。而且不是對外的廣告,是一些店鋪的商品,看起來就和其餘搜索結果同樣,除了兩個很不引人注目的小字『廣告』。盲猜也是關鍵字競價排名吧,不過這不是今天的重點,因此管他呢,開心就好。如下是收集到的數據中廣告的佔比,大概能看出這個平臺對於這種混淆性很強的廣告仍是很剋制的:
接下來小豬把重點放在了商品的當前價格和歷史價格的對比上。因爲歷史價格可能有一些由於活動致使的浮動,因此取了中位數。而當前價格,原本小豬想用最近 5 天的最高價格的,不過想一想以爲太壞了,響應號召、知錯就改是值得鼓勵的,因此就仍是隻用了最新價格。不過結果仍是蠻刺激的,兩個關鍵字的商品搜索結果裏,當前價格對比歷史價格中位數的最大漲價幅度分別達到了 400% 和 1000%。感受有點刺激呀。什麼?你不相信?我從結果裏找了兩個例子供小夥伴們感覺一下:
那麼是否有反其道而行之的良心商家呢,例如價格反而比歷史中位數更低的。固然是有的啦,更甚者有當前價格對比歷史中位價達到了 5 折的呢。不太小豬去看了一下,也不是最近一兩天降的價。不過仍是爲不漲價而點贊吧。總的價格狀況以下圖:
從比例來看,狀況彷佛沒有在社交平臺看到的那麼糟糕,多是電商平臺的公告確實起到了必定的做用吧。雖然仍是有部分漲價商品,而且其中部分漲價幅度仍是挺大的。不過超過半數的仍舊仍是維持住了價格。小豬我的對於大幅漲價行爲不作過多評價,因此這裏也不會給出商家和商品信息。
到這一步後,小豬原本以爲彷佛都還挺正常,準備對商家們點贊。不過無心中回看了一下上面n95口罩的數據,平價商品 + 漲價商品 + 跌價商品爲何一共才 266 個,我不是取了 600 個商品麼。難道小豬穿越了?摸摸豬鼻子,感受事情並不簡單。
從新回看以前的數據,小豬發現了一個頗有意思的事情。有大量商品是新上線的商品,根本沒有歷史數據,因此天然不屬於價格變更的範圍。而且也有少部分商品它們的歷史價格記錄只有最近的一兩天,也就是電商平臺官方公告以前剛剛上架不久。它們的比例以下圖:
從統計結果來看,搜索結果前 20 頁的商品裏,無歷史價格記錄的商品佔了一半以上,結合只有 3 天內歷史價格的商品,總和分別達到了 60% 和 72%。而且,單看廣告位的那些商品,無歷史價格記錄的達到了 2/3。那麼爲何會一會兒蜂擁出這麼多新上架的商品呢?並且時間點仍是這麼巧合的在各大電商平臺發文要求口罩不能漲價,不然下架的背景下。
以上只是基於某知名電商平臺的搜索前 20 頁商品的簡單數據分析,結果彷佛有點回味無窮。從好的角度出發,多是出現了這樣的病情後商家們主動上架和提供了更多的相關商品。從壞的角度出發,也多是爲了繞過電商平臺的漲價監控。具體的話相信小夥伴們也會有本身的想法。
這裏並不打算給出具體的商家和商品數據,由於小豬也並非針對他們。只是想根據真實的數據來看看電商平臺的相關公告,以及口罩目前的具體價格狀況而已。代碼還在小豬的本地 repo,就先放個圖吧。若是有小夥伴須要的話,後續小豬也整理一下把代碼放到 github。這是小豬的 github profile,能夠關注防迷路喲。
寫完文章的次日早上一醒來,發現武漢被封城了。哎,感到莫名的難過。
加油武漢,天佑中華!