12306火车票余票自动查询 Python selenium

12306火车票余票自动查询 Python selenium

废话不多说,直接上代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2022/1/15 下午12:08
# @Author  : H贤笙
# @File    : 12306_info.py

import json
import time
from captcha import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import wait
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC

try:
    options = webdriver.ChromeOptions()
    options.add_argument("--disable-blink-features=AutomationControlled")
    browser = webdriver.Chrome(options=options)
    browser.maximize_window()
    url = 'https://www.12306.cn/index/index.html'
    browser.get(url)
except:
    print("12306打开失败!")
    browser.close()

browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()
browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()
try:
    browser.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
except:
    pass

# 余票查询
# 将出发地、目的地、出发日期填进去
def input_info():
    print('=====开始查询=====')
    # 出发地
    from_station = browser.find_element_by_id("fromStationText")
    from_station.click()
    # time.sleep(1)
    from_station.send_keys(start_station)
    from_station.send_keys(Keys.ENTER)
    time.sleep(0.5)

    # 目的地
    to_station = browser.find_element_by_id("toStationText")
    to_station.click()
    to_station.send_keys(end_station)
    to_station.send_keys(Keys.ENTER)
    time.sleep(0.5)

    # 找到出发站、到达站的隐藏HTML标签
    js = "document.getElementById('train_date').removeAttribute('readonly')"  # 去除日期栏只读属性
    browser.execute_script(js)

    start_date = browser.find_element_by_id("train_date")
    start_date.clear()
    start_date.send_keys(date)  # 写入乘车日期
    start_date.click()
    time.sleep(0.5)

    # 执行单击查询操作
    query_ticket_tag = browser.find_element_by_id('query_ticket')
    query_ticket_tag.click()

def buy_ticket():
    # 依次查找trains中的车次是否有票,有的话点击购买
    trList = browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")

    for tr in trList:
        trainNum = tr.find_element_by_class_name("number").text
        #     print(trainNum)
        if trainNum in trains:
            leftTicket = tr.find_element_by_xpath(".//td[4]").text
            print('leftTicket', leftTicket)
            if leftTicket == '有' or leftTicket.isdigit():
                orderBtn = tr.find_element_by_class_name("btn72")
                orderBtn.click()
                browser.implicitly_wait(5)
                passengerLabels = browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")
                for passengerLabel in passengerLabels:
                    name = passengerLabel.text
                    if name in names:
                        passengerLabel.click()
                browser.implicitly_wait(20)
                # 获取提交按钮
                submitBtn = browser.find_element_by_id("submitOrder_id")
                submitBtn.click()
                browser.implicitly_wait(20)
                confirmBtn = browser.find_element_by_id("qr_submit_id")
                confirmBtn.click()
                time.sleep(2)
                browser.implicitly_wait(20)
                confirmBtn = browser.find_element_by_id("qr_submit_id")
                confirmBtn.click()
                break
            elif leftTicket == '候补':
                print("目前只有候补车票!")


if __name__ == '__main__':
    purpose = 'ADULT'  # 购买成人票,如果是学生票,需调整代码
    date = '2022-01-29'  # 填写购票日期
    start_station = '合肥南'  # 购票出发站
    end_station = '十堰东'  # 购票目的站
    trains = ['G3231']  # 你想买的班次

    input_info()
    time.sleep(0.5)
    buy_ticket()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值