前言

本代码采用selenium 自动化测试模块,这里用于操作浏览器,就是通过selenium 自动化测试模块让浏览器模拟人来操作浏览器,从而实现购票。

本程序操作的chrom浏览器,需要提前下载浏览器驱动chromedriver.exe,浏览器驱动需与浏览器版本一致,并与抢票程序置于同一目录。

(文末送读者福利)

一、下载chromedriver.exe

在chrom浏览器里输入:chrome://version/查看浏览器版本

前行官网下载浏览器驱动:

http://chromedriver.storage.googleapis.com/index.html,

下载对应用操作系统的,并将浏览器驱动与主程序置于同一目录。

抢票程序运行截图:

完整抢票程序:

import time
import datetime
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class Qiangpiao():def __init__(self,from_station,to_station,depart_time,train_num,passenger):self.login_url = 'https://kyfw.12306.cn/otn/resources/login.html'self.init_my_url = 'https://kyfw.12306.cn/otn/view/index.html'self.order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'# input("出发地:")self.from_station = from_station# input("目的地:")self.to_station = to_station# 时间格式必须是M-d的方式# input("出发时间(格式必须是M-d的方式):")self.depart_time = depart_time# input("列车号:")self.train_num = train_numself.passenger = passenger#获取当前月份self.now_month = datetime.date.today().monthself.leave_month = int(self.depart_time.split('-')[0])self.leave_day = int(self.depart_time.split('-')[1])self.driver = webdriver.Chrome()def _login(self):self.driver.get(self.login_url)# 窗口最大化#self.driver.maximize_window()# 设置窗口大小self.driver.set_window_size(1300,800)#print('调整前尺寸:', self.driver.get_window_size())#显式等待#这里进行手动登录,可以扫码,也可以输入账号密码点击登录WebDriverWait(self.driver,1000).until(EC.url_to_be(self.init_my_url))print('登录成功!')def _pop_window(self):time.sleep(1)self.driver.find_element_by_xpath('//*[@class="dzp-confirm"]/div[2]/div[3]/a').click()def _enter_order_ticket(self):action = ActionChains(self.driver)   # 实例化一个动作链对象element = self.driver.find_element_by_link_text('车票')# 鼠标移动到 '车票' 元素上的中心点action.move_to_element(element).perform()# 点击'单程'self.driver.find_element_by_xpath('//*[@id="J-chepiao"]/div/div[1]/ul/li[1]/a').click()# 消除第二次弹窗self.driver.find_element_by_link_text('确认').click()def _search_ticket(self):#出发地输入self.driver.find_element_by_id("fromStationText").click()self.driver.find_element_by_id("fromStationText").send_keys(self.from_station)self.driver.find_element_by_id("fromStationText").send_keys(Keys.ENTER)#目的地输入self.driver.find_element_by_id("toStationText").click()self.driver.find_element_by_id("toStationText").send_keys(self.to_station)self.driver.find_element_by_id("toStationText").send_keys(Keys.ENTER)#出发日期输入self.driver.find_element_by_id("train_date").click()if self.leave_month == self.now_month:xpath_str = f"//div[@class='cal-wrap']/div[1]/div[2]/div[{self.leave_day}]"if EC.element_to_be_clickable((By.XPATH, xpath_str)):self.driver.find_element_by_xpath(xpath_str).click()else:print("当前日期未到或已过售票日期,无法购票!")elif self.leave_month == self.now_month + 1:xpath_str = f"//div[@class='cal-wrap']/div[2]/div[2]/div[{self.leave_day}]"if EC.element_to_be_clickable((By.XPATH, xpath_str)):self.driver.find_element_by_xpath(xpath_str).click()else:print("当前日期未到或已过售票日期,无法购票!")else:print("月份超前一个月以上,无法购票!")#等待查询按钮是否可用WebDriverWait(self.driver,1000).until(EC.element_to_be_clickable((By.ID,"query_ticket")))#执行点击事件search_btn = self.driver.find_element_by_id("query_ticket")search_btn.click()#等待查票信息加载WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.XPATH, '//*[@id="queryLeftTable"]/tr')))def _order_ticket(self):train_num_list = []  # 列车号列表train_num_ele_list = self.driver.find_elements_by_xpath('//tr/td[1]/div/div[1]/div/a')  # 列车号元素列表for t in train_num_ele_list:    # 遍历列车号元素列表,并把列车号添加到列车号列表train_num_list.append(t.text)tr_list = self.driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr[not(@datatran)]')  #每一列列车整行信息列表,列车号元素是tr的子元素if self.train_num in train_num_list:for tr in tr_list:train_num = tr.find_element_by_xpath("./td[1]/div/div[1]/div/a").text  #取出元素tr里的列车号if self.train_num == train_num:#动车二等座余票信息text_1 = tr.find_element_by_xpath("./td[4]").text# 火车二等座余票信息text_2 = tr.find_element_by_xpath("./td[8]").textif (text_1 == "有" or text_1.isdigit()) or (text_2 == "有" or text_2.isdigit()):#点击预订按钮order_btn = tr.find_element_by_class_name("btn72")order_btn.click()#等待订票页面WebDriverWait(self.driver,1000).until(EC.url_to_be(self.order_url))# 选定乘车人self.driver.find_element_by_xpath(f'//*[@id="normal_passenger_id"]/li/label[contains(text(),"{self.passenger}")]').click()#如果乘客是学生,对提示点击确定if EC.presence_of_element_located((By.XPATH, '//div[@id="dialog_xsertcj"]')):self.driver.find_element_by_id('dialog_xsertcj_ok').click()# 提交订单self.driver.find_element_by_id('submitOrder_id').click()time.sleep(2)# 点击确认订单self.driver.find_element_by_id('qr_submit_id').click()else:# 提交订单self.driver.find_element_by_id('submitOrder_id').click()time.sleep(2)# 点击确认self.driver.find_element_by_id('qr_submit_id').click()print("购票成功!")breakelse:print("二等座无票!")else:print("无此列车!")def run(self):#登录self._login()#消除登录后(第一次)的弹窗self._pop_window()#进入购票页面self._enter_order_ticket()#查票self._search_ticket()#订票self._order_ticket()#关闭浏览器time.sleep(6)self.driver.quit()if __name__ == '__main__':qiangpiao = Qiangpiao("昆明","武汉","1-27","G1540","Python代码大全")#出发地、目的地、出发时间、车次、姓名qiangpiao.run()

读者福利:知道你对Python感兴趣,便准备了这套python学习资料,

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

【新年返程离不开Python】最新12306抢票源程序Python版就此分享给大家啦!相关推荐

  1. java订单号 github_GitHub - github2zhang/J12306: 12306抢票程序JAVA版

    J12306抢票助手 12306抢票程序JAVA版,自动登录-验证-查票-购票/自动候补.只需简单的配置即可运行进行快捷抢票. 使用说明 引入jar依赖 手动添加项目lib文件夹中的依赖包 配置文件c ...

  2. 【python自动化测试】京东|淘宝|秒杀12306抢票程序揭秘!一起薅羊毛吧【含源码】

    相信老铁们应该也看过很多这样的视频或者帖子:python自动秒杀的程序,京东,淘宝,大麦网抢票,秒杀抢购抢茅台,12306抢票,还有python薅羊毛的,感觉好像需求挺大的,很多人感兴趣.我也看了一些 ...

  3. 2022最新 wifi大师小程序独立版3.0.8

    简介: wifi大师小程序独立版3.0.8,安装源码到根目录 1.网站运行目录public 2.PHP7.2,开通SSL 3.导入数据库文件 4.修改数据库文件里application/databas ...

  4. 【新版12306抢票】python自动识别图片并登录12306,实现全自动抢票源代码-分享

    以下代码可自动登录12306 - 包括输入用户名密码以及自动识别验证码并点击验证码登陆. 把代码稍作加工,即可变为自己的自动抢票代码: 把  userName.send_keys("xxxx ...

  5. 通过python实现12306抢票

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

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

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

  7. python 线程池_老程序员的经验分享:Python 从业十年是种什么体验?

    出于某些原因,想记录一下我过去数年使用 Python 的经验和一些感悟.毕竟算是一门把我带入互联网行业的语言,而我近期已经几乎不再写 Py 代码, 做一个记录,也许会对他人起到些微的帮助,也算是纪念与 ...

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

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

  9. Python + Splinter 12306抢票

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

最新文章

  1. ART基因序列生成器,究竟是做什么的?
  2. sleep() 函数
  3. 基于Spring AOP的JDK动态代理和CGLIB代理
  4. Intel Realsense D435 如何设置曝光参数(exposure)
  5. 8运行不了_好消息!十堰新建28座充电站,年底投入运行
  6. 我对于全栈工程师的理解
  7. C++/Java线程之分
  8. 9.Java 面试题整理(UML 方面 )
  9. loot recycler_loot++ - MC百科搜索 - MC百科|最大的Minecraft中文MOD百科
  10. 029 RDD Join相关API,以及程序
  11. MFC编程入门之二十一(常用控件:编辑框Edit Control)
  12. 高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)
  13. mysql中表示金钱的类型
  14. Eclipse下载与安装
  15. 开源点云数据处理 开源_开源云–充满希望的未来
  16. windows如何设置新建文本文档快捷键
  17. Linux网络服务-LAMP之基于NFS+Fastcgi的LAMP搭建
  18. 报修管理系统微信小程序源码 带前端后端源码
  19. 为什么计算机关机慢,XP系统为什么电脑关机慢?
  20. 【计算机网络】 IP地址划分

热门文章

  1. windows/ps使用技巧
  2. 编写计算机程序的几个步骤,第1讲程序设计的一般步骤ok.doc
  3. 汽车重点转向驾驶员监控系统
  4. 全美 计算机专业排名,全美计算机专业排名
  5. Http 通过setHeader隐藏ip
  6. python简易爬虫获取A股上证所有股票历史数据
  7. 苹果电脑安装软件显示:映像数据已损坏的解决办法
  8. 推进个人信息保护的几点建议
  9. Java化小数为分数_杭电oj1717——小数化分数(java实现)
  10. 乘风破浪的码农——仿佛身体被掏空