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

yizhihongxing

下面是详细讲解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抢票软件实现代码 - Python技术站

(1)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python办公自动化之Excel(中)

    下面是对题目的详细讲解。 标题 Python办公自动化之Excel(中)完整攻略 简介 本文是Python办公自动化系列之Excel的第二篇,主要讲解如何使用Python操作Excel文件实现自动化。相比第一篇主要介绍的Excel基础知识,本篇更加注重实践。 内容 安装openpyxl和pandas库 读取Excel文件数据 import openpyxl …

    python 2023年5月19日
    00
  • python re.sub()替换正则的匹配内容方法

    以下是详细讲解“Python re.sub()替换正则的匹配内容方法”的完整攻略,包括re.sub()函数的基本语法、使用re.sub()函数替换匹配内容的方法和两个示例说明。 re.sub()函数的基本语法 re.sub()函数用于在字符串中替换正则表达式的匹配项。re.sub()函数的基本语法如下: re.sub(pattern, repl, strin…

    python 2023年5月14日
    00
  • 详解Python是如何实现issubclass的

    在Python中,issubclass函数用于检查一个类是否为另一个类的子类。本文将详细讲解Python是如何实现issubclass的。 什么是issubclass函数? issubclass函数是Python标准库中的一个内置函数,它的语法为: issubclass(class, classinfo) 该函数的作用是判断一个类(class)是否为另一个类…

    python 2023年6月3日
    00
  • Python 备份程序代码实现

    Python 备份程序代码实现是一个非常常见的需求。例如,在为自己的电脑或服务器备份数据时,通过编写 Python 代码可以快速实现这一功能。以下是我们提供的 Python 备份程序的攻略: 确定备份源和目标 在开始编写 Python 备份程序之前,我们需要明确备份的源和目标。源包含需要备份的文件或文件夹路径,目标则是存储备份文件的文件夹路径。这一步可以通过…

    python 2023年5月30日
    00
  • Python利用Selenium实现网站自动签到功能

    以下是Python利用Selenium实现网站自动签到功能的完整攻略: 准备工作 安装Python环境和pip包管理器。 安装selenium包用于自动化测试。 下载相应浏览器的webdriver,例如ChromeDriver或FirefoxDriver等。 实现步骤 导入必要的库文件。 from selenium import webdriver from…

    python 2023年5月19日
    00
  • 详解Python中的__getitem__方法与slice对象的切片操作

    我来详细讲解一下关于Python中的__getitem__方法和slice对象的切片操作。 一、__getitem__方法 __getitem__是Python中内置的一个特殊方法,用于在对象中实现索引取值操作。比如,当我们使用下标[]取某个对象的值时,实际上就是调用了该对象的__getitem__方法。以下是一个示例: class MyClass: def…

    python 2023年6月3日
    00
  • python字符串的一些常见实用操作

    关于“Python字符串的一些常见实用操作”的攻略共分为以下几个方面: 1. 创建字符串 Python中的字符串可以通过单引号、双引号或三引号来创建,其中三引号可以用于创建多行字符串。 示例1:使用单引号和双引号创建字符串 str1 = ‘Hello World’ str2 = "Hello World" print(str1) # 输出…

    python 2023年6月5日
    00
  • Python 条件判断的缩写方法

    当我们需要根据某个条件来执行代码的时候,通常是使用if语句来实现。但在Python中,我们也可以使用条件判断的缩写方法来达到同样的效果。这个技巧又叫做条件表达式或三元运算符。在本文中,我将详细介绍Python条件判断的缩写方法,包括语法、应用场景及示例。 语法 Python条件判断的缩写方法是通过一个三元运算符来实现的,具体的语法如下: value_if_t…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部