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深入学习之对象的属性
Aug 31 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python中new方法的详解
Jan 15 Python
python里dict变成list实例方法
Jun 26 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
pandas 对group进行聚合的例子
Dec 27 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
基于Python中random.sample()的替代方案
May 23 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
Python是怎样处理json模块的
Jul 16 Python
Python reques接口测试框架实现代码
Jul 28 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
vue接口请求加密实例
2020/08/11 Javascript
python通过zabbix api获取主机
2018/09/17 Python
python队列Queue的详解
2019/05/10 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
用python批量下载apk
2020/12/29 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
大专生的学习自我评价
2013/12/04 职场文书
3.12植树节活动总结2014
2014/03/13 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL