源码记录如下:

#!/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抢票相关推荐

  1. Python + Splinter 12306抢票

    临近春节和期末放假,很多小伙伴也开始关注起来了12306的放票与抢票,学习python之余,敲一个小的demo,如果能帮到人成功抢到票,那便是最好不过的了.这个小的脚本完成过程中,做了很多的调试,力求 ...

  2. 通过python实现12306抢票

    铁路12306抢票系统 ​ #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过splinter刷12306火车票 进 ...

  3. 12306抢票脚本 python_如何使用Python实现12306抢票?摆脱无票可买的窘境

    前言 十一已经过去一个星期了,下一个假期就是元旦啦,每一次假期购票都得抢到"头破血流",所以小编经历过这次十一之后就在想做一个抢票小助手,经过几天的构思后,终于写了出来. 一.爬虫 ...

  4. python开发12306抢票_如何利用 Python 实现12306抢票?

    生苦短,我用 python. 作为一种"胶水语言",python 为无数码农带来了便利:同时,越来越多的 python 工程师被标榜为"高薪党":"全 ...

  5. Python操作12306抢票脚本

    有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西.在了解了一些技术手段,阅读了一些大神的博文 ...

  6. python实现12306抢票以及自动邮件发送提醒付款

    #写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流. 只做技术交流..... 嗯,程序结束后,自己还是得手动付款. 废话不多说,下面就直 ...

  7. 用python实现12306抢票

    用splinter或者selenium都可以实现.这两个库是实现web浏览器自动操作的库.就是模拟人的点击等等一系列操作. 不过先对应你的谷歌浏览器版本下好对应的chromedriver,然后添加好环 ...

  8. python抢票web端_python+Splinter实现12306抢票功能

    本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下 源码记录如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # ...

  9. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  10. Python爬虫实战之12306抢票

    12306抢票 前言 一.爬虫是什么? 二.使用步骤 1.引入库 2.爬虫代码 3.城市编码 4.主程序 总结 前言 提示:用python实现简单的12306余票查询 提示:以下是本篇文章正文内容,下 ...

最新文章

  1. MyBatis 入门
  2. 5G NR — RAN 的技术演进方向
  3. 053_Result结果
  4. WINCE6.0添加微软简体中文输入法3.0
  5. java 多线程数量_java多线程之计算数量
  6. 网易智慧企业Node.js实践(1) | Node应用架构设计和React同构
  7. 从零开始做一个SLG游戏(二):用mesh实现简单的地形
  8. JS函数表达的几种写法
  9. oracle EXP-00028
  10. 如何用java线程池做分批次查询处理 java线程池ThreadPoolExecutor的使用
  11. 一、软件测试概念和理论
  12. 快手短视频去水印方法
  13. virtualbox窗口和win10窗口切换
  14. nexus5刷机双清 解决手机无限重启
  15. android view淡入淡出,Android ViewPager具有不同的animation,如放大,淡入淡出等
  16. 使用python输出真值表
  17. xlsx文件打不开损坏要如何恢复呢?
  18. 简历翻译中译英多少钱
  19. 信号隔离器在PLC/DCS控制系统的应用
  20. 计算机学业水平考试 高中会考,解读高中学业水平考试与高中会考区别

热门文章

  1. Ubuntu安装酷的桌面监控陈程序Conky
  2. 如何使用南方CASS绘制地形图
  3. 关于CWMP基础(三)----(TR111)DHCP
  4. Windows - 电脑屏幕眼睛保护色的取值
  5. 荐书丨大型网站技术架构演进与性能优化
  6. 挂机宝是服务器还是虚拟主机,挂机宝是云虚拟主机吗
  7. 新浪微博发布文章html,微博网页版如何发布头条文章
  8. Java短信平台实战第二天
  9. 华硕主板前置耳机插孔没有声音怎么办
  10. 求极限简单总结 (基础)