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使用设计模式中的责任链模式与迭代器模式的示例
Mar 02 Python
浅谈Python中函数的参数传递
Jun 21 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
Django REST framework 单元测试实例解析
Nov 07 Python
vscode调试django项目的方法
Aug 06 Python
python简单利用字典破解zip文件口令
Sep 07 Python
Django视图类型总结
Feb 17 Python
Python实现Excel自动分组合并单元格
Feb 22 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 遍历XP文件夹下所有文件
2008/11/27 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
php while循环控制的简单实例
2016/05/30 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
使用Eclipse如何开发python脚本
2018/04/11 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年评职称工作总结
2014/11/20 职场文书
国庆阅兵观后感
2015/06/15 职场文书
安全教育第一课观后感
2015/06/17 职场文书
旷工检讨书大全
2015/08/15 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL