1、需要先安装python环境

2、安装selenium模拟用户来操作浏览器

3、将chromedriver驱动放入chrome浏览器应用根目录

4、用文本编辑器打开脚本,编辑购票人信息

5、通过cmd运行软件,python tickets.py 上海 广州 2018-01-30

6、程序打开浏览器后,请自己输入账号密码登录

7、抢到票后,请付款

# -*- coding: utf-8 -*-
"""
@author: raoaro
"""
#from splinter.browser import Browser
from selenium import webdriver
from time import sleep
import traceback
import time, sys class huoche(object):
"""docstring for huoche"""
driver_name=''
executable_path=''
#用户名,密码
# cookies值得自己去找, 下面两个分别是上海, 太原南
starts = u"%u4E0A%u6D77%2CSHH"
ends = u"%u592A%u539F%2CTYV"
# 时间格式2018-01-19
dtime = u"2018-01-19"
# 车次,选择第几趟,0则从上之下依次点击
order = 0
###乘客名
users = [u"raorao"]
##席位
xb = u"二等座"
pz=u"成人票" """网址"""
ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
login_url = "https://kyfw.12306.cn/otn/login/init"
initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
buy="https://kyfw.12306.cn/otn/confirmPassenger/initDc"
login_url='https://kyfw.12306.cn/otn/login/init' def __init__(self):
self.driver_name='chrome'
self.executable_path='/usr/local/bin/chromedriver' def login(self):
#self.driver.visit(self.login_url)
self.driver.get(self.login_url)
# 填充密码
#self.driver.fill("loginUserDTO.user_name", self.username)
# sleep(1)
#self.driver.fill("userDTO.password", self.passwd)
print("等待验证码,自行输入...")
while True:
if self.driver.current_url != self.initmy_url:
sleep(1)
else:
break def start(self):
#self.driver=Browser(driver_name=self.driver_name,executable_path=self.executable_path)
self.driver=webdriver.Chrome();
self.driver.set_window_size(1400, 1000)
self.login()
# sleep(1)
self.driver.get(self.ticket_url)
try:
print("购票页面开始...")
# sleep(1)
# 加载查询信息 self.driver.add_cookie({'name':'_jc_save_fromStation','value':self.starts});
self.driver.add_cookie({'name':'_jc_save_toStation','value':self.ends});
self.driver.add_cookie({'name':'_jc_save_fromDate','value':self.dtime}); #self.driver.reload()
self.driver.refresh()
count=0
if self.order!=0:
while self.driver.current_url==self.ticket_url:
#self.driver.find_by_text(u"查询").click()
self.driver.find_element_by_id('query_ticket').click()
count += 1
print ("循环点击查询... 第 "+str(count)+"次") try:
#self.driver.find_by_text(u"预订")[self.order - 1].click()
self.driver.find_elements_by_class_name("btn72")[self.order - 1].click()
except Exception as e:
print(e)
print ("还没开始预订")
continue
sleep(1)
else:
while self.driver.current_url == self.ticket_url:
#self.driver.find_by_text(u"查询").click()
self.driver.find_element_by_id('query_ticket').click()
count += 1
print ("循环点击查询... 第 "+str(count)+" 次") try:
#for i in self.driver.find_by_text(u"预订"):
#for i in self.driver.find_element_by_class_name("btn72"):
for i in self.driver.find_elements_by_class_name("btn72"):
i.click()
sleep(1)
except Exception as e:
print (e)
print ("还没开始预订 "+str(count))
continue
sleep(1)
print ("开始预订...")
# sleep(3)
# self.driver.reload()
sleep(1)
print ('开始选择用户...')
for user in self.users:
#self.driver.find_by_text(user).last.click()
#self.driver.find_element_by_xpath("label[contains(text(),'"+user+"')]").click()
for i in self.driver.find_elements_by_tag_name("label"):
if i.text==user:
i.click()
print("选中"+user) print ("提交订单...")
sleep(1)
# self.driver.find_by_text(self.pz).click()
# self.driver.find_by_id('').select(self.pz)
# # sleep(1)
# self.driver.find_by_text(self.xb).click()
# sleep(1)
#self.driver.find_by_id('submitOrder_id').click()
self.driver.find_element_by_id('submitOrder_id').click()
# print u"开始选座..."
# self.driver.find_by_id('1D').last.click()
# self.driver.find_by_id('1F').last.click() sleep(1.5)
print ("确认选座...")
self.driver.find_element_by_id('qr_submit_id').click() except Exception as e:
print (e) cities= {'成都':'%u6210%u90FD%2CCDW',
'重庆':'%u91CD%u5E86%2CCQW',
'南昌':'%u5357%u660C%2CNCG',
'北京':'%u5317%u4EAC%2CBJP',
'广州':'%u5E7F%u5DDE%2CGZQ',
'杭州':'%u676D%u5DDE%2CHZH',
'宜昌':'%u5B9C%u660C%2CYCN',
'郑州':'%u90D1%u5DDE%2CZZF',
'深圳':'%u6DF1%u5733%2CSZQ',
'西安':'%u897F%u5B89%2CXAY',
'大连':'%u5927%u8FDE%2CDLT',
'武汉':'%u6B66%u6C49%2CWHN',
'上海':'%u4E0A%u6D77%2CSHH',
'南京':'%u5357%u4EAC%2CNJH',
'合肥':'%u5408%u80A5%2CHFH'} if __name__ == '__main__':
huoche=huoche()
huoche.starts=cities[sys.argv[1]]
huoche.ends = cities[sys.argv[2]]
huoche.dtime = sys.argv[3]
huoche.start()

12306 Pytho抢票代码的更多相关文章

  1. 13206抢票代码 py

    抢票代码 https://github.com/Bingshuli/12306Python 谷歌驱动 http://chromedriver.storage.googleapis.com/index. ...

  2. Python实例--12306的抢票功能

    基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...

  3. 抢票季:吐槽12306 & 分享抢票经验

    又是一年一度的春运抢票季,不管你是北上.南下或者东进,在外漂泊了一年,有钱没钱总是要回家过年的. [图片来源于网络] 吐槽:12306抢票的悲伤 据说12306改版了,新版本里面除了UI这些面儿上的改 ...

  4. 基于selenium+java的12306自动抢票

    import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys; ...

  5. 12306抢票系统——ER图及数据表

    12306自动抢票系统——ER图及数据表 1. 抢票系统ER图 数据表 2.抢票系统数据结构表 (1)列车表 Trains table 字段名 数据类型 说明 是否为主键 Train_id strin ...

  6. 归心似箭,IT达人分享抢票攻略

    [51CTO专稿]随着春节一天天临近,“购票难”的问题也愈发凸显,猎豹.火狐.360等“春运抢票神器”占领了各大网站的重要版面,“技术抢票”成为炙手可热的话题,看看身为程序员的邓以克是如何抢到回家的票 ...

  7. 春运到了,带你用python来抢票回家!

    不知不觉,一年一度的春运抢票大幕已经拉开,想快速抢到回家的车票吗?作为程序员,这些技术手段,你一定要知道. 为了让大家更快捷更便利的抢火车票,各种各样的抢票软件应需而生,这类软件大部分都是付费抢票的机 ...

  8. 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版

    时隔一年多,终于朋友的忽悠下吧抢票Demo的最后一步完善了,与2014年1月9日成功生成车票. Demo仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...

  9. c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇

    这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式, ...

随机推荐

  1. java中的死锁现象

    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. java 死锁产生的四个必要条件: 1.互斥使用,即当资源被一个线 ...

  2. 数据库学习笔记(二)MySQL数据库进阶

    MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...

  3. Aborted connection+druid

    试一试setTimeBetweenEvictionRunsMillis +setMaxEvictableIdleTimeMillis小于 mysql的wait_timeout

  4. 【总结整理】openlayer加载搜狗地图,qq地图,mapabc

    qq    http://www.cnblogs.com/gisvip/archive/2012/11/01/2750493.html mapabc    http://www.cnblogs.com ...

  5. 用C++的基本算法实现十个数排序

    冒泡排序法 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下 ...

  6. linux文件夹删除、创建

    一.删除文件夹 rm -rf ./html2imag 二.创建文件夹 mkdir html2image

  7. etl 获取列数据类型

    QueryInfo info = new QueryInfo(); info.CustomSQL = @" select column_name, data_type, data_preci ...

  8. C# 实现文件(夹)在ftp服务器间的同步【无需将文件(夹)保存到本地】

    C#实现不同ftp服务器间文件(夹)同步 图1 实现不同ftp服务器间文件(夹)同步的实现思路图 /// <summary> /// 将文件夹1从ftp服务器1移到ftp服务器2文件夹2 ...

  9. C++的运算符重载 (转)

      C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特 ...

  10. [转]Apple耳机兼容非Mac设置

    转至:https://jingyan.baidu.com/article/6079ad0e99858228ff86db19.html 不兼容情况描述: 听音乐貌似只能听见伴奏的声音 解决方法: 第一种 ...