python自动12306抢票软件实现代码

下面是详细讲解python自动12306抢票软件实现代码的攻略。

下面是详细讲解python自动12306抢票软件实现代码的攻略。

1. 网络爬虫

首先,我们需要用网络爬虫获取12306网站的车次余票信息。这里我们推荐使用Python的requests库和BeautifulSoup库获取网页内容和解析HTML。代码示例如下:

import requests
from bs4 import BeautifulSoup

# 获取余票信息
def get_remaining_tickets(train_date, from_station, to_station):
    url = 'https://kyfw.12306.cn/otn/leftTicket/query'
    params = {
        'leftTicketDTO.train_date': train_date,   # 乘车日期
        'leftTicketDTO.from_station': from_station,   # 出发站代码
        'leftTicketDTO.to_station': to_station,   # 到达站代码
        'purpose_codes': 'ADULT'   # 车票类型
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, params=params, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    tickets = soup.select('.ticket-info > .btn72')
    remaining_tickets = []
    for ticket in tickets:
        remaining_ticket = str(ticket).strip().replace('<br/>', ' ')
        remaining_tickets.append(remaining_ticket)
    return remaining_tickets

该函数从12306网站获取指定日期、出发站、到达站的余票信息。其中,train_date为乘车日期(格式为yyyy-mm-dd),from_station和to_station分别为出发站和到达站的代码。

2. 登录与验证

要完成自动抢票,必须先登录12306网站,获取验证信息。登录和验证过程十分重要,必须注意验证码有效期较短,程序必须在验证期间内进行登录。我们推荐使用Selenium库模拟登录和模拟点击验证码。代码示例如下:

import time
from selenium import webdriver

def login(username, password):
    driver = webdriver.Chrome()
    driver.get('https://kyfw.12306.cn/otn/login/init')
    # 在网页加载完成后等待输入用户名和密码
    time.sleep(5)
    driver.find_element_by_id('username').send_keys(username)
    driver.find_element_by_id('password').send_keys(password)
    input('完成登录后按Enter键继续')
    return driver

该函数打开Chrome浏览器,进入12306网站登录界面,并填写用户名和密码。填写完成后,程序暂停等待手动输入验证码。登录成功后,函数返回一个浏览器对象,使用该对象实现后续操作。

3. 提交订单

登录成功后,我们需要提交订单以获得车票。同样,该过程较为复杂,需要填写许多订单信息,并应对可能出现的错误。我们推荐使用Selenium库填写订单表单,并捕获错误进行处理。代码示例如下:

import datetime
import time

def submit_order(driver, train_date, from_station, to_station, seat_type):
    # 打开购票页面
    driver.get('https://kyfw.12306.cn/otn/leftTicket/init')
    # 选择出发站和到达站
    driver.find_element_by_id('fromStationText').click()
    driver.find_element_by_id('fromStationText').clear()
    driver.find_element_by_id('fromStationText').send_keys(from_station)
    time.sleep(1)
    driver.find_element_by_xpath('/html/body/div[6]/div[2]/div[1]/div[2]/ul/li[1]').click()
    driver.find_element_by_id('toStationText').click()
    driver.find_element_by_id('toStationText').clear()
    driver.find_element_by_id('toStationText').send_keys(to_station)
    time.sleep(1)
    driver.find_element_by_xpath('/html/body/div[7]/div[2]/div[1]/div[2]/ul/li[1]').click()
    # 选择乘车日期
    js = 'document.getElementById("train_date").removeAttribute("readonly")'
    driver.execute_script(js)
    driver.find_element_by_id('train_date').clear()
    driver.find_element_by_id('train_date').send_keys(train_date)
    driver.find_element_by_id('train_date').click()
    # 点击查询按钮查询余票信息
    driver.find_element_by_id('query_ticket').click()
    time.sleep(3)
    # 选择座位类型
    seat_type_element = driver.find_element_by_xpath('//*[@id="tbody_list"]/tr[1]/td[4]')
    seat_type_str = seat_type_element.get_attribute('title')
    if seat_type not in seat_type_str:
        return False
    # 点击预定按钮
    driver.find_element_by_css_selector('tr[id^="ticket_"] .btn72').click()
    time.sleep(3)
    # 选择乘客和座位类型
    driver.find_element_by_id('seatType_' + seat_type).click()
    driver.find_element_by_id('submitOrder_id').click()
    # 确认订单信息
    driver.find_element_by_id('qr_submit_id').click()
    time.sleep(3)
    # 检查是否成功提交订单
    if 'submitOrderAction.do?method=initForMy12306' not in driver.current_url:
        return False
    return True

该函数通过填写表单的方式提交订单并获得车票。其中,train_date、from_station、to_station、seat_type分别表示乘车日期、出发站、到达站和座位类型。使用该函数后,程序会提交一个订单,如果提交成功则返回True,否则返回False。

总结

使用网络爬虫、Selenium库和BeautifulSoup库,我们可以轻松地实现python自动12306抢票软件。但需要注意,由于12306网站反扒措施比较严格,过于频繁的操作有可能使得账号被封禁。因此,在使用该程序前,请务必先仔细了解相关反爬策略,并注意进行适当的控制。

本文标题为:python自动12306抢票软件实现代码

基础教程推荐