用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中检查数据框架是否包含无穷大

    要检查 Pandas 数据框中是否包含无穷大值,可以使用 Pandas 提供的 isinf() 和 isnan() 函数。 以下是示例代码: import numpy as np import pandas as pd # 创建数据框 data = pd.DataFrame({ ‘A’: [1, 2, np.inf, 4], ‘B’: [5, 6, 7, 8…

    python-answer 2023年3月27日
    00
  • Python Pandas数据分析之iloc和loc的用法详解

    PythonPandas是数据分析领域非常重要的工具,其中iloc和loc是两个非常重要的方法,用于访问数据框中的元素。下面是详细的攻略。 iloc的用法 iloc方法是根据位置来访问数据框中的元素。iloc以包含行和列编号的元组作为索引。例如, df.iloc[0:2, 0:2]表示访问第1到第2行和第1到第2列的元素。 下面是一个例子: import p…

    python 2023年5月14日
    00
  • pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]

    Pandas是一种Python常用的数据处理工具,它具有很强的数据选取和处理能力,本文将详细讲解Pandas数据选取的完整攻略。 一、pandas数据选取方法 Pandas提供了丰富的数据选取方法,常用的包括: df[]:基于列名或索引选取列或行; df.loc[]:基于行和列名称选取数据; df.iloc[]:通过整数位置选取数据; df.ix[]:基于行…

    python 2023年5月14日
    00
  • Python数据处理之pd.Series()函数的基本使用

    当我们需要处理数据时,Python中的pandas库可以帮助我们轻松地进行数据处理、分析和操作。其中,pd.Series()函数是pandas中最基本的数据类型,类似于一维数组,让我们来学习一下pd.Series()的基本使用吧。 1. 创建pd.Series对象 我们可以通过以下方法来创建pd.Series对象: import pandas as pd d…

    python 2023年5月14日
    00
  • 快速解释如何使用pandas的inplace参数的使用

    当调用Pandas 的许多更改操作时,您通常有两个选项:直接更改现有 DataFrame 或 Series 对象,或者返回新的更改副本。使用 inplace 参数可以使更改直接应用于现有对象,而无需创建新副本。本文将详细介绍 Pandas 中 inplace 参数的使用方法及示例。 什么是 inplace 参数? inplace 参数是许多 Pandas 操…

    python 2023年5月14日
    00
  • Python使用pandas处理CSV文件的实例讲解

    Python使用pandas处理CSV文件的实例讲解 在数据处理中,CSV(逗号分割值)文件是非常常见的数据格式。Pandas是常用的处理表格数据的Python库,可以很方便地处理CSV文件。本文将为大家介绍使用Pandas处理CSV文件的完整攻略。 步骤一:安装Pandas库 如果电脑还没有安装Pandas库,可以通过命令行工具使用pip进行安装: pip…

    python 2023年5月14日
    00
  • 如何在Pandas数据框架中添加标题行

    要在pandas数据框架中添加标题行(也被称为列名),可以按照以下步骤操作: 1.首先创建一个数据框架。可以使用以下代码创建一个数据框架: import pandas as pd df = pd.DataFrame({‘col1’:[1, 2, 3], ‘col2’:[4, 5, 6], ‘col3’:[7, 8, 9]}) print(df) 输出: co…

    python-answer 2023年3月27日
    00
  • 详解python selenium 爬取网易云音乐歌单名

    详解Python Selenium爬取网易云音乐歌单名 本攻略将从以下几个方面详细介绍如何使用Python和Selenium模拟登录网易云音乐,并爬取网易云音乐歌单名。 准备工作 在开始之前,需要进行如下准备工作: 安装Python3 安装Selenium库 安装Chrome浏览器 下载Chrome浏览器对应的驱动程序(注意驱动版本与Chrome浏览器版本要…

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