python+selenium实现12306抢票

一、准备工作

1、要先下载相关的包,selenium、interval。最好使用国内清华源

pip install (which package) -i https://pypi.tuna.tsinghua.edu.cn/simple

2、还要下载对应浏览器的驱动:

2.1 安装chromedriver

谷歌浏览器驱动的网址为link
注意:谷歌浏览器的驱动版本要匹配谷歌浏览器的版本
随机点击一个版本:

点击notes.txt

2.2 安装FireFox驱动(我用的是这个)

火狐驱动下载网址:link
然后一样的下载对应的驱动版本

2.3 最后把下载好的驱动解压,移动到/usr/bin文件夹(linux系统)中或者放入python一级目录下就好了

二、具体实现过程(代码有具体注释)

from selenium import webdriver
from time import sleep#页面等待时间
from selenium.webdriver.common.by import By#定位元素
from selenium.webdriver import ActionChains#完成一系列自动化操作
from selenium.webdriver.common.keys import Keys#完成键盘上的操作
from collections import defaultdict#初始化字典,value为列表
import re#用于正则表达式
# from datetime import datetime
from interval import IntervalSet#用于定义时间区间
# import jsonclass TrainTicketLogin(object):def __init__(self):#12306登录网页的网址self.url='https://kyfw.12306.cn/otn/resources/login.html'#你自己的用户名self.userName='XXXXXXXXXXX'#你自己的密码self.passWord='XXXXXX'#我用的是火狐浏览器,如果用的是谷歌,要提前下载好对应浏览器的驱动,这里实例化一个浏览器操作对象self.options=webdriver.Firefox()def login(self,url):self.options.get(self.url)login_method=self.options.find_element(By.XPATH,'//div[@class="login-box"]/ul/li[1]/a')login_method.click()userName_tag=self.options.find_element(By.ID,"J-userName")passWord_tag=self.options.find_element(By.ID,"J-password")userName_tag.send_keys(self.userName)passWord_tag.send_keys(self.passWord)btn=self.options.find_element(By.ID,"J-login")btn.click()sleep(3)slide_btn=self.options.find_element(By.XPATH,'//*[@id="nc_1_n1z"]')self.Verification(slide_btn)def Verification(self,button):action1=ActionChains(self.options)# 防止12306网站禁止selenium而出现的errorscript = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'self.options.execute_script(script)action1.click_and_hold(button)action1.move_by_offset(300,0).perform()#释放鼠标action1.release().perform()sleep(1)def get_ticket(self):chepiao_button=self.options.find_element(By.XPATH,'//a[@id="link_for_ticket"]')chepiao_button.click()sleep(3)origin=self.options.find_element(By.ID,"fromStationText")arrival=self.options.find_element(By.ID,"toStationText")date=self.options.find_element(By.ID,"train_date")my_chufa=IntervalSet.between(self.l_time_interval_left,self.l_time_interval_right)my_daoda=IntervalSet.between(self.a_time_interval_left,self.a_time_interval_right)#出发地键入origin.click()origin.send_keys(self.loc_l)origin.send_keys(Keys.ARROW_DOWN)origin.send_keys(Keys.ENTER)sleep(1)#目的地键入arrival.click()arrival.send_keys(self.loc_a)arrival.send_keys(Keys.ARROW_DOWN)arrival.send_keys(Keys.ENTER)sleep(1)#出发日期键入date.clear()date.send_keys(self.go_date)date.send_keys(Keys.ENTER)#是否选择学生票(若为普通票则注释掉以下代码)# self.options.find_element(By.ID,"sf2").click()#点击查询操作query_button=self.options.find_element(By.XPATH,'//div[@class="btn-area"]/a')query_button.click()#请输入选择的train型号(K字头还是G字头还是D字头还是其他)sleep(5)#进行正则匹配ex='<tr id="ticket_(.*?)" class.*?>'train_info=defaultdict(list)train_type=re.findall(ex,self.options.page_source)for train in train_type:xpath_1='//tr[@id=\"{}\"]/td[1]/div/div[3]/strong[1]'.format('ticket_'+train)xpath_2='//tr[@id=\"{}\"]/td[1]/div/div[3]/strong[2]'.format('ticket_'+train)origin_time=self.options.find_element(By.XPATH,xpath_1).textarrive_time=self.options.find_element(By.XPATH,xpath_2).texttrain_info[train]=[origin_time,arrive_time]#预览一下火车的信息# print(train_info)#请输入你理想的乘车时间区间和到达时间区间for key,value in train_info.items():if self.train_ in key.split('_')[0]:xpath_3='//*[@id=\"{}\"]'.format(self.type+'_'+key.split('_')[0])left_tickets=self.options.find_element(By.XPATH,xpath_3).textif value[0] in my_chufa and value[1] in my_daoda and \(left_tickets.isdigit() or left_tickets=='有'):xpath_4='//tr[@id=\"{}\"]//*[@class="btn72"]'.format('ticket_'+key)self.options.find_element(By.XPATH,xpath_4).click()#请选择乘车人,这里选择默认乘车人(第一个人)sleep(2)self.options.find_element(By.XPATH,'//*[@id="normalPassenger_0"]').click()sleep(2)self.options.find_element(By.XPATH,'//*[@id="submitOrder_id"]').click()#确定买票(等待较长时间才能锁定席位)sleep(2)self.options.find_element(By.XPATH,'//*[@id="qr_submit_id"]').click()#返回修改# sleep(2)# self.options.find_element(By.XPATH,'//*[@id="back_edit_id"]').click()def run(self):self.login(self.url)sleep(5)hint=self.options.find_element(By.XPATH,'//div[@class="modal-ft"]/a')hint.click()sleep(3)self.loc_l=input("请输入出发地:")self.loc_a=input("请输入目的地:")self.go_date=input("请输入出发日期(格式为%Y-%m-%d的形式):")self.l_time_interval_left=input("请输入理想出发时间的左端点:")self.l_time_interval_right=input("请输入理想出发时间的右端点:")self.a_time_interval_left=input("请输入理想到达时间的左端点:")self.a_time_interval_right=input("请输入理想到达时间的右端点:")self.train_=input("你想坐高铁还是火车还是动车(G、K、D、T):")if self.train_ in ['K','T']:# 如果选择火车(软卧、硬卧、硬座)self.type=input("请输入你要乘坐的类型(RW、YW、YZ):")else:self.type=input("请输入你要乘坐的类型(SWZ(商务座)、ZY(一等座)、ZE(二等座)):")self.get_ticket()# self.options.quit()
if __name__=='__main__':Spider=TrainTicketLogin()Spider.run()

python+selenium实现12306抢票相关推荐

  1. python编程实践(3):python+selenium实现12306抢票脚本

    又到了一年一度的春运时节,抢个票? 1.设计思路 如果我们要买一张火车票,我们会怎么做?打开12306,登陆,输入出发地和目的地,选择出行日期,然后点击查询,有余票的话就下单购买,没有票就点刷新或者等 ...

  2. python3+selenium实现12306抢票脚本

    文章目录 一. 环境配置 windows环境 mac.linux环境 二. 实现思路及代码 1. 查询票数 2. 登录 关于自动登录 3. 提交订单 4. 邮件提醒 5. 短信提醒 三.总结与分析 一 ...

  3. Python 实现的12306抢票脚本

    Python12306抢票脚本 本脚本使用一个类来实现所有代码,大体上分为以下几个模块及其步骤: - 初始化对象属性(在抢票前进行的属性初始化,包括初始化浏览器模拟对象,个人信息等). - 建立模拟浏 ...

  4. Python版实现12306抢票功能,真的能帮你抢到春运回家的票吗?

    背景 每逢佳节倍思亲,年关将近,思乡的情绪是不是愈发强烈了,筒子们是不是又要准备开始抢票了,还是在找黄牛吗?但是,今年在考虑是否能抢到票以外,还需要考虑是否能回得去,没错,因为疫情,需要全国人民同心协 ...

  5. Python+Selenium实现12306买票

    现场环境:python 3.7.7,selenium3.14 代码在原先基础上加了滑动验证,在第一版(2020年底)12306网站没了图片验证,难度降低了不少嘿嘿嘿.在跳转买票的代码前做过对时间转整数 ...

  6. python自动刷新12306抢票

    #!/usr/bin/env python #-*- coding: utf-8 -*- """ 通过splinter刷12306火车票 可以自动填充账号密码,同时,在登 ...

  7. python GUI+爬虫——12306抢票软件(1)

    使用python 的GUI 和爬虫等功能自己构造一个12306的抢票软件. 该课程来自网易云课堂的撩课学院,付费课程.地址:网易云课堂搜索以下内容就可找到 我跟着学,不一定最后能成功.先试试,想要成功 ...

  8. Python实例 一 12306抢票(二) 下单

    第二篇 刷票与下单 原文地址:http://www.tnblog.net/cz/article/details/241 解决"url":"/leftTicket/init ...

  9. 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料

    我使用的 vmware 14 + ubuntu 16  +  PyCharm  开发环境 12306抢票 python+selenium+chrome 实现一 12306抢票 python+selen ...

最新文章

  1. TokuDB在生产环境的应用场景(zabbix也可以)
  2. 有向无环图的拓扑排序
  3. 如何在 Linux 虚拟机上扩展根文件系统
  4. UVa 1588 换抵挡装置
  5. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...
  6. VS2010整合NUnit进行单元测试
  7. 关于NGINX变量的一些测试结果
  8. android应用程序优化之布局优化
  9. 定制问卷|表单收集系统-对接特殊接口(表单系统)
  10. 移远 EC20 模组(4G通信模组)转载
  11. 数据结构 --- c语言实现双向循环链表
  12. Shopee平台有哪些电商大促活动?大促活动如何报名?
  13. 人工智能产品普及的今天,软件测试人员也在自我进化
  14. 5款便捷的App帮你预定出租车
  15. python基础教程Day06
  16. 玩转html5(一)-----盘点html5新增的那些酷酷的input类型和属性
  17. python PIL的Image.resize()和Image.thumbnail()函数的区别
  18. Shells:一款功能强大的反向Shell快速生成工具
  19. 坐下来谈谈如何写好一份简历?
  20. 微信小程序蓝牙使用总结

热门文章

  1. k邻近算法-回归实操
  2. matlab中画反函数的图像,matlab中如何实现Q函数的反函数
  3. 扩展敏捷性:选择敏捷框架之前要问的问题
  4. 关于职场中的面试,要是遇到这些问题时,应该怎么回
  5. 主流技术Java、Python怎么学?如何提升你的编程基本功?(MySQL、Linux、算法的核心知识讲解,瓶颈期的你如何做提升?)
  6. leetcode292. Nim 游戏(java python3)
  7. Python中的[...]是什么?
  8. 微信小程序Maximum call stack size exceeded 报错
  9. debian linux系统下载工具,在Debian 10 Linux系统中下载安装R和RStudio的方法
  10. 疑问贴|svga导出失败并且无法显示在保存路径中是为什么?