前言

之前写了12306的爬虫,当时可以运行,最近发现不行,返回的数据不对,可能是cookie有问题(可能需要某些参数,我也不确定,但没有cookie,数据请求不到。。。),修改之后,成功。

对于返回的数据进行了提取,并再次发送请求,得到车票的其他数据。

1,获得火车的经过的站及相关数据。

2,获得火车的票价。

本来觉得应该写窗体的,自己实力不行,有待学习,以后再来完成。

开始

得到数据

发送请求

该写的都写上,cookie,headers之类的。直接给出代码

# a传入时间(2023--01-10)
# b,出发地的代号
# c 目的地代号,
url = f'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={a}&leftTicketDTO.from_station={b}&leftTicketDTO.to_station={c}&purpose_codes=ADULT'self.headers = {'Cookie': f'_jc_save_toStation={b}','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76',}r = requests.get(url=url, headers=self.headers)results = r.json()['data']['result']
#  result 就是数据
#  下面进行分析

解释

参数

需要提供的参数有

1,出发时间

2,出发地代号

3,目的地代号

参数的获取
    """
城市代码
url=https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9002
怎么获得
1,打开开发者工具(中文)
2,源代码
3,在js中"""

获取到我保存到csv文件中,也可以放到数据库中。

用pandas提取csv中的数据,即参数

返回的数据

返回的数据是以"|"进行分割的,如下

data="vdeVLhSURm4Q1RP66du87ohMRCQ3MLwq0kfa3TJCnHalBU63NmdSl3%2Bj0rKw2GIMFpDmXzicLXbe%0Arj7VwfiSslzB2E330A4AhBXW%2FSiLQW29lNCn2ZoamKWMVLFSt9f7vxwjtgMqvoqMpleoviO0aZOG%0AX75YLCGxZv%2Bj8obzGYdP%2FjDdI1CxxnTonzzXG7GI0pM0YEwsrGSYPgTnlXRAjzA6WrqZn%2BVHxaQF%0AgL0vdZ2sxItfSR2yGSAYacvObVlZXkCJoHAJjrCXT25HnBhsUCrO%2FRQ%2F97qKbBcN5F3JnPxWZZzw%0AfwVu%2F0DAqHBn69up|预订|76000G219505|G2195|ICW|AOH|ICW|CWQ|06:10|13:22|07:12|Y|dHywp8bnO4BIQNw1cH%2FaVsWHeAoP7nmv6%2FF4lR7Tvkkl2UtE|20230114|3|W2|01|14|1|0|||||||||||有|5|2||90M0O0|9MO|1|0||9178550002M095200005O057850021|0|||||1|0#0#0#0#z||"

用split进行分开,得到一个列表,里面有49个元素

data.split('|')

配合enumerate 函数找到有用的数据,经过多次分析,其中有20条数据是有用的

给出数据和对应的含义

"""
#t就是datatrain_no = t[2]   #火车参数che = t[3]  # 车次startcode = t[4] #出发地代号endcode = t[5]  # 目的地代号from_station_no = t[16] # 发车地代号to_station_no = t[17]  # 终点代号seat_types = t[35] # 座位类型starttime = t[8]  # 出发时间endtime = t[9] # 到站时间duration_time = t[10] 持续时间special_shop_seat = t[32] or t[25] or '--' # 商务座/特等座,二者数据所处位置不一样first_seat = t[31] or '--' # 一等座second_seat = t[30] or '--' # 二等座high_sleep = t[21] or '--' # 高级软卧soft_sleep = t[23] or '--' # 软卧dong_sleep = t[33] or '--' # 动卧hard_sleep = t[28] or '--' # 硬卧sort_seat = t[24] or '--' # 软座hart_seat = t[29] or '--' # 硬座no_seat = t[26] or '--' # 站票
"""

把数据用prettable进行展示中,并且把这些数据存到一个新的列表中,为后来的操作提供需要的参数。

# import prettable as pt
# tb=pt.PrettyTable()
# 列名如下,和注释可能不一样,不重要,数据一样的。
# 新增加了序号,好选择火车
tb.field_names = ['序号', '火车参数', '车次', '出发地代号', '终点代号', '出发地代码', '终点代码', '座位信息', '开始时', '结束时', '持续时间', '商务座/特等座','一等座', '二等座', '高级软卧', '软卧', '动卧', '软座', '硬卧', '软座' '硬座', '站票']
# 如图

数据太多,没对齐。。。

获取路途的站及相关数据

发送请求

# a 火车参数
# b 起点站的代号
# c 终点站代号
# d 时间url_1 = f'https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no={a}&from_station_telecode={b}&to_station_telecode={c}&depart_date={d}'
resp = requests.get(url=url_1, headers=self.headers)
data = resp.json()['data']['data']

返回了数据,进行提取,用prettable来表示

tb.field_names = (['到站时间', '站点', '站数', '停留时间', '出站时间'])

没有多说的。唯一要说的就是代号,是火车发车的起点代号。

展示一下

获得票价

发送请求

#  a 火车参数
#  b 出发地代号
#  c 目的地代号
#  d  座位的类型
#  e 时间
#  注意代号的不同
url = f'https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice?train_no={a}&from_station_no={b}&to_station_no={c}&seat_types={d}&train_date={e}'r = requests.get(url=url, headers=self.headers)

数据的分析

因为座位的不同,票价不一样,而导致座位类型不同,返回的数据也不同。

而座位的类型,d

        if d == '1341':tb.field_names = (['软卧价格', '硬卧价格', '硬座价格', '无座价格'])soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hart_seat_price = r.json()['data']['A1']no_seat_price = r.json()['data']['WZ']tb.add_row([soft_sleep_price, hard_sleep_price, hart_seat_price, no_seat_price])return tbif d == '1346':tb.field_names = (['高级软卧软卧价格', '硬卧价格', '硬座价格', '无座价格'])high_soft_sleep_price = r.json()['data']['A6']soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hard_seat_price = r.json()['data']['A1']tb.add_row([high_soft_sleep_price, soft_sleep_price, hard_sleep_price, hard_seat_price])return tbif d == '134':tb.field_names = (['软卧价格', '硬卧价格', '硬座价格'])soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hart_seat_price = r.json()['data']['A1']tb.add_row([soft_sleep_price, hard_sleep_price, hart_seat_price])return tbif d == '9MO' or 'OM9':tb.field_names = (['商务座价格', '一等座', '二等座'])special_price = r.json()['data']['A9']first_seat_price = r.json()['data']['M']second_seat = r.json()['data']['O']tb.add_row([special_price, first_seat_price, second_seat])return tbif d == 'MOO':tb.field_names = (['一等座', '二等座'])first_seat_price = r.json()['data']['M']second_seat = r.json()['data']['O']tb.add_row([first_seat_price, second_seat])return tbif d=='FOO':tb.field_names = (['动卧', '二等座','无座'])dong_sleep = r.json()['data']['F']second_seat = r.json()['data']['O']no_seat = r.json()['data']['O']tb.add_row([dong_sleep, second_seat,no_seat])return tbif d=='FO':tb.field_names = (['动卧', '二等座'])dong_sleep = r.json()['data']['F']second_seat = r.json()['data']['O']tb.add_row([dong_sleep, second_seat])return tbif d=='F':tb.field_names = (['动卧'])dong_sleep = r.json()['data']['F']tb.add_row([dong_sleep])return tbif d=='MOP':tb.field_names = (['特等座', '二等座','一等座'])special_seat = r.json()['data']['P']second_seat = r.json()['data']['O']first_seat = r.json()['data']['M']tb.add_row([special_seat, second_seat,first_seat])return tbif d=='IJO':tb.field_names = (['二等座', '软卧','硬卧'])soft_sleep = r.json()['data']['AI']second_seat = r.json()['data']['O']hard_sleep = r.json()['data']['AJ']tb.add_row([second_seat, soft_sleep,hard_sleep])return tb

d有很多种,应实际情况会发生不同的变化,我感觉没有遇到完,还有其他情况。。。

而且这样写,重复的代码实在太多,有待修改,有些情况应该还没遇到,还有其他座位类型。

展示一下,有待修改。

操作一下

视频

不知道怎么把视频传到csdn上,传到b站上了,顺便开始当up主,哈哈哈哈哈哈

视频

总结

有待修改,还要结合pyqt5,不然终究感觉少了什么

源码

import requests
import prettytable as pt
import pandas as pd
import datetimetb = pt.PrettyTable()def today(a: int):today = datetime.date.today()data = today + datetime.timedelta(days=a)return dataclass ottzs:def __init__(self):self.headers = Noneself.times = Nonedef get_time(self):a = {}for i in range(15):a[i] = today(i)a[15] = '-1'return adef choose_time(self):t = self.get_time()choose = int(input(f'需要输入需要查询的车票的时间,序号如下.\n请选择序号\n'f'序号----时间\n'f'0----{today(0)}\n'f'1----{today(1)}\n'f'2----{today(2)}\n'f'3----{today(3)}\n'f'4----{today(4)}\n'f'5----{today(5)}\n'f'6----{today(6)}\n'f'7----{today(7)}\n'f'8----{today(8)}\n'f'9----{today(9)}\n'f'10----{today(10)}\n'f'11----{today(11)}\n'f'12----{today(12)}\n'f'13----{today(13)}\n'f'14----{today(14)}\n'f'15-----退出\n''请输入序号:\n'))times = t[choose]return timesdef get_code(self, a):s = pd.read_csv(path, index_col='地点')result = s.loc[f'{a}']['代码']return result"""城市代码的url=https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9002"""def get_data(self, a, b, c):try:tb.field_names = ['序号 ', '火车参数     ', '车次   ', '出发地代号   ', '终点代号  ', '出发地代码  ', '终点代码  ', '座位信息 ', '开始时   ', '结束时  ', '  持续时间  ', '商务座/特等座   ','一等座   ', '二等座 ', '高级软卧   ', '软卧   ', '动卧  ', '软座   ', '硬卧   ', '软座 ' '硬座  ', '站票   ']url = f'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={a}&leftTicketDTO.from_station={b}&leftTicketDTO.to_station={c}&purpose_codes=ADULT'self.headers = {'Cookie': f'_jc_save_toStation={b}','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76',}r = requests.get(url=url, headers=self.headers)results = r.json()['data']['result']acc = []num = 0for i in results:t = i.split('|')train_no = t[2]che = t[3]startcode = t[4]endcode = t[5]from_station_no = t[16]to_station_no = t[17]seat_types = t[35]starttime = t[8]endtime = t[9]duration_time = t[10]special_shop_seat = t[32] or t[25] or '--'first_seat = t[31] or '--'second_seat = t[30] or '--'high_sleep = t[21] or '--'soft_sleep = t[23] or '--'dong_sleep = t[33] or '--'hard_sleep = t[28] or '--'sort_seat = t[24] or '--'hart_seat = t[29] or '--'no_seat = t[26] or '--'tb.add_row([num + 1, train_no, che, startcode, endcode, from_station_no, to_station_no, seat_types, starttime, endtime, duration_time, special_shop_seat, first_seat, second_seat, high_sleep, soft_sleep, dong_sleep, hard_sleep, sort_seat, hart_seat, no_seat])acc.append([num + 1, train_no, che, startcode, endcode, from_station_no, to_station_no, seat_types, starttime, endtime, duration_time, special_shop_seat, first_seat, second_seat, high_sleep, soft_sleep, dong_sleep, hard_sleep, sort_seat, hart_seat, no_seat])num += 1print(tb)return accexcept Exception as e:return edef price(self, a, b, c, d, e):url = f'https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice?train_no={a}&from_station_no={b}&to_station_no={c}&seat_types={d}&train_date={e}'r = requests.get(url=url, headers=self.headers)if d == '1341':tb.field_names = (['软卧价格', '硬卧价格', '硬座价格', '无座价格'])soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hart_seat_price = r.json()['data']['A1']no_seat_price = r.json()['data']['WZ']tb.add_row([soft_sleep_price, hard_sleep_price, hart_seat_price, no_seat_price])return tbif d == '1346':tb.field_names = (['高级软卧软卧价格', '硬卧价格', '硬座价格', '无座价格'])high_soft_sleep_price = r.json()['data']['A6']soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hard_seat_price = r.json()['data']['A1']tb.add_row([high_soft_sleep_price, soft_sleep_price, hard_sleep_price, hard_seat_price])return tbif d == '134':tb.field_names = (['软卧价格', '硬卧价格', '硬座价格'])soft_sleep_price = r.json()['data']['A4']hard_sleep_price = r.json()['data']['A3']hart_seat_price = r.json()['data']['A1']tb.add_row([soft_sleep_price, hard_sleep_price, hart_seat_price])return tbif d == '9MO' or 'OM9':tb.field_names = (['商务座价格', '一等座', '二等座'])special_price = r.json()['data']['A9']first_seat_price = r.json()['data']['M']second_seat = r.json()['data']['O']tb.add_row([special_price, first_seat_price, second_seat])return tbif d == 'MOO':tb.field_names = (['一等座', '二等座'])first_seat_price = r.json()['data']['M']second_seat = r.json()['data']['O']tb.add_row([first_seat_price, second_seat])return tbif d=='FOO':tb.field_names = (['动卧', '二等座','无座'])dong_sleep = r.json()['data']['F']second_seat = r.json()['data']['O']no_seat = r.json()['data']['O']tb.add_row([dong_sleep, second_seat,no_seat])return tbif d=='FO':tb.field_names = (['动卧', '二等座'])dong_sleep = r.json()['data']['F']second_seat = r.json()['data']['O']tb.add_row([dong_sleep, second_seat])return tbif d=='F':tb.field_names = (['动卧'])dong_sleep = r.json()['data']['F']tb.add_row([dong_sleep])return tbif d=='MOP':tb.field_names = (['特等座', '二等座','一等座'])special_seat = r.json()['data']['P']second_seat = r.json()['data']['O']first_seat = r.json()['data']['M']tb.add_row([special_seat, second_seat,first_seat])return tbif d=='IJO':tb.field_names = (['二等座', '软卧','硬卧'])soft_sleep = r.json()['data']['AI']second_seat = r.json()['data']['O']hard_sleep = r.json()['data']['AJ']tb.add_row([second_seat, soft_sleep,hard_sleep])return tbdef road(self, a, b, c, d):tb.field_names = (['到站时间', '站点', '站数', '停留时间', '出站时间'])url_1 = f'https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no={a}&from_station_telecode={b}&to_station_telecode={c}&depart_date={d}'resp = requests.get(url=url_1, headers=self.headers)data = resp.json()['data']['data']for i in data:arrive_time = i['arrive_time']station_name = i['station_name']station_no = i['station_no']stopover_time = i['stopover_time']start_time = i['start_time']tb.add_row([arrive_time, station_name, station_no, stopover_time, start_time])return tbdef success(self, e):while True:print('0,重新选择\n''1,查看价格\n''2,火车路程\n')f = input('请输入(-1退出):')if f == '-1':breakif f == '2':choose = int(input('请输入火车的序号:')) - 1xunhao = e[choose]j = self.road(xunhao[1],xunhao[3], xunhao[4], self.times)print(j)tb.clear()if f == '0':continueif f == '1':choose = int(input('请输入火车的序号:'))-1xunhao = e[choose]A=xunhao[1]B=xunhao[5]C=xunhao[6]D=xunhao[7]E = self.price(A, B, C, D, self.times)print(E)tb.clear()def main(self):while True:self.times = self.choose_time()if self.times == '-1':breaka = input('输入出发地:')b = input('输入终点:')c = self.get_code(a)d = self.get_code(b)e = self.get_data(self.times, c, d)tb.clear()if isinstance(e, list):self.success(e)else:print('没有返回数据!!!')choose = input('是否再次尝试\n1,是\n2,算了吧\n')if choose == '1':continueelse:break

对12306车票数据的提取相关推荐

  1. 使用python+selenium对12306车票数据读取

    一.摘要 突发奇想想读取12306的车票信息,最开始想用requests,但是突然又想试试selenium的无界面浏览器.有部分正则没调好,写好就懒得调了. 套用我师傅的话就是:我凭本事写的bug,凭 ...

  2. Python爬取12306车票信息

    Python3爬取12306车票信息 第一次写爬虫,咱从入门级--12306车票爬取 开始 我们要爬取的信息是https://www.12306.cn/index/上的车票信息 当我们选择出发地和目的 ...

  3. Python查询12306车票和使用selenium进行买票

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.程序的整体的架构 二.代码书写 1.UI设计 2.查询模块 3.抢票模块 4.selenium网页买票 总结 前言 ...

  4. Python基础之12306车票信息抓取案例

    Python基础之12306车票信息抓取案例 注:12306上请求网址链接经常变化,需要随时检查更改(我已经修改三遍了),请求的数据也有小几率发生变动,所以也需要检查更改 2018-10-22 第四遍 ...

  5. 王维嘉:神经网络的本质是在数据里面提取相关性

    https://www.toutiao.com/a6674548769591132683/ 3月30日下午消息,2019中国(深圳)IT领袖峰会在今日举行,在青年领袖论坛环节,CEG Ventures ...

  6. wireshark提取流量包中的文件_从Wireshark监听的数据中提取需要的数据

    最近,需要将wireshark监听的数据进行提取,分两步:首先,应该得出wireshark的数据包吧,在图形化界面中可以非常直观的将监听数据进行存储,但是这样需要手动操作非常麻烦,而且容易出错(随着处 ...

  7. python数据接口获取数据_python UI自动化实战记录二:请求接口数据并提取数据

    该部分记录如何获取预期结果-接口响应数据,分成两步: 1 获取数据源接口数据 2 提取后续页面对比中要用到的数据 并且为了便于后续调用,将接口相关的都封装到ProjectApi类中. 新建python ...

  8. arcgis dem栅格立体感_如何使用ArcGIS从DEM数据中提取水系

    1. 概述 在比较偏远的地方,往往会缺少水文信息,我们可以通过ArcGIS对高程DEM数据进行水文分析,为地表水流建立模型,进而获取到该地的水文信息,DEM数据精度越高,获取到的水文数据精度也就越高, ...

  9. nema gps数据转换 matlab,GPS通信的NEMA协议与定位数据的提取.pdf

    第 2 1 卷第 12 期 计算机应用与软件 Vol 2 1 ,No12 2004 年 12 月 Computer Applications and Software Dec2004 GPS 通信的 ...

最新文章

  1. 安装中文和英文man(c函数)
  2. 并查集的一般操作 ③
  3. [转载]宇宙文明等级的划分标准
  4. VC/MFC Combo Box控件的用法
  5. 每天一道LeetCode-----化简路径
  6. java.util.concurrent.BlockingQueue指南
  7. 将CSV文件写入到MySQL中(用Pandas库实现MySQL数据库的读写)
  8. python中 和 的区别_举例子让你明白python中is和==的区别
  9. 2013年3月份计算机二级c语言最新上机题库(搜索关键字版),20133月份计算机二级C语言上机题库(十分强大).doc...
  10. PHP脚本memcache类的源码
  11. html超链接点击后变紫色了,超链接不改变字体颜色
  12. 俄罗斯方块中方块的旋转变形
  13. 如何重启Windows资源管理器
  14. 2407 · 计算 a + aa + aaa + aaaa 的值(LintCode,Python,入门)
  15. 画图软件Java实现(面向对象程序设计)
  16. 【迅为iMX6Q】开发板烧写Uboot后串口无任何输出的问题解决
  17. 树莓派ASP.NET环境配置
  18. 【报告分享】AIoT智能生活场景营销研究报告-小米中传(附下载)
  19. 制作Win10系统U盘,安装纯净版Win10系统教程
  20. “无任何网络提供程序接受指定的网络路径”的解决办法

热门文章

  1. mysql 1236 bug_MySQL 1236错误解决方法
  2. 网页转exe的三种方法
  3. 【oracle报错】ORA-01722:无效数字
  4. 学习博客:关键字package包的使用
  5. 特种光纤所需学习知识(光纤光学)
  6. Leslie--Chueng项目服务端、小程序的本地部署操作教程
  7. 虚幻4渲染编程(光线追踪篇)【第一卷:光线追踪篇开篇综述】
  8. 《Python 深度学习》刷书笔记 Chapter 8 Part-1 生成式深度学习
  9. 达梦数据库删除用户_干货分享丨DM8用户管理
  10. pcie台式网卡无法开热点