这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了

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):# 火车票页面查询urlsearch_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').textif number in  train_number:#获取是否还有票left_ticket = tr.find_element_by_xpath('./td[4]').textif 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').textprint(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 ECclass Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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 生成一个替换 96001im = 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')# 获取captchacaptcha = browser.find_element_by_class_name('login-pwd-code')# 获取captcha的左上角位置location = captcha.location# 获取图片大小size = captcha.size# 裁取captcharangle = (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').textif number in  train_number:left_ticket = tr.find_element_by_xpath('./td[4]').textif 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').textif 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('已经提交订单')breakdef search_railway_ticket(fromstation,tostation,train_date):# 火车票页面查询urlsearch_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 selenium实现全自动购买火车票相关推荐

  1. Python实现全自动购买火车票!抢票回家过年咯

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群 ...

  2. Python实现全自动购买火车票!抢票回家过年咯!

    这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了 1.首先实现使用selenium登陆12306 关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用se ...

  3. Python实现全自动购买火车票 抢票回家过年咯

    这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了 1.首先实现使用selenium登陆12306 关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用se ...

  4. Python + selenium + requests实现12306全自动买票

    Python + selenium + requests实现12306全自动买票 2020.05.03更新: 下面是新的测试结果: 2021.03.28更新:谷歌浏览器升级导致之前的隐藏方法失效,更新 ...

  5. [Python爬虫]使用Selenium操作浏览器订购火车票

    这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...

  6. python+selenium实现疫情期间全自动打卡

    文章目录 前言 问题分析 网页源码分析与代码实现 一.加载火狐驱动 二.输入账号密码并提交 三.进入打卡界面并点击左侧菜单栏 1.iframe内元素的定位 2.动态id/class的定位 四.表格填写 ...

  7. Python之——实现自动抢火车票(基于Python3.6+splinter)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79134306 splinter使用 首先介绍一下splinter使用: plint ...

  8. 100行Python代码实现自动抢火车票

    又到一年一度春运大会,2022年春运抢火车票还是那么难,各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率,有些代售火车票点,说给100元服务费,可以帮抢到,看来这水很深啊! 下面我 ...

  9. python+selenium环境配置及浏览器调用

    最近在学习python自动化,从项目角度和技术基础角度出发,我选择了python+selenium+appium的模式开始我的自动化测试之旅: 一.python安装 二.python IDE使用简介 ...

最新文章

  1. 29个简单直观的移动设备网页设计
  2. 【Windows系统】基于vscode搭建go语言开发环境
  3. html完成横纵坐标位置确定,2018-2019学年安徽省合肥市七年级下期中数学试卷-附详细答案...
  4. 每日一皮:为什么程序猿是最适合谈恋爱的人
  5. 网络推广专员如何稳定搜索引擎首页排名全力以赴致力于网络推广
  6. 图数据库Neo4j全栈Web技术解密
  7. 如何节省 1TB 图片带宽?解密极致图像压缩
  8. Oracle HTTP 乱码
  9. python 3.5 format_python 3.5学习笔记(第四章)
  10. Vue项目开发相关问题总结
  11. 【安装sql 2008步骤】
  12. 学习数据库的概念,作用
  13. oracle数据库sql语句插入时间信息
  14. 计算机图形学中的抗锯齿
  15. 01 excel 引用,数据引用,单元格引用
  16. python海龟画图函数汇总
  17. 推特Twitter API获取关注者名单
  18. Python例题8-3~8-4 T恤
  19. 喜欢NBA的朋友快来这里看第一阶段的全明星投票结果!!!(更新到第二阶段、第三阶段)
  20. C语言经典例题--打印前五十个素数

热门文章

  1. Pycharm连接远程服务器、使用Pycharm运行深度学习项目、Pycharm使用总结以及Pycharm报错和解决办法
  2. 使用hutool进行Unicode转换
  3. ubuntu配置静态ip的方法
  4. 行走的Offer收割机,首次公布Java10W字面经,Github访问量破百万
  5. L1-016. 查验身份证
  6. 详解SVD(奇异值分解)
  7. java毕业设计手机在线销售系统mybatis+源码+调试部署+系统+数据库+lw
  8. 英读廊——艺术家、穷人和音乐家之10美元的奇异之旅(The Artist, the Poor Man, and the Musician)
  9. 如何查看网页上的图片体积大小或容量大小?
  10. 一分钟搞懂X86架构