前言
近来无意中看到一些Python的应用场景——抢购。这的确是一个恰当的应用,因此本文从一个开源项目库来入手分析项目是如何运行的。
结构
解析
入口
1 | if __name__ == '__main__': |
这一段代码很简单:
- 首先输出一段提示,让用户稍后选择预约还送抢购;
- 然后实例化
jd_seckill = JdSeckill()
; - 根据输入选择功能
主功能(预约)
接下来先看一下预约功能,调用了reserve()
,这段代码使用了装饰器,判断是否登录。
1 |
|
可以看到预约、抢购和多线程抢购这些功能都使用了装饰器。
登录判断
1 | def check_login(func): |
这里记录一下`@functools.wraps(fun)的作用,主要因为增加了装饰器的函数其实就变成了另外一个函数,
__name和
doc都发生了变化。因此增加了
@functools.wraps(fun)`之后就可以防止此类情况的发生。
执行步骤:
首先判断self.qrlogin.is_login
是否True
,默认为False
。self.qrlogin = QrLogin(self.spider_session)
会调用QrLogin -> SpiderSession
.
QrLogin()
功能:
- 初始化扫码目录
- 定义二维码文件名称
- 设置session
- 设置默认登录状态为
False
- 刷新登录状态
- 刷新是否登录的状态
- 验证cookie(是否登录)
- 获取登录页面
- 缓存并展示登录二维码
- 通过token获取ticket
- 校验ticket
- 使用二维码登录
session处理
SpiderSession()
这个类功能是为了处理session:
- 初始化
- 定义cookie目录
- 从配置文件获取
user-agent
- 初始化session。
- 初始化session
- 获取并设置header
- 获取
user_agent
- 获取cookie
- 设置cookie
- 从本地加载cookie
- 保存cookie到本地
session的处理这一段代码不太熟悉,之前没有接触过,下面分析一下:
1 | def _init_session(self): |