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 相关文章推荐
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python3将视频流保存为本地视频文件
Jun 20 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
python调用staf自动化框架的方法
Dec 26 Python
python障碍式期权定价公式
Jul 19 Python
基于python二叉树的构造和打印例子
Aug 09 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python urllib3软件包的使用说明
Nov 18 Python
深入探讨opencv图像矫正算法实战
May 21 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
Python软件包安装的三种常见方法
Jul 07 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
python距离测量的方法
2018/03/06 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python中的asyncio代码详解
2019/06/10 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
python生成随机红包的实例写法
2019/09/02 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
我的网上商城创业计划书
2013/12/26 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
国旗下的演讲稿
2014/05/08 职场文书
2014年德育工作总结
2014/11/20 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python