用Python抢过年的火车票附源码

针对这个话题,我为您提供以下完整攻略。

目标

使用 Python 抢购过年期间的火车票

准备

  1. Python3 环境
  2. 12306 的账户和密码
  3. chromedriver.exe 驱动程序

方法

第一步:获取 cookies

由于火车票系统需要登录才能进行查询和购票,我们需要使用 selenium 来模拟浏览器操作。

打开 12306 首页,手动登录账户,然后进入浏览器的 Console (F12),输入如下代码,来获取 cookies:

JSON.stringify(document.cookie)

这个命令将会返回一个 JSON 对象,里面包含了我们之后代码将要使用的 cookies。

第二步:跳转到查询页面

登录之后,我们需要点击左侧“车票预订”菜单,然后进入查询页面。

以下是一个简单的 Python 代码,用于跳转到火车票查询页面:

from selenium import webdriver

# 初始化一个 Chrome driver 实例
driver = webdriver.Chrome(r'path/to/chromedriver.exe')

# 打开 12306 网站
driver.get('https://www.12306.cn/index/')

# 等待登录完成之后,手动点击“车票预订”菜单

# 等待页面加载完成
driver.implicitly_wait(10)

# 跳转到查询页面
driver.get('https://kyfw.12306.cn/otn/leftTicket/init')

这段代码使用 webdriver.Chrome 初始化了一个 Chrome 浏览器的驱动实例。然后打开了 12306 的首页,并等待用户手动完成登录操作。

等页面加载完成后,使用 driver.get 接口跳转到查询页面。

第三步:查询余票

在 12306 的查询页面上,我们需要填写起始站点、终点站点、以及出发时间,然后点击“查询”按钮来查询余票信息。

以下是 Python 代码的示例,用于查询从上海到北京的余票信息:

from selenium.webdriver.common.keys import Keys

# 定义出发地、目的地、出发时间
from_station = 'SHH'
to_station = 'BJP'
date = '2022-01-02'

# 填写查询信息
driver.find_element_by_id('fromStationText').send_keys(from_station)
driver.find_element_by_id('toStationText').send_keys(to_station)
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys(date)
driver.find_element_by_id('train_date').send_keys(Keys.RETURN)

# 等待查询结果返回
driver.implicitly_wait(10)

# 查询余票
tickets = driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')

# 处理查询结果
for ticket in tickets:
    print(ticket.text)

这段代码使用 find_element_by_idsend_keys 方法,填写了查询表单上的信息,并通过 Keys.RETURN 模拟了用户单击“查询”按钮。

等待查询结果返回后,我们使用 find_elements_by_xpath 选择器,来获取所有查询结果的 DOM 元素。

最后我们使用一个 for 循环,遍历所有的查询结果,并输出到控制台上,这里我们只是简单地将结果打印到控制台上,实际应该根据自己的需要,做出更复杂的处理操作。

第四步:提交订单

当查询到有余票之后,我们需要立即执行下一步操作 - 提交订单。以下是一个 Python 代码的示例,它用于选择指定的车次,然后提交订单:

# 找到指定车次
target_train = None
for ticket in tickets:
    if ticket.find_element_by_class_name('number').text == 'G101':
        # 找到了需要的车次
        target_train = ticket
        break

if target_train is not None:
    # 选择座位,并加入购物车
    target_train.find_element_by_css_selector('td.no-br>a').click()  # 点击预订按钮
    driver.implicitly_wait(10)
    driver.find_element_by_id('seatType_1').click()  # 选择二等座
    driver.find_element_by_id('submitOrder_id').click()  # 加入购物车

    # 等待提交窗口
    driver.implicitly_wait(10)

    # 点击进入下一步
    driver.find_element_by_id('qr_submit_id').click()

这段代码首先找到指定的车次,然后选择座位类型,并加入购物车。

然后,我们通过 driver.find_element_by_id('qr_submit_id').click() 模拟了用户点击“提交订单”按钮。

第五步:填写订单信息

在提交订单之后,我们需要填写订单信息,然后才能进行支付。

以下是一个 Python 代码的示例,用于填写订单信息并提交:

from selenium.webdriver.common.by import By

# 等待订单信息窗口出现
driver.find_element(By.ID, 'normal_passenger_id0').click()
driver.find_element(By.NAME, 'submitOrder').click()

# 等待页面加载完成
driver.implicitly_wait(10)

# 填写联系人信息
name = 'XXX'
id_type = '1'
id_number = 'XXXXXXXXXXXXXXXXXX'
phone_number = 'XXXXXXXXXXX'

driver.find_element(By.ID, 'normalPassenger_0').click()
driver.implicitly_wait(1)
driver.find_element(By.ID, 'lianxiren').send_keys(name)
driver.find_element(By.ID, 'sfz_number').send_keys(id_number)
driver.find_element(By.ID, 'mobile_no').send_keys(phone_number)
driver.find_element(By.ID, 'submitOrder').click()

# 等待加载完成
driver.implicitly_wait(10)

# 点击同意协议并提交订单
driver.find_element(By.ID, 'qr_submit_id').click()

这段代码首先在页面加载之后,尝试点击“提交订单”按钮。然后,填写乘客信息,并勾选“同意协议”,最后点击“提交订单”按钮。

示例

示例一:查询从上海到北京的余票信息

我们使用如下 Python 代码的示例来查询从上海到北京的余票信息:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 初始化一个 Chrome driver 实例
driver = webdriver.Chrome(r'path/to/chromedriver.exe')

# 打开 12306 网站
driver.get('https://www.12306.cn/index/')

# 等待登录完成之后,手动点击“车票预订”菜单

# 等待页面加载完成
driver.implicitly_wait(10)

# 跳转到查询页面
driver.get('https://kyfw.12306.cn/otn/leftTicket/init')

# 定义出发地、目的地、出发时间
from_station = 'SHH'
to_station = 'BJP'
date = '2022-01-02'

# 填写查询信息
driver.find_element_by_id('fromStationText').send_keys(from_station)
driver.find_element_by_id('toStationText').send_keys(to_station)
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys(date)
driver.find_element_by_id('train_date').send_keys(Keys.RETURN)

# 等待查询结果返回
driver.implicitly_wait(10)

# 查询余票
tickets = driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')

# 处理查询结果
for ticket in tickets:
    print(ticket.text)

# 关闭浏览器
driver.close()

这段代码首先打开了 12306 的网站,并跳转到了查询页面。然后,使用 find_element_by_idsend_keys 方法填写查询表单信息,并通过 Keys.RETURN 模拟单击“查询”按钮。

等待查询结果之后,我们通过 find_elements_by_xpath 获取了所有的查询结果,然后将它们输出到了控制台上。

示例二:预定从上海到北京的火车票

以下是一个 Python 代码的示例,用于预定从上海到北京的火车票:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# 初始化一个 Chrome driver 实例
driver = webdriver.Chrome(r'path/to/chromedriver.exe')

# 打开 12306 网站
driver.get('https://www.12306.cn/index/')

# 等待登录完成之后,手动点击“车票预订”菜单

# 等待页面加载完成
driver.implicitly_wait(10)

# 跳转到查询页面
driver.get('https://kyfw.12306.cn/otn/leftTicket/init')

# 定义出发地、目的地、出发时间
from_station = 'SHH'
to_station = 'BJP'
date = '2022-01-02'

# 填写查询信息
driver.find_element_by_id('fromStationText').send_keys(from_station)
driver.find_element_by_id('toStationText').send_keys(to_station)
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys(date)
driver.find_element_by_id('train_date').send_keys(Keys.RETURN)

# 等待查询结果返回
driver.implicitly_wait(10)

# 查询余票
tickets = driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')

# 处理查询结果
for ticket in tickets:
    if ticket.find_element_by_class_name('number').text == 'G101':
        # 找到了需要的车次
        target_train = ticket
        break

# 选择座位,并加入购物车
target_train.find_element_by_css_selector('td.no-br>a').click()  # 点击预订按钮
driver.implicitly_wait(10)
driver.find_element_by_id('seatType_1').click()  # 选择二等座
driver.find_element_by_id('submitOrder_id').click()  # 加入购物车

# 等待提交窗口
driver.implicitly_wait(10)

# 点击进入下一步
driver.find_element_by_id('qr_submit_id').click()

# 等待订单信息窗口出现
driver.find_element(By.ID, 'normal_passenger_id0').click()
driver.find_element(By.NAME, 'submitOrder').click()

# 等待页面加载完成
driver.implicitly_wait(10)

# 填写联系人信息
name = 'XXX'
id_type = '1'
id_number = 'XXXXXXXXXXXXXXXXXX'
phone_number = 'XXXXXXXXXXX'

driver.find_element(By.ID, 'normalPassenger_0').click()
driver.implicitly_wait(1)
driver.find_element(By.ID, 'lianxiren').send_keys(name)
driver.find_element(By.ID, 'sfz_number').send_keys(id_number)
driver.find_element(By.ID, 'mobile_no').send_keys(phone_number)
driver.find_element(By.ID, 'submitOrder').click()

# 等待加载完成
driver.implicitly_wait(10)

# 点击同意协议并提交订单
driver.find_element(By.ID, 'qr_submit_id').click()

# 关闭浏览器
driver.close()

这段代码首先打开了 12306 的网站,并跳转到了查询页面。然后,使用 find_element_by_idsend_keys 方法填写查询表单信息,并通过 Keys.RETURN 模拟单击“查询”按钮。

等待查询结果之后,我们通过 find_elements_by_xpath 获取了所有的查询结果,并找到了指定的车次。

接下来,我们选择了二等座,并添加到购物车中。然后,我们点击“提交订单”按钮,并填写了订单信息。最后,我们点击“同意协议”按钮并提交订单。

结论

本方法主要利用 Python 的 selenium 库来模拟浏览器操作,实现了自动查询余票、预定火车票等功能。在实际应用中,我们需要对代码进行优化和改进,来确保系统的稳定性和可靠性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Python抢过年的火车票附源码 - Python技术站

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

相关文章

  • SQL基础教程之行转列Pivot函数

    当我们从数据库中提取数据时,有时数据都显示为一列一列的。但是,我们可能需要将一些列转化为行,这就需要用到Pivot函数。本文主要介绍SQL Server数据库中的Pivot函数的基础用法。 1.什么是Pivot函数 Pivot函数是SQL Server提供的用于转化数据表结构的函数。它可以将一列或多列数据整理成一个新的行列结构的表。 Pivot函数在交叉列和…

    python 2023年6月13日
    00
  • python机器学习使数据更鲜活的可视化工具Pandas_Alive

    介绍 Pandas_Alive 是一个可以将 Pandas 数据帧 (dataframe) 即数据可视化为动画的工具。它为数据科学家提供了一个可视化的工具来探索和呈现数据。Pandas_Alive 使用 Matplotlib 音乐人才晋升来创建动画,并提供了更具可读性和易于使用的 Python 代码。 安装 Pandas_Alive 不是 Python 标准…

    python 2023年5月14日
    00
  • pandas实现数据读取&清洗&分析的项目实践

    Pandas实现数据读取、清洗、分析的项目实践 Pandas是基于Python的一款高效数据处理库,可以完成多种数据处理操作,如读取数据、清洗数据、分析数据等。在数据科学领域和商业数据分析中广泛应用。本文将介绍Pandas实现数据读取、清洗、分析的完整攻略,包括数据读取、数据清洗、数据分析等三个步骤。 数据读取 数据读取是数据处理的第一步,Pandas提供了…

    python 2023年5月14日
    00
  • Pandas搭配lambda组合使用详解

    Pandas搭配lambda组合使用详解 在Pandas中,我们可以使用lambda表达式对DataFrame进行高效的处理和变换。本文将介绍如何将Pandas和lambda表达式组合使用,以实现对数据的快速处理。 lambda表达式简介 lambda是Python中的一个关键字,用于定义匿名函数,也就是没有函数名的函数。语法如下: lambda argum…

    python 2023年5月14日
    00
  • 检查Pandas的失踪日期

    讲解 Pandas 的缺失日期检查的完整攻略,以下是具体步骤。 步骤一:导入 Pandas 首先需要导入 Pandas 库,可以使用以下代码: import pandas as pd 步骤二:读取数据 可以使用 Pandas 的 read_csv() 函数或其他适当的函数读取数据集。例如,读取一个名为 data.csv 的数据集,可以使用以下代码: data…

    python-answer 2023年3月27日
    00
  • win10系统下安装superset的步骤

    下面是在win10系统下安装superset的步骤攻略: 安装步骤 步骤一:安装Python Python官网下载对应版本的Python安装包,也可以通过conda安装。需要注意的是,目前superset所支持的Python版本为Python 3。安装完成后,应将python和pip(Python package installer)添加到系统的Path环境…

    python 2023年5月14日
    00
  • Pandas数据框架中浅层复制与深层复制的区别

    Pandas是Python中非常流行的数据处理库,其中的DataFrame就是一种基于二维表格的数据结构,因此在使用Dataframe时,我们需要掌握深层复制和浅层复制的区别,以避免出现不必要的错误。 深层复制指的就是完全复制一个DataFrame对象到另一个对象中,而新的对象和原始对象完全独立,两者之间没有任何关联性。这意味着我们修改一个对象的值不会影响另…

    python-answer 2023年3月27日
    00
  • 如何在Python中计算指数型移动平均线

    在Python中计算指数型移动平均线的一种常用方法是使用pandas库中的ewm()函数。ewm()函数可以对DataFrame和Series类型的数据进行指数型移动平均线的计算。 具体步骤如下: 步骤1:导入需要的库和数据 首先需要导入需要的库,例如pandas库、numpy库等,并加载相关的数据,例如一个时间序列的数据。 import pandas as…

    python-answer 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部