市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单。下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事。
目录
- 环境使用
- 相关模块
- 思路
- 一. 数据来源分析
- 二. 代码实现的过程
- 代码
环境使用
Python 3.8
Pycharm
相关模块
requests >>> pip install requests
prettytable >>> pip install prettytable
selenium
json
思路
一. 数据来源分析
车票信息数据内容
- F12或者鼠标右键点击检查选择network 然后刷新一下网页数据, 让我们的数据包重新加载出来
- 通过搜索数据, 找到相应数据包, 然后查看请求url地址 请求方式, 以及请求头参数
二. 代码实现的过程
- 发送请求, 对于刚刚分析得到url地址发送请求
- 获取数据, 获取服务器返回响应数据
- 解析数据, 提取我们想要数据内容
- 格式化输出效果
代码
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)