手机端h5网站模板下载,企业网查询官网入口,实体店会员卡管理系统,微信分享接口网站开发 php2019独角兽企业重金招聘Python工程师标准 又是一年#xff0c;马上就要回家过年了#xff0c;还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好#xff0c;求人不如求自己#xff0c;抢票这玩意#xff0c;其实我觉得我也可… 2019独角兽企业重金招聘Python工程师标准 又是一年马上就要回家过年了还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好求人不如求自己抢票这玩意其实我觉得我也可以~ 来来来直接入正题吧! 这里有两种方案一种是基于Selenium2的自动化框架控制浏览器实现另一种方案则是基于Python自身的爬虫package如request,urllib等来实现本文实现第一种方案第二种方案也在摸索中。 实现过程 一、新版12306官网主要页面网址 https://kyfw.12306.cn/otn/resources/login.html
https://kyfw.12306.cn/otn/view/index.html
https://kyfw.12306.cn/otn/leftTicket/init?linktypeiddc二、浏览器驱动信息 这里使用的是chrome浏览器 在此处下载
https://sites.google.com/a/chromium.org/chromedriver/downloads三、初始化必要信息 买票必要信息比如乘车人来往车站车次类型等等 # 乘客姓名
passengers_input xxx
passengers passengers_input.split(,)#乘车日期格式为2019-01-10
from_time 2019-01-31# 城市cookie字典
city_list {sz:%u6DF1%u5733%2CSZQ, #深圳zz:%u90D1%u5DDE%2CZZF, #郑州gz:%u5E7F%u5DDE%2CGZQ, #广州
}
# 出发站
from_station %u5E7F%u5DDE%2CGZQ# 终点站
to_station %u90D1%u5DDE%2CZZF# 车次编号
numbers [Z90,Z190,Z14,Z168,Z98,T124,T370]# 座位类型
seat_type 硬卧#通知邮件
receiver_email xxxxxxxxx163.com注意城市字典是将城市简写和城市代码之间联系起来。如果没有你想要到城市可以在打开12306的查票页面然后打开浏览器的开发者模式输入对应的城市然后查看请求信息。 四、登录功能实现 登录我们需要手动登录扫码或者输入账号都可以。登录后记录session供后面抢票使用
def do_login(self):登录功能实现手动识别验证码进行登录self.driver.visit(self.login_url)sleep(1)# 选择登陆方式登陆print(请扫码登陆或者账号登陆……)while True:if self.driver.url ! self.init_my_url:sleep(1)else:break五、抢票功能实现 核心功能实现通过扫描关键字来确认是否有余票然后实现点击页面进而走向下一步。 current_tr self.driver.find_by_xpath(//tr[datatran number ]/preceding-sibling::tr[1])
if current_tr:if current_tr.find_by_tag(td)[self.seat_type_index].text --:print(无此座位类型出售已结束当前刷票请重新开启)sys.exit(1)else:# 有票尝试预订print(刷到票了余票数 str(current_tr.find_by_tag(td)[self.seat_type_index].text) 开始尝试预订……)current_tr.find_by_css(td.no-bra)[0].click()sleep(1)key_value 1for p in self.passengers:# 选择用户print(开始选择用户……)self.driver.find_by_text(p).last.click()# 选择座位类型print(开始选择席别……)if self.seat_type_value ! 0:self.driver.find_by_xpath(//select[idseatType_ str(key_value) ]/option[value str(self.seat_type_value) ]).first.click()key_value 1sleep(0.2)if p[-1] ):self.driver.find_by_id(dialog_xsertcj_ok).click()print(正在提交订单……)self.driver.find_by_id(submitOrder_id).click()sleep(2)print(正在确认订单……)self.driver.find_by_id(qr_submit_id).click()六、抢票成功后邮件通知自己 一个很简单的功能不过却是必要的避免自己错过 def send_mail(self, receiver_address, content):发送邮件通知# 连接邮箱服务器信息host xxxx.163.comport 25sender xxxxxx163.com # 你的发件邮箱号码pwd xxxxx # 第三方授权登录吗不是登录密码# 发件信息receiver receiver_addressbody h2温馨提醒/h2p content /pmsg MIMEText(body, html, _charsetutf-8)msg[subject] 抢票成功通知msg[from] sendermsg[to] receivers smtplib.SMTP(host, port)# 开始登陆邮箱并发送邮件s.login(sender, pwd)s.sendmail(sender, receiver, msg.as_string())过程演示 执行代码 登录12306网站 抢票成功 等待支付 邮件通知 总结 总的来说是成功的但还不是完全自动化的。不过相比手动抢票还是快很多的。其实网上这种代码很多只不过因为12306网站的更新大多数不能用了我也是在前辈们的基础上修改完成的。想要最新源码的同学可以关注的我公众号回复抢票源码 转载于:https://my.oschina.net/dingxiaoshui/blog/3000044