天天看點

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

購物節真的便宜嗎?

月薪上萬的白領們為了2塊5毛錢的優惠券起早貪黑,也是堪稱人類迷惑行為大賞了……

問題是,你以為自己真的賺到了?

商品“明降暗升”的傳言早有耳聞:很多商品在雙十一之前早早地把價格調高,加上優惠之後也不過就是跟以前的原價相當。讓不知情的消費者在心理上感覺占了便宜。

這個傳言是不是真的,很好判斷,隻要定期去通路商品頁面,記錄價格就可以。不過一般人也沒閑工夫這麼去做。

于是,我用 Python 做了一個可以定時監控商品的小工具,可以幫你監控想要關注的商品。

工具完成之後,我們随機挑選了幾個商品作為測試,結果就有一個中招了……(真的是随便選的):

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

這款保暖背心産品,之前标價 39.9元,到11月之後卻突然調價為 49.9元,并标注上了“雙11狂歡價”,也就是原價……

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

代碼實作:

識别套路的代碼其實并不複雜,主要就2點:

1. 首先要設定你要監控的商品位址,通過 requests 庫擷取商品資訊。

import requests              url = '商品連結位址'              r = requests.get(url)
           

對于這點來說,不同的網站的情況會有不一樣,有的網站直接可以擷取,有的需要增加一些 headers 資訊;有的内容就在 HTML 頁面上,有的則是通過 API 接口傳遞資料;甚至還有的網站發現你是機器請求時,會給你一個假的價格……

我們的代碼裡以 天貓、蘇甯、京東、拼多多 4個平台做為示例,具體差别可以閱讀代碼。

2. 能抓到價格是第一步,我們還需要能定時抓。

Windows 平台上可以通過 任務計劃程式 來定時執行你的 py 腳本;Linux 或 Mac 則使用 crontab 功能。這裡不贅述,可以網上搜下關鍵字。

有這兩步,就可以起到定時監控商品價格的效果了。為了便于檢視,我們還可以增加一步:

3. 用 matplotlib 或者 pyecharts 等繪圖庫繪制出商品價格時間變化折線圖。

我們本次工具中選擇了後者。

如果你要想使用我們這個工具,隻需要按照代碼中 goods.csv 檔案裡的格式,添加你要監控的商品連結,然後按文檔中的說明加到對應系統的定時任務裡就可以了。

此外,我們還制作了一個小的頁面工具,可以讓你在一個頁面中同時搜尋上述四家平台的相同關鍵字産品,真正的貨比“三”家:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

這個其實也很簡單,就是用 iframe 去嵌入不同家的搜尋頁即可。

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

薅大額優惠券

除了假降價外,我們經常能看到電商有發滿200減100之類的大額神券,但是當自己激動的等在電腦旁,手拿滑鼠、眼盯螢幕,等着倒計時慢慢臨近,期待搶到自己喜愛的優惠券,然而最終得到的往往是“券已搶完”

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

為了彌補手速的缺憾,今天我教大家如何用python搶優惠券,讓你的“手速”提高數十倍。

首先,我用浏覽器抓包發現,搶券過程是通過get請求實作的:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

請求參數為:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

主要就是key值,它是每個優惠券的标志參數,我們有3種方法可以找到它:

  1. 在原網頁中:
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

data-key的值即為上述的key值,我們可以用selenium從原網頁擷取key值,這種方法隻能用selenium操控浏覽器獲得key值。

2.抓包擷取傳遞key值的資料接口:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

接口位址:

https://a.jd.com/indexAjax/getCouponListByCatalogId.html?&catalogId=134&page=1&pageSize=9&_=1588425128493
           

每頁傳回9個優惠券資訊,page代表頁碼,pageSize代表傳回數量。

Key值找到了,下面就可以用requests模拟搶券了,python模拟請求代碼如下:

import requests              header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0?',              'Referer':'https://a.jd.com/',              'Cookie': '寫入你的cookie'}              key = '0271DFD6890D3B60ACB8BA8A9E49BEB17FE8E6323A36834B63FE69E95D38088EFCFCC41CEDA463F657AC10A29B05CD8C80317528B28221B996820855DF2962B519E4BCD69F2FAD2A6A0C71D95C08EC37657F57BE5FF35205CD6EB7B98375482F'              session = requests.session()              url1 = 'https://passport.jd.com/loginservice.aspx?&method=Login&_=1588432511753'              response1 = requests.get(url1, headers=header)
           
url2 = 'https://a.jd.com/indexAjax/getCoupon.html?callback=jQuery708242&key={0}&type=1&_=1588433465288'.format(key)              header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0?',              'Referer':'https://a.jd.com/',              'Cookie': '寫入你的cookie'}              response2 = requests.get(url2, headers=header)
           

我把代碼分成了兩部分,領券是由第二段代碼實作的,那麼為什麼要用第一段呢?

其實這是一種反爬措施,就是領券之前要先進行驗證,讓伺服器知道這是哪個使用者在領券。

第一段代碼的傳回結果為:

{"Identity":{"Unick":"小笨鳥","Name":"jd_100000000","IsAuthenticated":true}}
           

第二段代碼的傳回結果為:

jQuery708242({"code":"999","success":true,"message":"領券成功"})
           

将這兩段代碼合成一塊就是這次搶大額優惠券的代碼了。

以上介紹的隻是如何用python實作普通優惠券的領券過程,但我們要搶的券都是有倒計時的,是以,要加循環并檢測的功能,并在倒計時快結束了的時候循環運作程式:

while True:              response2 = requests.get(url2, headers=header)              response2.encoding='utf-8'              if '領券成功' in response2.text:              break
           

最後,展示一下批量領取優惠券的過程,代碼如下:

展示視訊:

除了不能領的,都顯示領取成功了:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

學會這項技能,再也不怕搶不到券了!

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

2684億銷售額,是真是假?

去年雙11天貓官方公布了成交額為2684億元,成功重新整理了自己創下的商業紀錄。按理說大家已經習慣了逐年增長,沒想到由于過于完美,引發網友提出質疑。

滑動圖檔浏覽 or 點選檢視大圖

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

我們且不評論是真是假,先想想我們能幹點什麼呢?

利用Python進行拟合并預測

我們在Python中可以利用numpy求解多項式以及多項式拟合。

嘗試用numpy的polyfit函數進行拟合,并作圖。

代碼如下:

import matplotlib.pyplot as plt

import numpy as np

x = np.array([year for year in range(2009,2019)])

y = np.array([0.5,9.36,52,191,352,571,912,1207,1682.69,2135])

z1 = np.polyfit(x, y, 3) # 用3次多項式拟合

p1 = np.poly1d(z1)

yvals=p1(x)

plot1=plt.plot(x, y, '*',label='實際銷售額')

plot2=plt.plot(x, yvals, 'r',label='拟合銷售額')

plt.xlabel('年份')

plt.ylabel('銷售額(億)')

plt.legend(loc=4) # 指定legend的位置

plt.title('2009-2018淘寶雙十一銷售額拟合曲線')

plt.figure(figsize=(10, 10))

plt.show()

print('拟合多項式:',p1) #列印拟合多項式

p1 = np.poly1d(z1)

print("-"*40)

print('2019年預測值:',p1(2019))  #列印預測值

運作結果:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

利用三次多項式預測的資料與公布的結果确實很相近。

我們繼續搞事情。

将今年2019年的2684億導入,預測一下後面三年:

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

按照網上的陰謀論,後面幾年的資料應該如此。

看了網絡上的好幾篇文章,衆說紛纭。作為一個技術er,就不去對此事做評價了。

網絡大衆對此事的看法到底如何?不妨看下騰訊科技發起的一個投票。

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路

大衆的看法就像這個投票。

除了以上這些,購物節的時候你可能還會遇到各種新的套路,最好的應對的辦法就是保持理性消費,還有學門Python,技術攻防!

價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路
價格先升後降?薅不着的大額優惠券?造假銷售額?Python幫你一一識破購物節套路