文档章节

18行Python代码抢京东神券

早起Python
 早起Python
发布于 05/31 10:06
字数 1126
阅读 101
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

点击上方早起Python』关注

回复送书参与赠书活动!


一、背景介绍

我们经常能看到京东上有满200减100之类的大额神券,但是当自己激动的等在电脑旁,手拿鼠标、眼盯屏幕,等着倒计时慢慢临近,期待抢到自己喜爱的优惠券,然而最终得到的往往是“券已抢完”
为了弥补手速的缺憾,今天我教大家如何用python抢优惠券,让你的“手速”提高数十倍。



二、抓包分析
首先,我用浏览器抓包发现,抢券过程是通过get请求实现的:

请求参数为:

主要就是key值,它是每个优惠券的标志参数,我们有3种方法可以找到它:
  1. 在原网页中:

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代表返回数量。


三、python模拟请求

Key值找到了,下面就可以用requests模拟抢券了,python模拟请求代码如下:

import requestsheader={'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 requestsimport jsonheader={    '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)

展示视频:


除了不能领的,都显示领取成功了:

学会这项技能,再也不怕抢不到券了!
注:本文所述的代码可在早起Python后台回复优惠券获取


本周将送出九本Python相关热门好书,从Python基础到Python爬虫、数据分析、机器学习均有涉及。如果还没有参与的读者后台回复送书即可参与!明天公布名单!


童年的游戏,Python一行代码就能玩


写代码没几天,遇到一堆报错,我该怎么办



本文分享自微信公众号 - 早起Python(zaoqi-python)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

早起Python
粉丝 5
博文 242
码字总数 202879
作品 0
杭州
私信 提问
加载中
请先登录后再评论。
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2
数据库代码辅助工具--MaoCaiJun.Database

MaoCaiJun.DataBase 是一个用于 Microsoft Visual Studio 的数据库代码生成组件。它是基于 xml 文件的代码创建工具,支持sql2000,sql2005,sql2008,access, SQLite MaoCaiJun.Database 数据库...

mccj
2013/02/06
2.5K
1
日志分析平台 - Kibana

Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。 环境要求: ruby >= 1.8.7 (probably?) bundler logstash...

匿名
2013/02/13
11.7W
1
代码检索工具--CodeQuery

CodeQuery 是一个用来搜索 C/C++、Java 源码的索引工具。基于 cscope 和 ctags 构建,使用 cqmakedb 工具来生成 CodeQuery 数据库文件,然后通过 GUI 工具进行查看。 支持搜索:符号、函数、...

匿名
2013/02/25
2.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL的mysql_config_editor总结

mysql_config_editor介绍 mysql_config_editor是MySQL自带的一款用于安全加密登录的工具,可以在一些场合避免使用密码明文,例如,写shell脚本时,不用在为在脚本里面写入明文密码纠结了;也...

osc_k12h8kbw
5分钟前
0
0
Flutter之导url_launcher包提示 A dependency may only have one source.

1、问题 flutter项目在pubspec.yaml导入url_launcher包,然后点击Pub get错误提示如下 F:\flutter_sdk\flutter\bin\flutter.bat --no-color pub getRunning "flutter pub get" in flutter_1......

osc_1upwl8ju
6分钟前
0
0
Flutter之运行提示Could not update files on device: Connection closed before full header was received

1 问题 运行flutter app提示错误如下 Performing hot restart...Syncing files to device MIX 3...Could not update files on device: HttpException: Connection closed before full head......

osc_sfm9hgdb
7分钟前
0
0
Flutter之点击按钮打开百度链接

1 需求 点击按钮,打开百度链接 2 代码实现 import 'package:flutter/material.dart';import 'package:url_launcher/url_launcher.dart';void main() { runApp(MyApp1());}class ......

osc_vuza8uho
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部