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抢票软件实现代码 - Python技术站

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

相关文章

  • python 算法题——快乐数的多种解法

    下面是关于“Python算法题——快乐数的多种解法”的完整攻略。 1. 题目描述 快乐数是指:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或者是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。 例如,19 是一个快乐数,计算过程如下: 1^2 + 9^2 = 828^2 + 2^2 = …

    python 2023年5月13日
    00
  • Python 学习笔记

    标题:Python 学习笔记完整攻略 简介 Python 是一种高级编程语言,流行于科学计算、数据分析、人工智能、Web 开发等领域。学习 Python 可以帮助入门编程,也可以成为洞察算法背后原理的跨学科人才。 前置条件 安装 Python 解释器 熟练使用基本命令行操作,例如 ls、cd 等 熟悉基本的编程概念,例如变量、函数、控制语句等 学习目标 掌握…

    python 2023年5月30日
    00
  • 在python中的socket模块使用代理实例

    在Python中,如果需要通过代理(proxy)访问网络资源,可以使用socket模块进行操作。下面是在Python中使用socket模块使用代理的完整攻略。 1. 安装socks模块 在Python中,使用代理可以通过第三方库soscks实现,在使用之前需要安装soscks模块。 安装方式: pip install pysocks 2. 导入所需的模块 使…

    python 2023年6月3日
    00
  • Python实现字典的key和values的交换

    要交换Python字典中的key和values,可以采用以下步骤: 首先,创建一个字典。 把字典里的key和values交换位置,可以采用字典推导式的方式。具体来讲,可以创建一个新的字典,遍历原始字典,把原始字典的key和value倒置,最后把倒置后的key-value键值对添加到新的字典中。 删除原始字典。 以下是Python代码实现交换字典中key和va…

    python 2023年5月13日
    00
  • Python导出DBF文件到Excel的方法

    下面是Python导出DBF文件到Excel的完整实例教程: 1. 安装库 首先需要安装以下两个Python库:- dbfread:用于读取DBF文件- openpyxl:用于生成Excel文件 在命令行中执行以下命令进行安装: pip install dbfread openpyxl 2. 读取DBF文件 读取DBF文件的代码如下: from dbfrea…

    python 2023年5月14日
    00
  • python3启动web服务引发的一系列问题汇总

    以下是关于Python3启动Web服务引发的一系列问题汇总的完整攻略: 问题描述 在Python3中,启动Web服务时可能会遇到一系列问题,例如端口被占用、无法访问等。了解这些问题可以帮助我们更好地调试和解决问题。 解决方法 可以使用以下步骤解决Python3启动Web服务引发的问题: 确认端口是否被占用。 在启动Web服务之前,可以使用netstat命令或…

    python 2023年5月13日
    00
  • 在python中读取和写入CSV文件详情

    让我们来详细讲解在Python中读取和写入CSV文件的完整攻略。CSV文件是一种通用文件格式,常用于将标签分隔的数据导入或导出到不同软件应用程序和系统之间。在Python中,我们可以使用内置的CSV模块来处理CSV文件。 读取CSV文件 首先,我们需要导入csv模块。接下来,我们可以使用csv.reader函数来逐行读取文件中的数据,并将其转换为列表。列表中…

    python 2023年6月3日
    00
  • 还不知道Anaconda是什么?读这一篇文章就够了

    还不知道Anaconda是什么?读这一篇文章就够了 如果你是一名数据分析或机器学习的初学者,那么你一定听说过Anaconda。简单来说,Anaconda是一款全平台的开源Pyton发行版,它能够帮你管理Python库和环境。 为什么要使用Anaconda? 管理Python库避免冲突:使用Anaconda后,你可以使用包管理工具conda来方便地管理Pyth…

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