一百多行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、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
django DRF图片路径问题的解决方法
Sep 10 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
选择python进行数据分析的理由和优势
Jun 25 Python
python 并发下载器实现方法示例
Nov 22 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
python eventlet绿化和patch原理
Nov 21 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代码
2012/09/14 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
详解python中的json的基本使用方法
2016/12/21 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
采购部岗位职责
2013/11/24 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
学校募捐倡议书
2014/05/14 职场文书
行政诉讼答辩状
2015/05/21 职场文书
如何写观后感
2015/06/19 职场文书
医院见习总结
2015/06/24 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书