python Splinter 12306抢票
源码记录如下:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_#!/usr/bin/env python
# _*_ coding:utf-8 _*_from splinter.browser import Browser
from time import sleep
import os
# from selenium.webdriver.chrome.options import Options
import logging
from log_class import Logger # 需要一个logger库
import sysreload(sys)
sys.setdefaultencoding('utf-8') # 防止由于Unicode编码与ASCII编码的不兼容造成错误class BuyTicket(object):def __init__(self, username, passwd, order, passengers, seatType, ticketType, daytime, starts, ends):# 用户名 密码self.username = usernameself.passwd = passwd# 车次,选择第几趟,0则从上之下依次点击self.order = order# 乘客名self.passengers = passengers# 席位self.seatType = seatTypeself.ticketType = ticketType# 时间格式2018-02-05self.daytime = daytime# 起始地和终点self.starts = startsself.ends = endsself.login_url = 'https://kyfw.12306.cn/otn/login/init'self.initMy_url = 'https://kyfw.12306.cn/otn/index/initMy12306'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'# 浏览器名称self.driver_name = 'firefox' # chrome firefox# 火狐浏览器第三方驱动self.executable_path = os.getcwd()+'/geckodriver' # 获取工程目录下的火狐驱动 chromedriverdef login(self):# 访问登录网址self.driver.visit(self.login_url)# 填充用户名self.driver.fill("loginUserDTO.user_name", self.username)# sleep(1)# 填充密码self.driver.fill("userDTO.password", self.passwd)logbticket.info("请手动输入验证码...")# print('请手动输入验证码...') # 目前没有自动验证码# 循环等待登录,登录成功,跳出循环while True:if self.driver.url != self.initMy_url:sleep(1)else:breakdef start_buy(self):# 这些设置都是必要的# chrome_options = Options()# chrome_options.add_argument("--no-sandbox")# chrome_options.add_argument("--disable-setuid-sandbox")# chrome_options.add_argument("disable-infobars") # 禁用网页上部的提示栏# self.driver = Browser(driver_name=self.driver_name, options=chrome_options, executable_path=self.executable_path)self.driver = Browser(driver_name=self.driver_name,executable_path=self.executable_path)# 设置窗口大小尺寸self.driver.driver.set_window_size(1400, 1000)# 用户登录self.login()# 进入选票网站self.driver.visit(self.ticket_url)try:logbticket.info("购票页面开始....")# print("购票页面开始....")# sleep(1)# 加载查询信息self.driver.cookies.add({"_jc_save_fromStation": self.starts})self.driver.cookies.add({"_jc_save_toStation": self.ends})self.driver.cookies.add({"_jc_save_fromDate": self.daytime})self.driver.reload()count = 0if self.order != 0:while self.driver.url == self.ticket_url:self.driver.find_by_text("查询").click()count = count+1logbticket.info("第 %d 次点击查询..." % count)# print("第 %d 次点击查询..." % count)# sleep(1)try:self.driver.find_by_text("预订")[self.order - 1].click() # 点击第几个“预订”sleep(1.5)except Exception as e: # e是Exception 的一个instance# print(e)# print("预订失败...")logbticket.error(e)logbticket.error("预订失败...")continueelse:while self.driver.url == self.ticket_url:self.driver.find_by_text("查询").click()count += 1logbticket.info("第 %d 次点击查询..." % count)# print("第 %d 次点击查询..." % count)try:for i in self.driver.find_by_text("预订"):i.click()sleep(1)except Exception as e:# print(e)# print("预订失败...")logbticket.error(e)logbticket.error("预订失败...")continue# print("开始预订....")logbticket.info("开始预订....")# sleep(1)# self.driver.reload()sleep(1)# print("开始选择用户....")logbticket.info("开始选择用户....")for p in self.passengers:pg = self.driver.find_by_text(p) # .last.click()pg.last.click()# print("提交订单....")logbticket.info("提交订单....")sleep(1)i = 0while len(self.passengers) > 0:i = i + 1seat_id_string = "seatType_" + str(i)ticket_id_string = "ticketType_" + str(i)self.driver.find_by_xpath('//select[@id="%s"]/option[@value="%s"]'% (seat_id_string, self.seatType)).first._element.click()self.driver.find_by_xpath('//select[@id="%s"]//option[@value="%s"]'% (ticket_id_string, self.ticketType)).first._element.click()# self.driver.select("confirmTicketType", "3")self.passengers.pop()sleep(1)self.driver.find_by_id("submitOrder_id").click()# print("开始选座...")logbticket.info("开始选座...")sleep(1.5)# print("确认选座....")logbticket.info("确认选座....")self.driver.find_by_text("qr_submit_id").click()except Exception as e:# print(e)logbticket.error(e)city = {"深圳": "%u6DF1%u5733%2CSZQ","武汉": "%u6B66%u6C49%2CWHN","随州": "%u968F%u5DDE%2CSZN"}seatT = {"硬卧": "3","软卧": "4","硬座": "1","二等座": "O","一等座": "M","商务座": "9"}if __name__ == '__main__':# 用户名username = "xxxxxxxx"# 密码password = "xxxxxx"# 车次选择,0代表所有车次order = 13# 乘客名,比如passengers = ['丁小红', '丁小明']passengers = ["xxx", "xxx"]# 日期,格式为:'2018-01-20'daytime = "2018-04-05"# 出发地(需填写cookie值)starts = city["xx"] # 武汉# 目的地(需填写cookie值)ends = city["xx"] # 北京# 席别seatType = seatT["二等座"] # 二等座# 票种ticketType = "1" # 成人票logbticket = Logger("bticket.log", logging.DEBUG, logging.ERROR)BuyTicket(username, password, order, passengers, seatType, ticketType, daytime, starts, ends).start_buy()
火狐浏览器的驱动下载地址:https://github.com/mozilla/geckodriver/releases/
logger库文件地址:https://blog.csdn.net/lijing198997/article/details/79813517
python Splinter 12306抢票相关推荐
- Python + Splinter 12306抢票
临近春节和期末放假,很多小伙伴也开始关注起来了12306的放票与抢票,学习python之余,敲一个小的demo,如果能帮到人成功抢到票,那便是最好不过的了.这个小的脚本完成过程中,做了很多的调试,力求 ...
- 通过python实现12306抢票
铁路12306抢票系统 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过splinter刷12306火车票 进 ...
- 12306抢票脚本 python_如何使用Python实现12306抢票?摆脱无票可买的窘境
前言 十一已经过去一个星期了,下一个假期就是元旦啦,每一次假期购票都得抢到"头破血流",所以小编经历过这次十一之后就在想做一个抢票小助手,经过几天的构思后,终于写了出来. 一.爬虫 ...
- python开发12306抢票_如何利用 Python 实现12306抢票?
生苦短,我用 python. 作为一种"胶水语言",python 为无数码农带来了便利:同时,越来越多的 python 工程师被标榜为"高薪党":"全 ...
- Python操作12306抢票脚本
有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西.在了解了一些技术手段,阅读了一些大神的博文 ...
- python实现12306抢票以及自动邮件发送提醒付款
#写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流. 只做技术交流..... 嗯,程序结束后,自己还是得手动付款. 废话不多说,下面就直 ...
- 用python实现12306抢票
用splinter或者selenium都可以实现.这两个库是实现web浏览器自动操作的库.就是模拟人的点击等等一系列操作. 不过先对应你的谷歌浏览器版本下好对应的chromedriver,然后添加好环 ...
- python抢票web端_python+Splinter实现12306抢票功能
本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下 源码记录如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # ...
- python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...
python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...
- Python爬虫实战之12306抢票
12306抢票 前言 一.爬虫是什么? 二.使用步骤 1.引入库 2.爬虫代码 3.城市编码 4.主程序 总结 前言 提示:用python实现简单的12306余票查询 提示:以下是本篇文章正文内容,下 ...
最新文章
- MyBatis 入门
- 5G NR — RAN 的技术演进方向
- 053_Result结果
- WINCE6.0添加微软简体中文输入法3.0
- java 多线程数量_java多线程之计算数量
- 网易智慧企业Node.js实践(1) | Node应用架构设计和React同构
- 从零开始做一个SLG游戏(二):用mesh实现简单的地形
- JS函数表达的几种写法
- oracle EXP-00028
- 如何用java线程池做分批次查询处理 java线程池ThreadPoolExecutor的使用
- 一、软件测试概念和理论
- 快手短视频去水印方法
- virtualbox窗口和win10窗口切换
- nexus5刷机双清 解决手机无限重启
- android view淡入淡出,Android ViewPager具有不同的animation,如放大,淡入淡出等
- 使用python输出真值表
- xlsx文件打不开损坏要如何恢复呢?
- 简历翻译中译英多少钱
- 信号隔离器在PLC/DCS控制系统的应用
- 计算机学业水平考试 高中会考,解读高中学业水平考试与高中会考区别