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实现神经网络感知器算法
Dec 20 Python
Python字典及字典基本操作方法详解
Jan 30 Python
python实现将读入的多维list转为一维list的方法
Jun 28 Python
Python实现的特征提取操作示例
Dec 03 Python
python二进制文件的转译详解
Jul 03 Python
Django MEDIA的配置及用法详解
Jul 25 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
flask项目集成swagger的方法
Dec 09 Python
Python实现疫情地图可视化
Feb 05 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
Django自定义认证方式用法示例
2017/06/23 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
python实现石头剪刀布小游戏
2021/01/20 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
大学生军训广播稿
2014/01/24 职场文书
综合实践教学反思
2014/01/31 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
企业2014年度工作总结
2014/12/10 职场文书
初中作文评语
2014/12/25 职场文书
高中班主任评语
2014/12/30 职场文书
党员倡议书
2015/01/19 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers