Python实现12306查票以及自动抢票

在这里插入图片描述
市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单。下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事。

环境使用

Python 3.8
Pycharm

相关模块

requests  >>> pip install requests
prettytable  >>> pip install prettytable
selenium
json

思路

一. 数据来源分析

车票信息数据内容

  1. F12或者鼠标右键点击检查选择network 然后刷新一下网页数据, 让我们的数据包重新加载出来
  2. 通过搜索数据, 找到相应数据包, 然后查看请求url地址 请求方式, 以及请求头参数

二. 代码实现的过程

  1. 发送请求, 对于刚刚分析得到url地址发送请求
  2. 获取数据, 获取服务器返回响应数据
  3. 解析数据, 提取我们想要数据内容
  4. 格式化输出效果

代码

import requests  # 数据请求模块 第三方模块 需要安装 pip install requests
import prettytable as pt  # 表格格式的输出  第三方模块 需要安装 pip install prettytable
import json
import 回家的诱惑

f = open('city.json', encoding='utf-8')
txt = f.read()
json_data = json.loads(txt)  # 转成字典数据类型
from_station =  input('请输入你出发的城市: ')
to_station =  input('请输入你目的城市: ')
# print(txt)
date = input('请输入你要出发的日期(格式: 2022-05-04):')
# print(json_data[from_station])
# print(json_data[to_station])

发送请求, 对于刚刚分析得到url地址发送请求python爬虫发送请求: 模拟浏览器对于url地址发送请求头: 伪装python代码, 让它伪装一个浏览器去发送请求字典的数据类型, 构建完整键值对形式User-Agent: 用户代理 浏览器基本身份标识 Cookie: 用户信息, 常用于检测是否登陆账号当你请求数据之后, 虽然返回 <Response [200]> 但是不一定得到你想要数据内容 得到的数据不是你想要, 说明你被反爬了

url = f'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={json_data[from_station]}&leftTicketDTO.to_station={json_data[to_station]}&purpose_codes=ADULT'
headers = {
    'Cookie': '_uab_collina=164560170606767104255119; JSESSIONID=FF0815861E927C16239D17FB558BE`在这里插入代码片`EB4; _jc_save_wfdc_flag=dc; BIGipServerotn=552075530.64545.0000; highContrastMode=defaltMode; guidesStatus=off; cursorStatus=off; BIGipServerpassport=770179338.50215.0000; RAIL_EXPIRATION=1651647477597; RAIL_DEVICEID=QFCYUNkm1nWxSSA0rSuVEXoMVPaWIGgX9w8FH8Yu7ay4-ChisEAYp_J9XqNHcXUDFIKPtGQHQEksjci_7olyH-f-CJqAS5G6-CcwgEd2u3tgVdfMz78HS5ismPQinORISLNIuLU-x4LvAoVG-5NZZwm836HyEgQn; route=6f50b51faa11b987e576cdb301e545c4; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u5CB3%u9633%2CYYQ; _jc_save_fromDate=2022-05-04; _jc_save_toDate=2022-04-30',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36'
}
# 通过requests数据请求模块里面get请求方法, 对于url地址发送请求, 并且携带上headers请求头伪装, 最后用response变量接收返回数据
response = requests.get(url=url, headers=headers)
# 2. 获取数据
# print(response.json())  #  <Response [200]>  请求成功 返回响应对象  不是完整json数据格式
# 3. 解析数据, 提取我们想要数据内容
tb = pt.PrettyTable()
tb.field_names = [
    '序号',
    '车次',
    '出发时间',
    '到达时间',
    '耗时',
    '特等座',
    '一等',
    '二等',
    '软卧',
    '硬卧',
    '硬座',
    '无座',
]
page = 1
for index in response.json()['data']['result']:  # 把列表里面元素 一个一个提取出来, 用for循环遍历
    # index.split('|') # 字符串分割, 以|进行分割, 返回列表
    info = index.split('|')
    num = info[3]  # 车次
    start_time = info[8]  # 出发时间
    end_time = info[9]   # 到达时间
    use_time = info[10]    # 耗时
    topGrade = info[32]     # 特等座
    first_class = info[31]   # 一等
    second_class = info[30]  # 二等
    soft_sleeper = info[23]  # 软卧
    hard_sleeper = info[28]  # 硬卧
    hard_seat = info[29]  # 硬座
    no_seat = info[26]  # 无座
    dit = {
        '车次': num,
        '出发时间': start_time,
        '到达时间': end_time,
        '耗时': use_time,
        '特等座': topGrade,
        '一等': first_class,
        '二等': second_class,
        '软卧': soft_sleeper,
        '硬卧': hard_sleeper,
        '硬座': hard_seat,
        '无座': no_seat,
    }
    tb.add_row([
        page,
        num,
        start_time,
        end_time,
        use_time,
        topGrade,
        first_class,
        second_class,
        soft_sleeper,
        hard_sleeper,
        hard_seat,
        no_seat,
    ])
    page +=1
print(tb)
word = input('请输入你想要购买车票: ')
回家的诱惑.get_train(int(word), from_station, to_station, date)
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python可以通过网络爬虫自动化操作库来实现12306自动抢票程序。具体的步骤如下: 首先,我们需要了解12306的网站结构和抢票的流程。可以通过查看12306网站的源代码或使用开发者工具来了解网站上的元素和接口。 接下来,我们将使用Python的网络爬虫库,如Requests或Scrapy,来获取12306网站上的车票信息。我们可以发送HTTP请求,获取车站、日期、车次、座位等必要的信息,并解析响应的数据。 然后,我们需要创建一个机制来自动登录12306网站。我们可以使用Selenium库来模拟用户登录过程,填写用户名和密码,并点击登录按钮。 一旦登录成功,我们可以开始搜索并预定车票。我们可以通过构造合适的URL,并发送相关的请求来查询可用的车票。然后,我们可以提取所需的信息,如车次、座位、价格等。 当找到合适的车票后,我们可以使用自动化操作库,如Selenium或Pyautogui,来模拟用户操作完成购票流程。这包括选择座位、填写乘客信息、提交订单等步骤。 最后,我们需要添加异常处理机制来应对可能的网络错误、登录失败或购票失败等情况。我们可以使用try-except语句来捕获异常,并根据需要采取相应的处理措施,如重新尝试抢票、发送通知等。 需要注意的是,使用自动化程序抢票可能违反12306的使用规则。因此,在使用抢票程序之前,我们需要仔细阅读12306的规定,确保自己的行为合法合规。 总之,通过使用Python的网络爬虫自动化操作库,我们可以实现12306自动抢票程序。这样可以帮助我们更高效地搜索和预定车票,省去手动操作的繁琐过程。但是,在使用此类程序时务必遵守相关规定,避免违反使用规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值