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操作串口的方法
Jun 17 Python
详解python单例模式与metaclass
Jan 15 Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 Python
Python打印输出数组中全部元素
Mar 13 Python
python实现简单银行管理系统
Oct 25 Python
提升python处理速度原理及方法实例
Dec 25 Python
关于python中的xpath解析定位
Mar 06 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Python pip使用超时问题解决方案
Aug 03 Python
PyQt5的相对布局管理的实现
Aug 07 Python
pytorch学习教程之自定义数据集
Nov 10 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 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
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
Python完全新手教程
2007/02/08 Python
Python常用模块用法分析
2014/09/08 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
python黑魔法之参数传递
2016/02/12 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python读文件的步骤
2019/10/08 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
广州盈通面试题
2015/12/05 面试题
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
三好学生自我鉴定
2013/12/17 职场文书
工艺员岗位职责
2014/02/11 职场文书
园艺师求职信
2014/04/27 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
介绍信怎么写
2015/01/30 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android