一百多行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运用于数据分析的简单教程
Mar 27 Python
python如何将图片转换为字符图片
Aug 19 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
Python实现端口检测的方法
Jul 24 Python
python3的输入方式及多组输入方法
Oct 17 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
Django的Modelforms用法简介
Jul 27 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
python实现定时同步本机与北京时间的方法
2015/03/24 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
python文件的md5加密方法
2016/04/06 Python
python实现SMTP邮件发送功能
2020/06/16 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
Java里面有没有全局变量?为什么?
2015/02/06 面试题
大学同学聚会邀请函
2014/01/19 职场文书
公司任命书范本
2014/06/04 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
舞出我人生观后感
2015/06/16 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
浅谈Python协程asyncio
2021/06/20 Python
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫