返回顶部
首页 > 资讯 > 后端开发 > Python >怎么用Python实现全自动购买火车票
  • 488
分享到

怎么用Python实现全自动购买火车票

2023-06-15 21:06:48 488人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“怎么用python实现全自动购买火车票”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现全自动购买火车票”吧!这个是实现结果,因为一天只能取消三次,所以

这篇文章主要讲解了“怎么用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('点击按钮')

购买火车票 在这个函数中需要注意的是最好把最后一步注释掉  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实现全自动购买火车票这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么用Python实现全自动购买火车票

本文链接: https://lsjlt.com/news/281538.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用Python实现全自动购买火车票
    这篇文章主要讲解了“怎么用Python实现全自动购买火车票”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现全自动购买火车票”吧!这个是实现结果,因为一天只能取消三次,所以...
    99+
    2023-06-15
  • Python实现12306自动抢火车票功能
    目录一、效果展示二、代码详解1 导入库2 确定好购票基本信息3 登录123064 模拟滑动滑块5 处理疫情特殊要求6 点击购票并填写出发地、目的地、出发时间7 锁定车票大家有没有这种...
    99+
    2024-04-02
  • Python如何实现12306自动抢火车票功能
    这篇文章将为大家详细讲解有关Python如何实现12306自动抢火车票功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、效果展示在正式进入代码讲解之前,先来看下本文的实现效果。如果不是为了演示效果,直...
    99+
    2023-06-22
  • 如何用Python自动刷新抢12306火车票
    如何用Python自动刷新抢12306火车票,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一年一度的春运又来了,今年我自己写了个抢票脚本。使用Python+Splinter自动...
    99+
    2023-06-17
  • 使用Python实现火车票查询系统(带界面)
    目录导语一、运行环境二、代码展示三、效果展示导语 周末、假期来了,七夕也快到了,又到一年中最一票难求的时候了! 那些假期想回家、过节异地恋的小可爱们,能准时抢到回家(约会对象)的城市...
    99+
    2024-04-02
  • 利用Python实现命令行版的火车票查看器
    接口设计 一个应用写出来最终是要给人使用的,哪怕只是给你自己使用。所以,首先应该想想你希望怎么使用它?让我们先给这个小应用起个名字吧,既然及查询票务信息,那就叫它tickets好了。我们希望用户只要输入出发...
    99+
    2022-06-04
    命令行 火车票 查看器
  • 如何使用 Python 自动购买 Interpark 演唱会门票 ?
    前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Interpark是韩国的一家知名网上购物网站,成立于1996年。 它是韩国最早开展网上零售业务的公司之一,提供各种产品,包括各种书籍、电子产品、...
    99+
    2023-09-07
    python 开发语言 pycharm
  • 如何利用C++实现一个简单的火车票订购系统?
    随着人们工作和生活方式的变化,越来越多的人选择乘坐火车出行。因此,实现一个简单的火车票订购系统可以方便用户预订车票,同时也可以提高工作效率,减少人力投入。本文将介绍如何使用C++实现一个简单的火车票订购系统,以方便读者学习和实践。一、需求分...
    99+
    2023-11-03
    C++ 火车票 订购系统
  • Java实现火车票预订系统的代码怎么写
    本文小编为大家详细介绍“Java实现火车票预订系统的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现火车票预订系统的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 一、项...
    99+
    2023-06-29
  • Python selenium实现大麦网自动购票过程解析
    目录实现免登陆初始化加载登录cookies: 登录网站时出现的假如说我现在本地有 cookies.pkl 那么 直接获取打开浏览器实现购票选票操作选择座位下单操作判断元素是否存在购票...
    99+
    2024-04-02
  • php怎么用session实现购物车
    使用PHP的session可以很方便地实现购物车功能。下面是一个简单的示例:首先,创建一个用于存储购物车内容的数组。在每个页面的顶部...
    99+
    2023-10-12
    php
  • 怎么用python脚本实现购物车小程序
    这篇“怎么用python脚本实现购物车小程序”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用python脚本实现购物车小...
    99+
    2023-06-29
  • Vue怎么实现移动端购物车界面
    今天小编给大家分享一下Vue怎么实现移动端购物车界面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HTML部分首先给出HTM...
    99+
    2023-07-04
  • vue怎么实现商品购物车全选反选
    这篇“vue怎么实现商品购物车全选反选”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现商品购物车全选反选”文章吧...
    99+
    2023-06-30
  • 怎么使用Android实现购物车页面及购物车效果
    这篇文章主要介绍了怎么使用Android实现购物车页面及购物车效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android实现购物车页面及购物车效果(点击动画),具体如下...
    99+
    2023-05-30
    android
  • 怎么用php实现购物车功能
    要使用PHP实现购物车功能,可以按照以下步骤进行:1. 创建一个数据库表来存储购物车信息。例如,可以创建一个名为"cart"的表,包...
    99+
    2023-08-24
    PHP
  • vue怎么实现购物车小球动画效果
    这篇文章主要介绍“vue怎么实现购物车小球动画效果”,在日常操作中,相信很多人在vue怎么实现购物车小球动画效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么实现购物车小球动画效果”的疑惑有所帮助!...
    99+
    2023-07-04
  • 怎么用纯CSS实现一个转动的自行车车轮的动画效果
    这篇文章主要为大家展示了“怎么用纯CSS实现一个转动的自行车车轮的动画效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用纯CSS实现一个转动的自行车车轮的...
    99+
    2024-04-02
  • 使用vue怎么实现简单购物车
    这篇文章将为大家详细讲解有关使用vue怎么实现简单购物车,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码:<!DOCTYPE html><html l...
    99+
    2023-06-15
  • 小程序怎么实现购物车抛物线动画
    这篇文章主要介绍“小程序怎么实现购物车抛物线动画”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序怎么实现购物车抛物线动画”文章能帮助大家解决问题。分析要实现抛物线动画,我当时想到的是用插件的方式...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作