基于SeleniumChrome浏览器实现。
默认抢票类型为普通票,硬座。需求多的话可以在源码里改,我写的注释挺详细。
复制粘贴就能使用,2019年8月13日 测试可用。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait,Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time,sysclass robTickets(object):def __init__(self):'登录页、主页、抢票页'self.login_url="https://kyfw.12306.cn/otn/resources/login.html"self.initmy_url="https://kyfw.12306.cn/otn/view/index.html"self.search_url="https://kyfw.12306.cn/otn/leftTicket/init"self.driver = webdriver.Chrome()self.hastictket=Falsedef run(self):self._login()self._order_ticket()def _login(self):'登录页面手动登录'self.driver.get(self.login_url)time.sleep(1)self.driver.find_element_by_class_name("login-hd-account").click()username = input("请输入 用户名/手机号/邮箱 :")password = input("请输入 密码:")print("请在浏览器中完成验证码并确认")self.driver.find_element_by_id("J-userName").send_keys(username)self.driver.find_element_by_id("J-password").send_keys(password)WebDriverWait(self.driver,1000).until(EC.url_to_be(self.initmy_url))print("登录成功!")self._wait_input()self._order_ticket()def _wait_input(self):self.from_station=input("请输入出发地:")self.to_station=input("请输入目的地:")self.depart_time=input("出发时间(yyy-mm-dd):")def _order_ticket(self):'选票页面手动选票,自动抢票'self.driver.get(self.search_url)self.url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%s,BJP&ts=%s,SHH&date=%s&flag=N,N,Y"%(self.from_station,self.to_station,self.depart_time)self.driver.get(self.url)self.order_url="https://kyfw.12306.cn/otn/confirmPassenger/initDc"WebDriverWait(self.driver,60).until(EC.presence_of_all_elements_located((By.XPATH,"//tbody[@id='queryLeftTable']/tr")))tr_list = self.driver.find_elements_by_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")print("共搜索到 "+str(len(tr_list))+" 条结果!")self.passengers = input("请输入乘客姓名(多个乘客的话,用英文逗号隔开):").split(",")self.trains = input("请输入车次(多个车次,用英文逗号隔开):").split(",")# 循环检票TNT = int(input("抢票监测时间(秒):"))st = time.time()i=0while time.time()-st<TNT:for tr in tr_list:train_number = tr.find_element_by_class_name("number").textif train_number in self.trains:self.hastictket=Trueticket = tr.find_element_by_xpath(".//td[last()-3]").textif ticket == "有" or ticket.isdigit():print(train_number+" "+ticket+" 票")tr.find_element_by_class_name("btn72").click()self._money()if self.hastictket==False:print("未查询到相关班次!")self.driver.quit()sys.exit()# 未找到票,刷新界面self.driver.refresh()tr_list = self.driver.find_elements_by_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")WebDriverWait(self.driver, 60).until(EC.presence_of_all_elements_located((By.XPATH, "//tbody[@id='queryLeftTable']/tr")))i+=1print("抢票第 %d 次"%i)def _money(self):'支付界面自动下单'WebDriverWait(self.driver, 60).until(EC.url_to_be(self.order_url))WebDriverWait(self.driver, 60).until(EC.presence_of_all_elements_located((By.XPATH, "//ul[@id='normal_passenger_id']//li")))lis = self.driver.find_elements_by_xpath("//ul[@id='normal_passenger_id']//li")x = 0for li in lis:# 遍历联系人寻找乘客if li.find_element_by_xpath("./label").text in self.passengers:li.find_element_by_xpath("./input[@class='check']").click()x += 1WebDriverWait(self.driver, 1000).until(EC.visibility_of_element_located((By.ID, "seatType_%d" % x)))# 此处value为1代表硬座,修改此处可以更改票的类型selectTag = Select(self.driver.find_element_by_id("seatType_%d" % x))selectTag.select_by_value("1")print("正在提交订单,请等待60s...")self.driver.find_element_by_id("submitOrder_id").click()WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.ID, "qr_submit_id")))# 提交并检查订单,此处限时60sstart = time.time()while time.time() - start < 60:try:self.driver.find_element_by_xpath(r"//a[@id='qr_submit_id']").click()except:if self.driver.current_url != self.order_url:print("订单已完成,请打开12306完成支付!")time.sleep(1000)else:if self.driver.find_element_by_xpath(r"//div[@class='tit']").text == "下单成功。":print("订单已完成,请打开12306完成支付!")self.driver.get("https://kyfw.12306.cn/otn/view/train_order.html")time.sleep(1000)else:time.sleep(0.1)if __name__=='__main__':print("本程序默认抓取的是普通票,硬座,想实现更多功能请在源码里修改")spider = robTickets()spider.run()

运行截图:

python 100行代码实现 12306 自动抢票相关推荐

  1. python爬虫(三)12306自动抢票--- selenium

    往期目录 一. python爬虫入门篇https://blog.csdn.net/weixin_64050468/article/details/130501830?spm=1001.2014.300 ...

  2. 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具,受大极大的关注.铁路售票的管理者都主要考虑降低成本,提升售票服务满意度.一年一度的春运和节假日出行高峰期,给众多的出行群众者带来了极大的烦恼, ...

  3. Python 8行代码模拟鼠标自动删除微信收藏

    上回我们提到了用 pyuserinput 进行模拟键盘鼠标操作,结果发现很多同学都回复无法安装成功,即便安装成功了还是存在很多问题.确实,pyuserinput存在不少问题,包括其安装的pymouse ...

  4. python实现12306自动抢票脚本-splinter结合chrome浏览器

    ---------------------------------------------------------------------------------------------------- ...

  5. python github 12306 文贤平_GitHub - itsmartkit/12306-Ticket-Booking: 12306自动抢票系统(2020-01-10)...

    基于Python的12306自动订票系统 系统功能 1.余票监控:发现余票自动下单 2.自动打码:采用第三方免费接口/本地识别算法两种模式,自动验证图片验证码 3.小黑屋:发展有余票但是下单失败的车次 ...

  6. python实现云服务器上12306自动化抢票功能

    本文将分为几大模块讲解python服务器上12306自动化抢票功能: 一.云服务器的安装与配置 1.1 云服务器与个人主机不同,不受时间.场所等条件的限制,将python代码运行在云服务器上可以实现真 ...

  7. Python大牛带你实现12306全自动抢票,学完后春运回家抢票无忧

    随着2018年春节的脚步日益临近,归心似箭的人们都希望能尽快赶回家中.中国人回家过年,是每个人一年中最重要的事,无论你离家远近.在所有的交通工具中,承担着最大客流量的交通工具,毫无疑问是火车.中国庞大 ...

  8. 12306自动抢票及自动识别验证码功能(一)

    其实12306抢票之前有做过,近年来随着技术的发展AI的兴起,我也随波逐流,研究了下python深度学习,来实现12306全自动抢票工具. 1. 实现12306自动识别验证码,我这里用的比较简单,目前 ...

  9. 12306自动抢票软件哪个好?记者亲测体验

    春运期间的火车票可谓一票难求,广大购票者抢票需求难以满足.在网上,铺天盖地的抢票插件也弄不清到底选哪家好.不要急,下面为大家介绍几款小编亲身实践过的功能强大的抢票软件,希望可以帮助大家顺利回家过年! ...

最新文章

  1. POJ1564 Sum It Up(DFS)
  2. ibm笔记本电脑电池_福建省厦门市集美区电池定制供应多少钱
  3. python——变量的类型、不同类型变量的计算、变量的输入以及格式化输出
  4. centos7 安装图形界面、VNCserver
  5. 《程序员》2月精彩内容:互联网应用架构面面观
  6. echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解
  7. 75的写的自己情感经历(转贴自天涯社区)
  8. dotNet Core使用SignalR实现websocket
  9. Visual Basic 兴衰记
  10. run till exit from #0_华为认证hcip H13821 v2.0云服务考试真题每日一练(一)
  11. 通过微信查找SAP TCODE代码
  12. 某大型银行某系统性能调优过程跟踪记录
  13. 管理感悟:软件的特性
  14. nifi服务器间拷贝文件,NIFI Kerberos 认证
  15. jQuery ajax教程
  16. Unity发布ios和Android获取相机权限的相关问题
  17. win10弹出计算机的内存不足,Win10系统提示“计算机内存不足”的解决方法
  18. 30天自制操作系统——第二十三天窗口操作
  19. saveFile()方法
  20. MATLAB水箱液位模糊控制仿真程序

热门文章

  1. 华为p40配置鸿蒙系统,华为P40系列配置汇总:IMX700五摄+首发鸿蒙OS?
  2. 学习 or 工作?这14个获取数据的网站,老板看了都说你有能力!
  3. 心愿作文计算机,心愿作文八篇
  4. 如何创新玩转HarmonyOS开发#厚积薄发
  5. 怎样修复Macbook键盘无法正常工作或打字?
  6. manjaro linux KDE桌面网易云音乐点击托盘图标无反应
  7. JavaScript中获取JSON文件中的数据
  8. 学习争与让---情商培养
  9. Java Basic3(泛型、Muti-Processing、JMX、Stand Mbean、Dynamic Mbean)
  10. 蓝桥杯C语言 十六进制转八进制