怎么用Python实现全自动购买火车票
发表于:2025-11-19 作者:千家信息网编辑
千家信息网最后更新 2025年11月19日,这篇文章主要讲解了"怎么用Python实现全自动购买火车票",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用Python实现全自动购买火车票"吧!这
千家信息网最后更新 2025年11月19日怎么用Python实现全自动购买火车票
这篇文章主要讲解了"怎么用Python实现全自动购买火车票",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用Python实现全自动购买火车票"吧!
这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了。
1.首先实现使用selenium登陆12306
关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用selenium登陆12306,这次是基于上次的代码进行修改实现全自动购买车票的 实现全自动登陆12306链接。
2.根据上面实现登陆后,实现购买火车票还需两步
这里只进行了二等座的查询和购票,想要买其他的自己也可以进行修改 1.进行车票的查询 这里面需要注意的是在输入目的地和起始地时需要先click一下文本框browser.find_element_by_id(‘fromStationText’).click() 不然输入的地址无效 还有将日期的只读属性去掉。
def search_railway_ticket(fromstation,tostation,train_date): # 火车票页面查询url search_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' # 转到查询车次页面 browser.get(search_url) time.sleep(2) #输入出发地 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'fromStationText')) ) #先点击一下 browser.find_element_by_id('fromStationText').click() browser.find_element_by_id('fromStationText').send_keys(fromstation) browser.find_element_by_id('fromStationText').send_keys(Keys.ENTER) time.sleep(1) WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'toStationText')) ) #输入目的地 browser.find_element_by_id('toStationText').click() browser.find_element_by_id('toStationText').send_keys(tostation) browser.find_element_by_id('toStationText').send_keys(Keys.ENTER) time.sleep(5) #将日期的只读属性去掉 js = 'document.getElementById("train_date").removeAttribute("readonly")' browser.execute_script(js) #去掉原本的时间 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'train_date')) ) browser.find_element_by_id("train_date").clear() #输入出发时间 browser.find_element_by_id('train_date').send_keys(train_date) # 等待查询按钮是否可用 WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, 'query_ticket')) ) searBtn = browser.find_element_by_id('query_ticket') searBtn.click() print('点击按钮')2.购买火车票 在这个函数中需要注意的是最好把最后一步注释掉 browser.find_element_by_id(‘qr_submit_id’).click() 因为一天只能取消3次订单。
def buy_ticket(fromstation,tostation,train_date,train_number,passenger): #查询火车票 search_railway_ticket(fromstation,tostation,train_date) time.sleep(5) #获取每一个车次的信息 tr_list = browser.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]') for tr in tr_list: #获取车次号 number = tr.find_element_by_class_name('number').text if number in train_number: #获取是否还有票 left_ticket = tr.find_element_by_xpath('./td[4]').text if left_ticket =='有'or left_ticket.isdigit: print(f'{number}还有票') #点击预订 orderBtn = tr.find_element_by_class_name('btn72') orderBtn.click() time.sleep(5) #获取12306中乘客的信息 passenger_list = browser.find_elements_by_xpath('//*[@id="normal_passenger_id"]/li') for li in passenger_list: name = li.find_element_by_xpath('./label').text print(name) #配对12306人名 if name == passenger: li.find_element_by_tag_name('input').click() #提交订单 submit = browser.find_element_by_id('submitOrder_id') submit.click() WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, 'qr_submit_id')) ) #一天只能取消3次 所以最好把最后一步注释了 browser.find_element_by_id('qr_submit_id').click() print('已经提交订单') break下面是源代码
测试的时候可以把#click_captcha()这个点击验证码的去掉自己手动点击,这样就不用扣超级鹰的积分(有钱的话当我没说),留下了贫穷的泪水。
from selenium import webdriver from selenium.webdriver import Actionchains import time from PIL import Image import requests from hashlib import md5 from selenium.webdriver import ChromeOptions #验证码识别处理 from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:报错题目的图片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() def login(username,password): # 填写账号密码 browser.find_element_by_id('J-userName').send_keys(username) browser.find_element_by_id('J-password').send_keys(password) # 获取验证码 get_captcha() # 填写验证码 click_captcha() #点击登录 time.sleep(4) browser.find_element_by_id('J-login').click() time.sleep(4) #滑动验证码 slider() print('成功登陆') time.sleep(5) def slider(): #滑动验证码 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.XPATH, '//*[@id="nc_1_n1z"]')) ) span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]') # 对div_tag进行滑动操作 action = Actionchains(browser) # 点击长按指定的标签 action.click_and_hold(span).perform() action.drag_and_drop_by_offset(span, 400, 0).perform() def click_captcha(): # 获取验证码需要的为点击位置 chaojiying = Chaojiying_Client('自己的用户名', '密码', '软件id') # 用户中心>>软件ID 生成一个替换 96001 im = open('./captcha.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// location = chaojiying.PostPic(im, 9004)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() print(chaojiying.PostPic(im, 9004)) # 将位置进行分割成 [ [ ], [ ], [ ] ]类型 location_list = [i.split(',') for i in location.split('|')] for l in location_list: x = l[0] y = l[1] Actionchains(browser).move_to_element_with_offset(browser.find_element_by_class_name('login-pwd-code'), int(x),int(y)).click().perform() time.sleep(0.5) def get_captcha(): # 获取网页的截图 allscreen = browser.get_screenshot_as_file('allscreen.png') # 获取captcha captcha = browser.find_element_by_class_name('login-pwd-code') # 获取captcha的左上角位置 location = captcha.location # 获取图片大小 size = captcha.size # 裁取captcha rangle = (location['x'],location['y'],(location['x']+size['width']),(location['y']+size['height'])) i = Image.open('./allscreen.png') captcha_img = './captcha.png' frame = i.crop(rangle) frame.save(captcha_img) def buy_ticket(fromstation,tostation,train_date,train_number,passenger): #查询火车票 search_railway_ticket(fromstation,tostation,train_date) time.sleep(5) tr_list = browser.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]') for tr in tr_list: number = tr.find_element_by_class_name('number').text if number in train_number: left_ticket = tr.find_element_by_xpath('./td[4]').text if left_ticket =='有'or left_ticket.isdigit: print(f'{number}还有票') orderBtn = tr.find_element_by_class_name('btn72') orderBtn.click() time.sleep(5) passenger_list = browser.find_elements_by_xpath('//*[@id="normal_passenger_id"]/li') for li in passenger_list: name = li.find_element_by_xpath('./label').text if name == passenger: li.find_element_by_tag_name('input').click() submit = browser.find_element_by_id('submitOrder_id') submit.click() WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, 'qr_submit_id')) ) #一天只能取消3次 所以把最后一步注释了 # browser.find_element_by_id('qr_submit_id').click() print('已经提交订单') break def search_railway_ticket(fromstation,tostation,train_date): # 火车票页面查询url search_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' # 转到查询车次页面 browser.get(search_url) time.sleep(2) #输入出发地 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'fromStationText')) ) #先点击一下 browser.find_element_by_id('fromStationText').click() browser.find_element_by_id('fromStationText').send_keys(fromstation) browser.find_element_by_id('fromStationText').send_keys(Keys.ENTER) time.sleep(1) WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'toStationText')) ) #输入目的地 browser.find_element_by_id('toStationText').click() browser.find_element_by_id('toStationText').send_keys(tostation) browser.find_element_by_id('toStationText').send_keys(Keys.ENTER) time.sleep(5) #将日期的只读属性去掉 js = 'document.getElementById("train_date").removeAttribute("readonly")' browser.execute_script(js) #去掉原本的时间 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, 'train_date')) ) browser.find_element_by_id("train_date").clear() #输入出发时间 browser.find_element_by_id('train_date').send_keys(train_date) # 等待查询按钮是否可用 WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, 'query_ticket')) ) searBtn = browser.find_element_by_id('query_ticket') searBtn.click() print('点击按钮') if __name__ == '__main__': option = ChromeOptions() # 实例化一个ChromeOptions对象 option.add_experimental_option('excludeSwitches', ['enable-automation']) # 以键值对的形式加入参数 option.add_experimental_option('useAutomationExtension', False) browser = webdriver.Chrome(options=option) # 获取响应 browser.get('https://kyfw.12306.cn/otn/resources/login.html') script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});' browser.execute_script(script) browser.maximize_window() time.sleep(1) # 点击账号登陆 browser.find_element_by_class_name('login-hd-account').click() #登陆12306的账号密码 login('用户名','密码') time.sleep(4) #例buy_ticket('南昌','抚州北','2020-12-15','D2241','xx') buy_ticket('起始地','目的地','出发日期','车次','姓名')感谢各位的阅读,以上就是"怎么用Python实现全自动购买火车票"的内容了,经过本文的学习后,相信大家对怎么用Python实现全自动购买火车票这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
火车
火车票
查询
验证
登陆
输入
全自动
目的
车次
图片
密码
按钮
日期
时间
注释
目的地
订单
页面
位置
属性
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
jsp 点单导入数据库
数据库replace()
安全生产数据库建设征集意见
浙江企业软件开发服务费
助理软件开发工程师好做吗
江苏电话软件开发报价方案
甘肃信创服务器
网络安全英语作文150字高中
什么软件开发餐厅app
northwind数据库
软件开发类文档
ftp服务器怎么打开
天津东丽区服务器搭建云空间
茶杯犬视频软件开发
软件开发曲靖
腾讯金十数据库
服务器硬盘数据备份
数据库外卖系统的展望
fifa足球世界界球员数据库
数据库链接优化
网站的数据库配置文件
半岛晨报招软件开发
中国poi数据库
手机软件开发模式
三十三岁做软件开发
关于网络安全内容150字
青岛手机app软件开发
仙境传说数据库
开发服务器 配置
电信杯网络安全技能大赛