一百多行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中用fork()函数生成的子进程
May 04 Python
python采集百度百科的方法
Jun 05 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
python实现用户管理系统
Jan 10 Python
Python 查看文件的读写权限方法
Jan 23 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
python web框架 django wsgi原理解析
Aug 20 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
Jun 04 Python
python实现数字炸弹游戏
Jul 17 Python
python如何快速拼接字符串
Oct 28 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
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
python使用scrapy解析js示例
2014/01/23 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Python处理session的方法整理
2019/08/29 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
医学生自我鉴定范文
2014/03/26 职场文书
个人合作协议书范本
2014/04/18 职场文书
整改落实自查报告
2014/11/05 职场文书
超市督导岗位职责
2015/04/10 职场文书
大学生暑期实践报告
2015/07/13 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
讲解MySQL增删改操作
2022/05/06 MySQL