一、需要的模块

pip install splinter

二、下载浏览器的驱动(chrome或者火狐都可以)

chrome浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
Firefox浏览器驱动下载地址,请点击https://github.com/mozilla/geckodriver/releases
备注:
1、根据下载的自己的电脑系统选择下载包,我的windows就用win32了,这边我直接用的火狐的,因为chrome驱动太多了,我也不知道哪一个版本(建议从最新的一个个试)。
将下载好的驱动解压到PATH路径目录下,当然也可以给这个驱动程序弄个环境变量。
2、我这边通过爬虫将chrome所有的驱动版本已经下载好了,也有firefox驱动
https://pan.baidu.com/s/1bqUVvrx

三、测试
1、利用百度搜索一些东西

#!/usr/bin/env python
#-*- coding:utf-8 -*-from splinter.browser import Browser
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit("http://www.baidu.com") 

2、输入一些像搜索的内容

由上可以发现,该输入框的name=wd,通过fill似乎只能通过name填充

在输入框搜索 360,当然也可以输入中文,但是最好指定Unicode编码,如u”你好”
代码如下:

b.fill("wd","360")

但是,如果多次搜索,我们还是需要点击”百度一下”的
百度搜索栏的value=”百度一下”,id=”su”,所以需要把这个按钮提取出来

button = b.find_by_value(u"百度一下")
或者
button = b.find_by_id(u"su")#点击
button.click()

我们找找页面里有没有我想找的东西吧,比如找找有没有这个地址”splinter.cobrateam.info”

b.is_text_present("splinter.cobrateam.info")  #如果该页面存在,则返回True,反之亦然
b.quit()      #退出

四、购票程序思路讲解
1、手动登陆,能通过下面的代码填充表单,但是我跳不过验证码,还是等手动选择验证码的。

#!/usr/bin/env python
#-*- coding:utf-8 -*-from splinter.browser import Browser
url = "https://kyfw.12306.cn/otn/leftTicket/init"
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit(url)
b.find_by_text(u"登录").click()
b.fill("loginUserDTO.user_name","xxxx")
b.fill("userDTO.password","xxxx")

2、第二部选择出发地点日期等
通过cookies选择出发地点,日期及目的地,这些数据需要自己去copy

3、添加出发地,出发日期,目的地

b.cookies.add({"_jc_save_fromStation":u"%u4E0A%u6D77%2CSHH"})
b.cookies.add({"_jc_save_fromDate":u"2018-02-08"})
b.cookies.add({u'_jc_save_toStation':u"%u77F3%u5BB6%u5E84%2CSJP"})

备注:如果是修改的话,还是调用add方法,如果传入的字典key值已存在则替换
比如,将目的地改为其他地方xxxx,如下即可
b.cookies.add({u’_jc_save_toStation’:’xxxxxx’})

4、查看现在的cookies值

{u'BIGipServerotn': u'1406730506.50210.0000',u'JSESSIONID': u'4674AFC0B20A054C12A6F652093F31D6',u'__NRF': u'95D48FC2E0E15920BFB61C7A330FF2AE',u'_jc_save_fromDate': u'2018-02-08',u'_jc_save_fromStation': u'%u4E0A%u6D77%2CSHH',u'_jc_save_toStation': u'%u77F3%u5BB6%u5E84%2CSJP',u'current_captcha_type': u'Z'}

5、cookies已经准备完毕,reload一下,开始查询

b.reload()
b.find_by_text(u"查询").click()

到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。

6、选择要预定的火车车次

从我自己坐的火车线路来看,一共11趟,我只想做高铁,那么我的预订在第9个,索引值为8。

b.find_by_text(u"预订")[8].click()

7、选择乘客

b.find_by_text(u"你的姓名")[1].click()

五、购买火车票完整代码

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from splinter.browser import Browser
from time import sleep
cookie_value = {'上海':u"%u4E0A%u6D77%2CSHH",'砀山':u"%u7800%u5C71%2CDKH",'石家庄北':u"%u77F3%u5BB6%u5E84%2CSJP",'广州':u'%u5E7F%u5DDE%2CGZQ','东莞东':u'%u4E1C%u839E%u4E1C%2CDMQ','营山':u'%u8425%u5C71%2CNUW'
}
class buy_ticket_proc(object):driver_name = ''executable_path = ''#12306的账号和密码username = "xxxxxxx"passwd = "xxxxxxx"# cookies值和乘车日期starts = cookie_value['上海']ends = cookie_value['石家庄北']dtime = u"2018-02-08"# 车次,选择第几趟,0则从上之下依次点击#order = 0order = [9,11]###乘客名users = [u"xxx",u"xxx"]##席位xb = u"二等座"pz = u"成人票""""购票网址"""login_url = "https://kyfw.12306.cn/otn/login/init"ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"buy = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"def __init__(self):self.driver_name = 'firefox'self.executable_path = r'E:\Mysql\mysql-5.6\bin\geckodriver'   #这个路径自己指定,只有系统可以找到即可def login(self):self.driver.visit(self.login_url)self.driver.fill("loginUserDTO.user_name", self.username)self.driver.fill("userDTO.password", self.passwd)print("等待验证码,自行输入...")while True:if self.driver.url != self.initmy_url:passelse:breakdef start(self):self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)self.login()self.driver.visit(self.ticket_url)try:print("购票页面开始...")self.driver.cookies.add({"_jc_save_fromStation": self.starts})self.driver.cookies.add({"_jc_save_toStation": self.ends})self.driver.cookies.add({"_jc_save_fromDate": self.dtime})self.driver.reload()count = 0if len(self.order) != 0:while self.driver.url == self.ticket_url:self.driver.find_by_text(u"查询").click()count += 1print("循环点击查询... 第 %s 次" % count)sleep(1)try:for i in self.order:self.driver.find_by_text(u"预订")[ i - 1].click()except Exception as e:print("还没开始预订")continueelse:while self.driver.url == self.ticket_url:self.driver.find_by_text(u"查询").click()count += 1print("循环点击查询... 第 %s 次" % count)try:for i in self.driver.find_by_text(u"预订"):i.click()except Exception as e:print("还没开始预订 %s" % count)continueprint("开始预订...")sleep(1)print('开始选择用户...')for user in self.users:self.driver.find_by_text(user).last.click()print("提交订单...")self.driver.find_by_id('submitOrder_id').click()print("确认选座...")self.driver.find_by_id('qr_submit_id').click()except Exception as e:print(e)
if __name__ == '__main__':ticket = buy_ticket_proc()ticket.start()

用Python抢过年回家火车票相关推荐

  1. python123判断火车票座位号分布图_面向回家编程!GitHub标星两万的Python抢票教程”,我们先帮你跑了一遍...

    原标题:面向回家编程!GitHub标星两万的"Python抢票教程",我们先帮你跑了一遍 大数据文摘出品 作者:曹培信.池俊辉 盼望着,盼望着, 春节的脚步近了, 然而,每年到这个 ...

  2. 用python抢火车票

    原文地址:http://youerning.blog.51cto.com/10513771/1719159 前言:大家跟我一起念,Python***好,跟着本宝宝用Python抢火车票 首先我们需要s ...

  3. 有人用python抢到过吗_再不看就晚了,我用Python抢到了回家的火车票!

    原标题:再不看就晚了,我用Python抢到了回家的火车票! 不知不觉,一年一度的春运抢票大幕已经拉开,想快速抢到回家的车票吗?作为程序员,这些技术手段,你一定要知道. 为了让大家更快捷更便利的抢火车票 ...

  4. python抢购火车票源代码_Python动刷新抢12306火车票的代码(附源码)

    摘要:这篇Python开发技术栏目下的"Python动刷新抢12306火车票的代码(附源码)",介绍的技术点是"12306火车票.Python.12306.附源码.火车票 ...

  5. python12306抢学生票票下载_再不看就晚了,我用Python抢到了回家的火车票!

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

  6. 用python抢火车票_Python3实现抢火车票功能(中)

    导语 在"python抢火车票(上)"一文中我们完成了项目内容1和项目内容2,即利用python实现火车/高铁票查询功能以及利用python实现抢火车/高铁票功能,对项目内容1和项 ...

  7. python抢火车票_听说你能用 Python 帮我抢火车票?!

    原标题:听说你能用 Python 帮我抢火车票?! 文 | 车栗子 来源 |量子位公众号 想要十一回家的小伙伴们,大概刚刚经历了一波抢票大战. 顺便把一个Python抢票工具,送到了GitHub趋势榜 ...

  8. python抢购火车票源代码_用Python抢过年的火车票附源码

    前言:大家跟我一起念,Python大法好,跟着本宝宝用Python抢火车票 首先我们需要splinter 安装: pip install splinter -i http://pypi.douban. ...

  9. python抢票12306源码_Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统效果图如下所示: 具体代码如下所示: import urllib.request as request import http.cookiejar as coo ...

最新文章

  1. ubuntu18.04.4 录制麦克风音频
  2. Js 拦截全局ajax请求
  3. 构建iOS持续集成平台(三)——CI服务器与自动化部署
  4. 网关Ocelot功能演示安排的明明白白~~~
  5. 使用python读取kafka实时topic数据demo,包括安装kafka module
  6. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
  7. Java Web开发实战(一)—JDK安装及环境变量配置
  8. (转)AI泡沫已现:资金多而项目缺,周期长而营收难
  9. 《托马斯微积分》阅读笔记1
  10. python360_Python实现360账号登录
  11. 通过bind实现DNS服务
  12. 云原生背景下的运维价值思考与实践
  13. Okhttp源码分析以及Google Gson解析json数据实例
  14. OpenCV的viz库学习(一)
  15. 学术应用使用node-http-proxy集成谷歌学术
  16. 用C语言程序实现两个字符串的连接
  17. c语言打字游戏程序设计报告,打字游戏程序设计汇报.doc
  18. R 语言 state 数据集的可视化
  19. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)
  20. Educoder_Web_移动端电商页面制作

热门文章

  1. Win32 串口通信
  2. Hybrid APP 混合开发模式简介
  3. 用示波器测量I2C进行时序图、波形等分析
  4. 【游戏逆向】一款单机游戏明文包分析
  5. 书论01 李斯《用笔法》
  6. Godot 3.4 AndroidStudio 联合开发配置 解决Godot apk签名 一库多key问题
  7. Download Fail:FireHouse Fail
  8. 软件架构模式和设计模式(书摘)
  9. centos7防火墙命令汇总
  10. Makefile文件的简单编写