使用说明

  1. 程序运行开始,需要输入出发地,目的地,出发时间,乘客信息,车次;乘客信息和车次可以输入多个
  2. 刚刚开始学习爬虫,selenium仅仅是解放了双手,运行效率不是很高;
  3. 程序运行时会打开chrome浏览器,因为使用的是chrome的浏览器驱动;

相关文档

https://selenium-python.readthedocs.io/installation.html#introduction

代码示例

  1. # encoding: utf-8
  2. from selenium import webdriver
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.common.by import By
  6. import time
  7. class Qiangpiao(object):
  8. def __init__(self):
  9. driver_path = "E:\py_pachong\chromedriver.exe"
  10. # 浏览器驱动
  11. self.drive = webdriver.Chrome(executable_path=driver_path)
  12. # 登陆链接
  13. self.login_url = "https://kyfw.12306.cn/otn/login/init"
  14. # 登陆后的链接
  15. # 2018-11-29 更新,12306改版了,登陆后跳转的页面地址已变
  16. # self.initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
  17. self.initmy_url = "https://kyfw.12306.cn/otn/view/index.html"
  18. # 查询页面
  19. self.search_url = "https://kyfw.12306.cn/otn/leftTicket/init"
  20. # 乘车人页面
  21. self.passenger_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
  22. def wait_input(self):
  23. """
  24. 主要用于页面审核;
  25. 当输入出发地,目的地,乘车时间后,会自动出发查询submit
  26. :return:
  27. """
  28. self.from_station = input("出发地:")
  29. self.to_station = input("目的地:")
  30. self.depart_time = input("出发时间:")
  31. self.passengers = input("乘客姓名:").split(",")
  32. self.trains = input("车次:").split(",")
  33. def _login(self):
  34. """
  35. 登陆验证,登陆成功后会跳转到 self.initmy_url
  36. :return:
  37. """
  38. self.drive.get(self.login_url)
  39. WebDriverWait(self.drive, 1000).until(
  40. EC.url_to_be(self.initmy_url)
  41. )
  42. print('登录成功')
  43. def _order_ticket(self):
  44. """
  45. 只实现了在无票的情况下去刷票
  46. 最关键的是等待验证 WebDriverWait
  47. :return:
  48. """
  49. self.drive.get(self.search_url)
  50. WebDriverWait(self.drive, 1000).until(
  51. EC.text_to_be_present_in_element_value((By.ID, "fromStationText"), self.from_station)
  52. )
  53. WebDriverWait(self.drive, 1000).until(
  54. EC.text_to_be_present_in_element_value((By.ID, "toStationText"), self.to_station)
  55. )
  56. WebDriverWait(self.drive, 1000).until(
  57. EC.text_to_be_present_in_element_value((By.ID, "train_date"), self.depart_time)
  58. )
  59. WebDriverWait(self.drive, 10000).until(
  60. EC.element_to_be_clickable((By.ID, "query_ticket"))
  61. )
  62. searchBtn = self.drive.find_element_by_id("query_ticket")
  63. searchBtn.click()
  64. WebDriverWait(self.drive, 1000).until(
  65. EC.presence_of_element_located((By.XPATH, ".//tbody[@id='queryLeftTable']/tr"))
  66. )
  67. # find_elements_by_xpath 返回的是一个列表
  68. # find_element_by_xpath 返回的是一个元素
  69. tr_list = self.drive.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
  70. for tr in tr_list:
  71. train_num = tr.find_element_by_class_name("number").text
  72. # print(train_num)
  73. if train_num in self.trains:
  74. left_ticket_td = tr.find_element_by_xpath(".//td[4]").text
  75. num = 1
  76. while left_ticket_td == "无":
  77. print("暂时无票,正在刷新")
  78. time.sleep(2)
  79. searchBtn.click()
  80. num += 1
  81. print("抢票%s次" % num)
  82. if left_ticket_td != "无":
  83. print(train_num + "有票")
  84. oderBtn = tr.find_element_by_xpath(".//td[13]/a")
  85. oderBtn.click()
  86. WebDriverWait(self.drive, 1000).until(
  87. EC.url_to_be(self.passenger_url)
  88. )
  89. WebDriverWait(self.drive, 1000).until(
  90. EC.presence_of_element_located((By.XPATH, ".//ul[@id='normal_passenger_id']/li"))
  91. )
  92. passenger_labels = self.drive.find_elements_by_xpath(
  93. ".//ul[@id='normal_passenger_id']/li/label")
  94. for passenger_label in passenger_labels:
  95. name = passenger_label.text
  96. if name in self.passengers:
  97. passenger_label.click()
  98. submitBtn = self.drive.find_element_by_id("submitOrder_id")
  99. submitBtn.click()
  100. WebDriverWait(self.drive, 1000).until(
  101. EC.presence_of_element_located((By.CLASS_NAME, "dhtmlx_wins_body_outer"))
  102. )
  103. WebDriverWait(self.drive, 1000).until(
  104. EC.presence_of_element_located((By.ID, "qr_submit_id"))
  105. )
  106. qr_submit = self.drive.find_element_by_id("qr_submit_id")
  107. qr_submit.click()
  108. def run(self):
  109. self.wait_input()
  110. self._login()
  111. self._order_ticket()
  112. if __name__ == '__main__':
  113. spider = Qiangpiao()
  114. spider.run()

python+selenium实现自动抢票的更多相关文章

  1. python自动抢票

    # -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback ...

  2. Python实例--12306的抢票功能

    基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...

  3. python之12306自动查票

      一.导读 本篇文章所采用的技术仅用于学习.研究,任何其他用途请自行承担后果. 12306自动查票使用到的python库主要是splinter,同时也涉及到查票的城市编码,具体的城市编码请在网络上搜 ...

  4. Python+Appium实现自动抢微信红包

    前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...

  5. c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇

    这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式, ...

  6. Python 实现的 12306抢票脚本

    Python12306抢票脚本 本脚本使用一个类来实现所有代码,大体上分为以下几个模块及其步骤:- 初始化对象属性(在抢票前进行的属性初始化,包括初始化浏览器模拟对象,个人信息等).- 建立模拟浏览器 ...

  7. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器

    写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...

  8. 360自动抢票还不够,几行js代码设置无人值守

    360就是牛逼哄哄的...... 但是最近在使用360浏览器抢票的时候还是发现了一些体验不好的地方,比如搞着搞着就退出了登录,有时候能帮你自动登录进去,但是自动登录之后又不会帮你自动开始抢.然后验证码 ...

  9. 基于selenium+java的12306自动抢票

    import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys; ...

随机推荐

  1. 树的各种操作java

    package mystudy; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import ja ...

  2. Node Sass could not find a binding for your current environment

    Node环境从8升级到10后,Node Sass could not find a binding for your current environment 标签(空格分隔): Node Node环境 ...

  3. 修改容器的hosts文件

    修改容器的hosts文件 1.介绍 docker容器中的hosts文件虽然在宿主机磁盘上/var/lib/docker/containers/xxx/hosts中,但是修改该文件是无效的,需要通过其他 ...

  4. 学习的矩阵微积分The matrix calculus you need for deep learning

    学习的矩阵微积分The matrix calculus you need for deep learning https://explained.ai/matrix-calculus/index.ht ...

  5. Kafka与MQ的区别

    作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强, 而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可 ...

  6. MATLAB入门学习(整合)

    整合一下,都是链接地址: MATLAB入门学习(一):初次使用.. MATLAB入门学习(二):矩阵相关 MATLAB入门学习(三):矩阵常用函数 MATLAB入门学习(四):编写简单.m文件和函数文 ...

  7. UVA12034 Race

    嘟嘟嘟 令dp[i]表示在n个人中,有 i 个人获得第一名的方案数,转移方程为dp[i] = C(i, n) * dp[n - i].C(i, n)就是从n个人中选 i 个第一,那么剩下的n - i ...

  8. 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取

    thymeleaf公共页面元素抽取 存在一种现象:两个文件的代码只有一部分代码不一样 其余的均相同,此时就可以提取公共的代码去简化开发 .抽取公共片段 <div th:fragment=&quo ...

  9. Redis数据类型(下)

    集合Set    Redis 的集合不是 个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来 存储和查找数据,理论上 个集合可以存储 232 (大约 42 亿)个元素,因为采用哈希表结 ...

  10. python-递归的实现

    一.概念 递归算法是一种直接或者间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有一个明确的 ...