购物节真的便宜吗?
月薪上万的白领们为了2块5毛钱的优惠券起早贪黑,也是堪称人类迷惑行为大赏了……
问题是,你以为自己真的赚到了?
商品“明降暗升”的传言早有耳闻:很多商品在双十一之前早早地把价格调高,加上优惠之后也不过就是跟以前的原价相当。让不知情的消费者在心理上感觉占了便宜。
这个传言是不是真的,很好判断,只要定期去访问商品页面,记录价格就可以。不过一般人也没闲工夫这么去做。
于是,我用 Python 做了一个可以定时监控商品的小工具,可以帮你监控想要关注的商品。
工具完成之后,我们随机挑选了几个商品作为测试,结果就有一个中招了……(真的是随便选的):
这款保暖背心产品,之前标价 39.9元,到11月之后却突然调价为 49.9元,并标注上了“双11狂欢价”,也就是原价……
代码实现:
识别套路的代码其实并不复杂,主要就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 文件里的格式,添加你要监控的商品链接,然后按文档中的说明加到对应系统的定时任务里就可以了。
此外,我们还制作了一个小的页面工具,可以让你在一个页面中同时搜索上述四家平台的相同关键字产品,真正的货比“三”家:
这个其实也很简单,就是用 iframe 去嵌入不同家的搜索页即可。
薅大额优惠券
除了假降价外,我们经常能看到电商有发满200减100之类的大额神券,但是当自己激动的等在电脑旁,手拿鼠标、眼盯屏幕,等着倒计时慢慢临近,期待抢到自己喜爱的优惠券,然而最终得到的往往是“券已抢完”
为了弥补手速的缺憾,今天我教大家如何用python抢优惠券,让你的“手速”提高数十倍。
首先,我用浏览器抓包发现,抢券过程是通过get请求实现的:
请求参数为:
主要就是key值,它是每个优惠券的标志参数,我们有3种方法可以找到它:
-
在原网页中:
data-key的值即为上述的key值,我们可以用selenium从原网页获取key值,这种方法只能用selenium操控浏览器获得key值。
2.抓包获取传递key值的数据接口:
接口地址:
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的爬虫与数据分析之路】
import requests
import json
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':'写入你的cookie'
}
for i in range(3):
#获得key值
url='https://a.jd.com/indexAjax/getCouponListByCatalogId.html?callback=jQuery8020514&catalogId=134&page={0}&pageSize=9&_=1588487277055'.format(i+1)
response = requests.get(url, headers=header)
items=json.loads(response.text[14:].replace(')', ''))
for key in items['couponList']:
key=key['ruleKey']
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'}
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)
response2.encoding = 'utf-8'
print(response2.text)
展示视频:
除了不能领的,都显示领取成功了:
学会这项技能,再也不怕抢不到券了!
2684亿销售额,是真是假?
去年双11天猫官方公布了成交额为2684亿元,成功刷新了自己创下的商业纪录。按理说大家已经习惯了逐年增长,没想到由于过于完美,引发网友提出质疑。
滑动图片浏览 or 点击查看大图
▼
我们且不评论是真是假,先想想我们能干点什么呢?
利用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)) #打印预测值
运行结果:
利用三次多项式预测的数据与公布的结果确实很相近。
我们继续搞事情。
将今年2019年的2684亿导入,预测一下后面三年:
按照网上的阴谋论,后面几年的数据应该如此。
看了网络上的好几篇文章,众说纷纭。作为一个技术er,就不去对此事做评价了。
网络大众对此事的看法到底如何?不妨看下腾讯科技发起的一个投票。
大众的看法就像这个投票。
除了以上这些,购物节的时候你可能还会遇到各种新的套路,最好的应对的办法就是保持理性消费,还有学门Python,技术攻防!