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如何实现MySQL实例初始化详解
Nov 06 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Python + selenium自动化环境搭建的完整步骤
May 19 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
python 实现简单的FTP程序
Dec 27 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
python实现tail -f 功能
Jan 17 Python
利用python生成照片墙的示例代码
Apr 09 Python
python根据字典的键来删除元素的方法
Aug 16 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 Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php中return的用法实例分析
2015/02/28 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
jquery cookie插件代码类
2009/05/26 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
理解JS绑定事件
2016/01/19 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
PHP如何对用户密码进行加密
2014/07/31 面试题
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书