本抢票软件功能设计分为4个部分:
1.模拟登录
2.自主选座
3.添加邮寄地址和购票人信息
4.软件封装
这里以大麦网的抢票软件为例,网站登录提供三种方法(暂时不考虑通过第三方进行登录),短信登录由于涉及和手机端或者模拟手机端进行通信,不考虑,仅剩下密码登录和扫码登录两种方式,故初步思考实现模拟登录有三种方法。
1.每次登录时手动输入账号密码进行登录
2.软件自动输入账号密码,绕过进度条验证过程
3.软件自动通过储存cookie进行扫码登录
方案一:
在程序实现过程中,发现大麦网有防止刷票的机制,在刷票时如果多次进行刷新,就会让用户重新登录,这种情况是在刷票的同时不允许出现的,故方案一被抛弃。
方案二:
由于不清楚大麦网内部关于爬虫登录的进度条机制,且经过测试发现在selenium下进度条的筛选极为严格,甚至有时候人来拖动都没办法通过,考虑程序算法实现的较难验证的特性,抛弃。
方案三:
扫码登录是一种比较特殊的登录方式,不需要经过进度条验证,这样可以通过保存人的一次登录过程产生的cookie进行重复登录,是一种很好的方法。
源码如下:
def set_cookie(self):
self.driver.get(damai_url)
print("###请点击登录###")
while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
sleep(1)
print("###请扫码登录###")
while self.driver.title == '大麦登录':
sleep(1)
print("###扫码成功###")
pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
print("###Cookie保存成功###")
self.driver.get(target_url)
def get_cookie(self):
try:
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
cookie_dict = {
'domain': '.damai.cn',
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False}
self.driver.add_cookie(cookie_dict)
print('###载入Cookie###')
except Exception as e:
print(e)
def login(self):
if self.login_method == 0:
self.driver.get(login_url)
print('###开始登录###')
elif self.login_method == 1:
if not os.path.exists('cookies.pkl'):
self.set_cookie()
else:
self.driver.get(target_url)
self.get_cookie()
def enter_concert(self):
print('###打开浏览器,进入大麦网###')
self.driver = webdriver.Chrome()
self.login()
self.driver.refresh()
self.status = 2
print("###登录成功###")
需要注意的是,在追踪网站前端的标签时,其名称,标签名时经常更新的,可以通过F12在浏览器中查看对应的标签号进行程序逻辑的修改。
欢迎评论文章,给予宝贵建议,工程提供在github下载学习,请关注作者,共同学习交流。
github工程:https://github.com/sinxuy/Damai