用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日

相关文章

  • 如何在Python中使用pandas做vLookup

    在Python中使用pandas进行vLookup,可以使用merge函数来完成。具体步骤如下: 读入数据表格:使用pandas库中的read_csv函数读取需要进行vLookup的两个数据表格,并将它们分别存储在两个DataFrame对象中。 import pandas as pd df1 = pd.read_csv(‘table1.csv’) df2 =…

    python-answer 2023年3月27日
    00
  • python实现一次性封装多条sql语句(begin end)

    要实现一次性封装多条SQL语句,可以使用Python的MySQLdb模块中的执行多个SQL语句的方法进行实现。下面是一份实现攻略,包括示例说明: 准备工作 安装MySQLdb模块:使用pip install MySQLdb进行安装。 连接MySQL数据库:使用MySQLdb.connect()方法进行连接,在进行SQL操作时需要使用该连接。 封装多个SQL语…

    python 2023年5月14日
    00
  • Pytorch中TensorDataset,DataLoader的联合使用方式

    PyTorch中的TensorDataset和DataLoader是非常重要的工具,用于构建模型的数据输入管道。它们可以协同工作,高效地处理大规模、复杂的训练数据,并将其划分为小批量。本文将详细介绍如何联合使用TensorDataset和DataLoader。 1. TensorDataset和DataLoader的介绍 在深度学习中,数据预处理是一个非常重…

    python 2023年5月14日
    00
  • Python Pandas – 返回区间的中点

    当我们在Python Pandas中处理数据的时候,有时候需要计算每个区间的中点。这个操作需要用到Pandas的cut函数和groupby函数。 首先,我们需要将数据分成区间。我们可以使用cut函数来实现这个目的。cut函数接收一个数据集和一个区间列表,它返回一个Categorical对象,即分组好的数据集。 import pandas as pd # 生成…

    python-answer 2023年3月27日
    00
  • Pandas对象使用自定义函数的3个方法!

    Pandas为什么要使用自定义函数? 使用自定义函数可以让我们更灵活地对数据进行处理和分析。在某些情况下,内置的函数可能无法满足我们的需求,例如需要进行特定的数据清洗、转换或计算。这时候,我们可以编写自己的函数来处理数据。同时,自定义函数也可以让我们更好地复用代码,提高开发效率。 接下来我们将详细介绍Pandas使用自定义函数的4种方法。 Pandas使用自…

    Pandas 2023年3月4日
    00
  • Pandas Series对象常用的属性和方法

    Pandas Series对象是一维标签数组,主要用于存储不同数据类型的数据。 Series常用属性 下面我们介绍 Series 的常用属性和方法。在下表列出了 Series 对象的常用属性。 名称 属性 index 返回一个Index对象,代表Series的索引。 values 返回一个numpy数组,代表Series的值。 dtype 返回Series中…

    Pandas 2023年3月4日
    00
  • 在Pandas数据框架中用最新的正值替换负值

    在 Pandas 数据框架中,我们可以使用 where 函数来替换负数为最新的正值。下面是详细的步骤: 导入 Pandas 模块并读取数据 import pandas as pd data = pd.read_csv(‘data.csv’) 将数据框架中的负数替换为 NaN data = data.where(data >= 0) 该语句将数据框架 d…

    python-answer 2023年3月27日
    00
  • 如何在Pandas中计算加权平均数

    计算加权平均数可以使用Pandas中的weighted_avg()函数,该函数主要用于计算加权平均数。 详细步骤如下: 从Pandas库中导入Series和weighted_avg函数: python import pandas as pd from pandas import Series from pandas.api import types from…

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