一百多行python代码实现抢票助手


Posted in Python onSeptember 25, 2018

一. 代码使用Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互。

二. 安装好Python 3或2都可以,然后安装Splinter `pip install Splinter

三. Splinter注意事项

    1. Splinter的Browser类默认优先使用firefox,所以用chrome的话,需要指定driver_name="chrome",只要养成一个习惯,不管用什么浏览器都指定,问题会出得少
    2. 当然,选择chrome的话,需要查看自己浏览器的版本,需要和chromedriver版本对应(不是版本号一致),参考和下载地址

四. Splinter.broser部分方法介绍

    1.  findbyid("控件id").first:根据id找到组件
    2.  visis(url):访问指定网址
    3.  fill("填充的内容"):用指定内容填充组件
    4.  click():点击事件
    5.  reload():重新加载当前文档

五. 主要思路:

    1. 自动填充用户名,密码,点击图片验证码(手动),自动点击购票查询,预订,自动选择指定乘客进入提交订单页面
    2. 除登录时的图片验证码,全程自动

六. error(下面是我已经尝试成功的):

    1. OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
    2. 解决方案:chromedriver版本和电脑浏览器版本映射没对应
    3. ImportError: cannot import name 'Browser'。
    4. 解决方案:是否安装了Splinter `pip install Splinter`,将代码文件和chromedriver放到一个新文件夹下,防止其他文件的影响
    5. 请在运行文件前,将代码内的乘客,用户名,密码正确填写好,检查cookies是否正确

七. cookies 查看

    1. 进入chrome浏览器,按F12,选中NetWork选项,如下图    
    2. 起始地址:`_jc_save_fromStation` 购票时间:`_jc_save_fromDate` 目的地:`_jc_save_toStation`

八.  运行方法

    1. python trainticket.py 天津 南昌 2018-02-10
    2. OK

九.  具体代码如下

# -*- coding:utf-8 -*-
 """
 @author Jianxiong Rao
 """
 from splinter.browser import Browser
 from time import sleep
 import traceback
 import time,sys
 import os
 
 class HuoChe(object):
  """docstring for Train"""
  driver_name=''
  executable_path=''
  #用户名 密码
  username = u"12306帐户名"
  passwd = u"12306密码"
  #cookies值自己找 
  # 天津%u5929%u6D25%2CTJP 南昌%u5357%u660C%2CNCG 桂林%u6842%u6797%2CGLZ
  starts = u"%u5929%u6D25%2CTJP"
  ends = u"%u5357%u660C%2CNCG"
  #时间格式2018-02-05
  dtime = u"2018-02-05"
  #车次,选择第几趟,0则从上之下依次点击
  order = 0
  ###乘客姓名
  users=[u'乘客名']
  ##席位
  xb=u"二等座"
  pz=u"成人票"
  """网址"""
  #12306查询URL
  ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
  #12306登录URL
  login_url = "https://kyfw.12306.cn/otn/login/init"
  #我的12306URL
  initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
  #购票URL
  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 = os.getcwd()+'/chromedriver'
   print("Welcome To Use The Tool")
  
  def login(self):
   self.driver.visit(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.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.driver.set_window_size(1400,1000)
   self.login()
   #sleep(1)
   self.driver.visit(self.ticket_url)
   try:
    print("购票页面开始....")
    #sleep(1)
    #加载查询信息
    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 = 0
    if self.order != 0:
     while self.driver.url == self.ticket_url:
      self.driver.find_bytext(u"查询").click()
      count += 1
      print("循环点击查询.... 第 %s 次"%count)
      #sleep(1)
      try:
       self.driver.find_by_text(u'预订')[self.order - 1].click()
      except Exception as e:
       print(e)
       print("还没开始预订")
       continue
    else :
     while self.driver.url == self.ticket_url:
      self.driver.find_by_text(u"查询").click()
      count += 1
      print("循环点击查询.... 第 %s 次"%count)
      #sleep(0.8)
      try:
       for i in self.driver.find_by_text(u"预订"):
        i.click()
        sleep(1)
      except Exception as e:
       print(e)
       print("还没开始预订 %s "%count)
       continue
    print("开始预订....")
    #sleep(1)
    #self.driver.reload()
    sleep(1)
    print("开始选择用户....")
    for user in self.users:
     self.driver.find_by_text(user).last.click()
    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()
    print("开始选座...")
    # self.driver.find_by_id('1D').last.click()
    # self.driver.find_by_id('1F').last.click()
    sleep(1.5)
    print("确认选座....")
    self.driver.find_by_text('qr_submit_id').click()
 
   except Exception as e:
    print(e)
 
 cities={
 '天津':'%u5929%u6D25%2CTJP',
 '南昌':'%u5357%u660C%2CNCG',
 '桂林':'%u6842%u6797%2CGLZ'
 }
 
 if __name__=="__main__":
  train = HuoChe()
  train.starts = cities[sys.argv[1]]
  train.ends = cities[sys.argv[2]]
  train.dtime = sys.argv[3]
  train.start()

十. 源码地址

12306Ticket

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python解析JSON数据的基本方法
Oct 15 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
python操作excel让工作自动化
Aug 09 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
Python StringIO如何在内存中读写str
Jan 07 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
python 下载文件的几种方式分享
Apr 07 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
python爬虫之自动登录与验证码识别
Jun 15 #Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 #Python
python绘制多个曲线的折线图
Mar 23 #Python
python使用Matplotlib绘制分段函数
Sep 25 #Python
python使用Matplotlib画饼图
Sep 25 #Python
python使用Matplotlib画条形图
Mar 25 #Python
python使用matplotlib画饼状图
Sep 25 #Python
You might like
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js变换显示图片的实例
2013/04/16 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
js实现放大镜特效
2017/05/18 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
Vue组件通信的四种方式汇总
2018/02/08 Javascript
three.js实现圆柱体
2018/12/30 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Django自定义分页效果
2017/06/27 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python中time库的实例使用方法
2019/10/31 Python
python实现简单井字棋游戏
2020/03/04 Python
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
新闻专业推荐信范文
2013/11/20 职场文书
房产转让协议书
2014/04/11 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
2014年网管工作总结
2014/12/11 职场文书
离职信范本
2015/06/23 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
Nginx HTTP跳转至HTTPS
2022/05/15 Servers