项目已经上传到 GitHub —— coupon

某东双十一,图书有优惠券,早上十点抢,瞬间没了,很气。直接用了一个暴(hen)力(sha)的方法,仅供学习Requests

参数获取


要实现发送请求抢券,需要获取券的URL,并定制请求头Request Headers

下面所有参数都来自Chrome的开发者工具。大多浏览器都有开发者工具,可以按需选择

准备步骤:

  1. 登录网站
  2. 进入抢券页面
  3. 打开开发者工具(Chrome的快捷键是F12)
  4. 切换到Network栏

获取券的URL

在上面准备步骤的基础上,点击想要抢的券,这时Name栏底部会出现一个新的链接,点击这个链接,而我们需要的参数就来自Header

复制Request URL

https://act-jshop.jd.com/couponSend.html? ......

获取Cookie

也是在上面这个页面中,下翻在Request Header中,有一个Cookie的参数,复制下来

ipLoc-djd=1-72-2799-0; ipLocation=%u5317%u4EAC; areaId=1; ......

获取券的Referer

同上,复制Referer参数

https://sale.jd.com/act/hznk5FbYfOTiEp.html

Requests模块


对于Requests模块的深入学习,直接去翻文档

这里只举例说明一些抢券程序需要使用的方法

get方法

导入Requests模块

>>> import requests

尝试获取某个网页。本例子中,我们来获取 Github 的公共时间线

>>> r = requests.get('https://github.com/timeline.json')

现在有一个名为rResponse对象。可以从这个对象中获取相应内容

>>> r.text
u'[{"repository":{"open_issues":0,"url":"https://github.com/...

如果你想为请求添加HTTP头部,只要简单地传递一个dictheaders参数就可以了

例如,指定User-Agent

>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'User-Agent': 'Mozilla/5.0'}

>>> r = requests.get(url, headers=headers)

会话对象Session

会话对象让你能够跨请求保持某些参数。它也会在同一个Session实例发出的所有请求之间保持cookie

我们来跨请求保持一些cookie

s = requests.Session()

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")

print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

任何你传递给请求方法的字典都会与已设置会话层数据合并。方法层的参数覆盖会话的参数

不过需要注意,就算使用了会话,方法级别的参数也不会被跨请求保持。下面的例子只会和第一个请求发送cookie,而非第二个

s = requests.Session()

r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'

r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

如果你要手动为会话添加 cookie,就使用Cookie utility函数

session.cookies = cjrequests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

这个函数把一个字典转为CookieJar并返回,我们再把这个CookieJar设置给Session

脚本实现


目录结构

coupon/
__init__.py
cookie.txt
main.py
  1. 将复制的cookie复制到cookie.txt文件中

    ipLoc-djd=1-72-2799-0; ipLocation=%u5317%u4EAC; areaId=1; ......
  2. 写一个把cookie.txt转为字典的函数

    def get_cookie():
    with open("cookie.txt") as f:
    cookies={}
    for line in f.read().split(';'):
    name,value=line.strip().split('=',1)
    cookies[name]=value
    return cookies
  3. 配置参数

    user_agent = 'Mozilla/5.0 ......'
    couponUrl = 'https://act-jshop.jd.com/couponSend.html? ......'
    referer = 'https://sale.jd.com/act/hznk5FbYfOTiEp.html'
  4. 声明一个Session对象,并将参数赋值给他

    session = requests.Session()
    session.headers['User-Agent'] = user_agent
    session.headers['Referer'] = referer
    session.cookies = requests.utils.cookiejar_from_dict(get_cookie())
  5. 设置一个while(True)的循环,将预定时间和当前时间比较,如果相等,就发送请求

    while (True):
    # 当前时间
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

    # 如果到预定时间就开始发送请求,然后打印结果
    if now == scheduled_time:
    r = session.get(couponUrl)
    print(r.text)
    break

完整代码


把关键代码贴一下

import requests
import datetime

# 抢券的时间
scheduled_time = "2017-10-29 14:38"
# 券的URL
couponUrl = "https://act-jshop.jd.com/couponSend.html?callback=jQuery3358743&roleId=8620885&key=b832a574abe84874b960c056c3ac6c6d&_=1509248591553"
# 券的Referer
referer = "https://sale.jd.com/act/hznk5FbYfOTiEp.html"
# 浏览器及版本
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'

# 将cookie转为字典
def get_cookie():
with open("cookie.txt") as f:
cookies = {}
for line in f.read().split(';'):
name, value = line.strip().split('=', 1)
cookies[name] = value
return cookies


# 配置Session的参数
session = requests.Session()
session.headers['User-Agent'] = user_agent
session.headers['Referer'] = referer
session.cookies = requests.utils.cookiejar_from_dict(get_cookie())


# 开始抢券
def getCoupon():
print('等待抢券中......')
while (True):
# 当前时间
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

# 如果到预定时间就开始发送请求,然后打印结果
if now == scheduled_time:
r = session.get(couponUrl)
print(r.text)
break


if __name__ == '__main__':
getCoupon()

运行


直接在命令行运行

python main.py

看见上面这几个字气不气???

后记


终于抢到券了,但是。。。

最后一天突然券的数量变多了,完全不用抢

这。。。骗子!

不过看到这行字还是挺开心的

有些时候要同时抢几张券,所以把参数改成了列表

# 券的URL
requestUrls = ["https://act-jshop.jd.com/couponSend.html?callback=jQuery2891171&roleId=8781460&key=48b40c64619a4bc9a3912c98d5a94fed&_=1510055639531","https://act-jshop.jd.com/couponSend.html?callback=jQuery6218594&roleId=8725660&key=a606cfe7c5b045d1b5e58b43a59fd9b1&_=1510056463018"]

# 券的Referer
referers = ["https://sale.jd.com/act/bD1USlOE8n.html","https://sale.jd.com/act/bD1USlOE8n.html"]

# 如果到预定时间就开始发送请求,然后打印结果
if now == scheduled_time:
for i in range(len(requestUrls)):
session.headers['Referer'] = referers[i]
r = session.get(requestUrls[i])
print(r.text)
break

不过还是抢不过那些专业抢券的人,据说人家是好几十万的电脑,再用加速器选一个距离近的节点,那我等凡人只能欣赏code:16

更多相关文章

  1. 从bash脚本传递参数到python解释器
  2. 是否可以使用argparse来捕获任意一组可选参数?
  3. Python定义函数时,不同参数类型的传递
  4. Python语言特性之1:函数参数传递
  5. python正则表达式匹配时间和IP地址
  6. GetLastInputInfo等价于Linux,用于检测最后的输入时间
  7. jira python oauth:如何获取身份验证的参数?
  8. Python——函数 8、可变长参数
  9. python函数不定长参数

随机推荐

  1. 第15天(就业班) 课程回顾、mysql安装、管
  2. Mysql 创建,授权,删除,修改用户
  3. 创业团队为什么要选择Oracle而不是MySQL?
  4. MySQL 的COUNT(x)性能怎么样?
  5. 在CMD查看Mysql数据时出现中文乱码
  6. 一个mysql数据库的问题啊,我都摸索两天了
  7. 用delphi5修改sql server2000出现“键列
  8. MySQL存储引擎中的MyISAM和InnoDB
  9. 在C#中运用 SQLite
  10. 关与批处理的问题 一个批处理调用SQLplus