python+selenium实现自动抢票功能实例代码


Posted in Python onNovember 23, 2018

简介

什么是Selenium?

Selenium是ThoughtWorks公司的一个强大的开源Web功能测试工具系列,采用Javascript来管理整个测试过程,包括读入测试套件、执行测试和记录测试结果。它采用Javascript单元测试工具JSUnit为核心,模拟真实用户操作,包括浏览页面、点击链接、输入文字、提交表单、触发鼠标事件等等,并且能够对页面结果进行种种验证。也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。(Selenium的核心是Javascript写的,他和浏览器进行通信,把测试用例的信息发送给浏览器执行,从而达到自动化测试的目的。)

使用说明

程序运行开始,需要输入出发地,目的地,出发时间,乘客信息,车次;乘客信息和车次可以输入多个
刚刚开始学习爬虫,selenium仅仅是解放了双手,运行效率不是很高;
程序运行时会打开chrome浏览器,因为使用的是chrome的浏览器驱动;

相关文档

https://selenium-python.readthedocs.io/installation.html#introduction

代码示例

# encoding: utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
class Qiangpiao(object):
  def __init__(self):
    driver_path = "E:\py_pachong\chromedriver.exe"
    # 浏览器驱动
    self.drive = webdriver.Chrome(executable_path=driver_path)
    # 登陆链接
    self.login_url = "https://kyfw.12306.cn/otn/login/init"
    # 登陆后的链接
    self.initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
    # 查询页面
    self.search_url = "https://kyfw.12306.cn/otn/leftTicket/init"
    # 乘车人页面
    self.passenger_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
  def wait_input(self):
    """
    主要用于页面审核;
    当输入出发地,目的地,乘车时间后,会自动出发查询submit
    :return:
    """
    self.from_station = input("出发地:")
    self.to_station = input("目的地:")
    self.depart_time = input("出发时间:")
    self.passengers = input("乘客姓名:").split(",")
    self.trains = input("车次:").split(",")
  def _login(self):
    """
    登陆验证,登陆成功后会跳转到 self.initmy_url
    :return:
    """
    self.drive.get(self.login_url)
    WebDriverWait(self.drive, 1000).until(
      EC.url_to_be(self.initmy_url)
    )
    print('登录成功')
  def _order_ticket(self):
    """
    只实现了在无票的情况下去刷票
    最关键的是等待验证 WebDriverWait
    :return:
    """
    self.drive.get(self.search_url)
    WebDriverWait(self.drive, 1000).until(
      EC.text_to_be_present_in_element_value((By.ID, "fromStationText"), self.from_station)
    )
    WebDriverWait(self.drive, 1000).until(
      EC.text_to_be_present_in_element_value((By.ID, "toStationText"), self.to_station)
    )
    WebDriverWait(self.drive, 1000).until(
      EC.text_to_be_present_in_element_value((By.ID, "train_date"), self.depart_time)
    )
    WebDriverWait(self.drive, 10000).until(
      EC.element_to_be_clickable((By.ID, "query_ticket"))
    )
    searchBtn = self.drive.find_element_by_id("query_ticket")
    searchBtn.click()
    WebDriverWait(self.drive, 1000).until(
      EC.presence_of_element_located((By.XPATH, ".//tbody[@id='queryLeftTable']/tr"))
    )
    # find_elements_by_xpath 返回的是一个列表
    # find_element_by_xpath 返回的是一个元素
    tr_list = self.drive.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
    for tr in tr_list:
      train_num = tr.find_element_by_class_name("number").text
      # print(train_num)
      if train_num in self.trains:
        left_ticket_td = tr.find_element_by_xpath(".//td[4]").text
        num = 1
        while left_ticket_td == "无":
          print("暂时无票,正在刷新")
          time.sleep(2)
          searchBtn.click()
          num += 1
          print("抢票%s次" % num)
          if left_ticket_td != "无":
            print(train_num + "有票")
            oderBtn = tr.find_element_by_xpath(".//td[13]/a")
            oderBtn.click()
            WebDriverWait(self.drive, 1000).until(
              EC.url_to_be(self.passenger_url)
            )
            WebDriverWait(self.drive, 1000).until(
              EC.presence_of_element_located((By.XPATH, ".//ul[@id='normal_passenger_id']/li"))
            )
            passenger_labels = self.drive.find_elements_by_xpath(
              ".//ul[@id='normal_passenger_id']/li/label")
            for passenger_label in passenger_labels:
              name = passenger_label.text
              if name in self.passengers:
                passenger_label.click()
            submitBtn = self.drive.find_element_by_id("submitOrder_id")
            submitBtn.click()
            WebDriverWait(self.drive, 1000).until(
              EC.presence_of_element_located((By.CLASS_NAME, "dhtmlx_wins_body_outer"))
            )
            WebDriverWait(self.drive, 1000).until(
              EC.presence_of_element_located((By.ID, "qr_submit_id"))
            )
            qr_submit = self.drive.find_element_by_id("qr_submit_id")
            qr_submit.click()
  def run(self):
    self.wait_input()
    self._login()
    self._order_ticket()
if __name__ == '__main__':
  spider = Qiangpiao()
  spider.run()

总结

以上所述是小编给大家介绍的python+selenium实现自动抢票功能实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
深入理解python中的atexit模块
Mar 07 Python
python递归查询菜单并转换成json实例
Mar 27 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
Python PIL图片添加字体的例子
Aug 22 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
python3中数组逆序输出方法
Dec 01 Python
3分钟学会一个Python小技巧
Nov 23 #Python
值得收藏,Python 开发中的高级技巧
Nov 23 #Python
python 常见字符串与函数的用法详解
Nov 23 #Python
django+mysql的使用示例
Nov 23 #Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 #Python
Windows下Python3.6安装第三方模块的方法
Nov 22 #Python
Python第三方Window模块文件的几种安装方法
Nov 22 #Python
You might like
PHP实现视频文件上传完整实例
2014/08/28 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
基于datagrid框架的查询
2013/04/08 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python正则表达式教程之二:捕获篇
2017/03/02 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
公务员个人总结
2015/02/12 职场文书
会计专业求职信范文
2015/03/19 职场文书
生活委员竞选稿
2015/11/21 职场文书
golang json数组拼接的实例
2021/04/28 Golang
python中的getter与setter你了解吗
2022/03/24 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis