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. c语言-顺序表

    在数据结构中包含两种,一种线性结构(包括顺序表,链表,栈,队列),一种非线性结构(树,图), 顺序表,其实就是在内存动态数组,Java中的ArrayList就是一个典型的顺序表,它在顺序表的基础上增加 ...

  2. 重新认识synchronized(上)

    synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟R ...

  3. windows系统中启动应用需要的端口被别的程序占用

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  4. js利用数组实现队列与堆栈效果

    之前在写Android的时候,会用到很多的队列与堆栈方式,其实js利用数组可以简单的实现类似的效果. 队列实现 var queue = new Array(); // unshift() 方法可向数组 ...

  5. 【摘自张宴的"实战:Nginx"】Nginx的server指令

    server 语法:server name[parameters] 默认值:none 使用环境:upstream 该指令用于指定后端服务器的名称和参数.服务器的名称可以是一个域名.一个IP地址.端口号 ...

  6. 业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

    一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...

  7. Linux 大页面使用与实现简介(转)

    引言 随着计算需求规模的不断增大,应用程序对内存的需求也越来越大.为了实现虚拟内存管理机制,操作系统对内存实行分页管理.自内存“分页机制”提出之始,内存页面的默认大小便被设置为 4096 字节(4KB ...

  8. C语言-郝斌笔记-004判断是否为回文数

    判断是否为回文数 # include <stdio.h> int main(void) { int val; //存放待判断的数字 int m; ; printf("请输入您需要 ...

  9. JavaPersistenceWithHibernate第二版笔记-第七章-003Mapping an identifier bag(@OrderColumn、@ElementCollection、@CollectionTable、、)

    一.结构 二.代码 1. package org.jpwh.model.collections.listofstrings; import org.jpwh.model.Constants; impo ...

  10. 22、linux的ssh互信配置

    转载:https://blog.csdn.net/hrn1216/article/details/51568830 https://blog.csdn.net/u013144287/article/d ...