使用说明

程序运行开始,需要输入出发地,目的地,出发时间,乘客信息,车次;乘客信息和车次可以输入多个
刚刚开始学习爬虫,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"
        # 登陆后的链接
        # 2018-11-29 更新,12306改版了,登陆后跳转的页面地址已变
        # self.initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
        self.initmy_url = "https://kyfw.12306.cn/otn/view/index.html"
        # 查询页面
        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实现自动抢票的更多相关文章

  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. mysql主从同步与防火墙端口的设定

    一.背景: 之前做主从同步时,把从库防火墙关了,现在开启防火墙后,从库不同步了 二.解决思路: 1.首先查看了mysql占用的端口,然后开启,tcp/udp都开了,结果还是不行 firewall-cm ...

  2. .NET事务

    概述 事务ACID特性 事务将一系列的工作视为一个工作单元,它具有 ACID 特性: A:Atomicity 不可分性也就是说事务中有多项工作,如果有一项工作失败了,整个事务就算失败了. C:Cons ...

  3. 自开发Web应用和SAP Customer Data Cloud Identity服务的集成

    今天的文章继续由SAP成都研究院的云时代女王,Aviva给大家分享关于SAP Customer Data Cloud的一些使用经验. Aviva之前的文章可以在本文末尾处获得. 下面是她的正文. 大家 ...

  4. AngularJS中页面传参方法

    1.基于ui-router的页面跳转传参 (1) 用ui-router定义路由,比如有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的 ...

  5. 在编译器中调试spark程序处理

    在IDEA中调试spark程序会报错 18/05/16 07:33:51 WARN NativeCodeLoader: Unable to load native-hadoop library for ...

  6. oracle数据库恢复归档脚本

    cat restorearch1.sh rman target / << EOFRUN {SET ARCHIVELOG DESTINATION TO '/archlog1/db2_arch ...

  7. 数据元&数据字典&元数据

    1. 数据元 data element(数据元素),单个数据单元,是数据的基本单位.参阅data field(数据字段). 2. 元数据 首先,我们举个例子来看看什么叫做“元”,在后现代主义文学中有一 ...

  8. 转-四种方案解决ScrollView嵌套ListView问题

    本人网上用的ID是泡面或安卓泡面,学习一年半之前开始从事Android应用开发,这是我写的第一篇Android技术文章,转载请注明出处和作者,有写的不好的地方还请帮忙指出,谢谢. 在工作中,曾多次碰到 ...

  9. 走进__proto__属性,看ie是否支持它,谁又来给他归宿

    每一个引用类型的实例中,都有一个指针,指向其原型对象.这个指针在非IE浏览器里通过__proto__表示,而在IE里不提供. 看如下代码: obj = {}; obj.__proto__.toStri ...

  10. mysql错误errno:121

    121错误是因为外键名重复.在同一个库中外键是不允许与其他外键重名的. 遇到这个错误请给你定义的外键换唯一无重复的名字. 同时查阅到外键也有可能导致150错误. Can't create table ...