欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python3 requests 12306查票模块

程序员文章站 2024-03-17 22:47:58
...

记之前的学习,再过一阵子估计忘了。。。

查票不需要登录,但是支付是需要登录的,所以人为操作的话,一般是选择查票->预定->下单(下单时需要登录,出现变态二维码验证)。而我们使用爬虫可以先登录,然后一直保持登录状态,流程:登录->查票->下单(登录时完成了验证)

登录模块并保持session可见之前篇章

 

查询url:

https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2018-04-30&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=ICW&purpose_codes=ADULT

查询出来的结果:

Python3 requests 12306查票模块

Python3 requests 12306查票模块

train_date  是要出发的时间

from_station  是出发站

to_station  是目的站

可以看到返回的json文件中result一栏便是我们查询出来的车的具体信息。拿出一条来分析具体内容。可以看到一条信息中间是以  |  来分割的,采用split("|")来提取出每一个信息。

['null', '列车停运', '630000Z12208', 'Z122', 'GZQ', 'CDW', 'CSQ', 'CDW', '24:00', '24:00', '99:59', 'IS_TIME_NOT_BUY', '', '20180429', '', 'Q9', '03', '15', '0', '1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '0']
['1IdL6OeSyjOsOxbdQuCa3Y8Gti%2FjliuJMJn8UWrqwZwnIOMqS08nauFx%2ByU8LgVf4xNaL%2BcNGS5W%0AySiukRDo%2BwOEpY0V6goMwrPzIjdTBP9CMK%2B6u2%2FnpGJ05CZYCE%2Fr%2BM2GOcTq6GVB2FTUBqQQNlI1%0An5nNJoM9z8XuASHBc32jb6fl3s4gxpCd0tL%2FRZTokNaIqoJuadouxzjE4lHEnMSqXCVCkPowNZhz%0AcOgUGV8QQQXLTQ8jTxJMWV%2FaU3uf', '预订', '6c000G216100', 'G2161', 'CWQ', 'ICW', 'CWQ', 'ICW', '07:58', '15:33', '07:35', 'Y', 'GsHIxKM%2Bse4dDKZNZ7o5Z4ciD9MP%2FFq6S14BeZxZV5TdUEqt', '20180430', '3', 'Q6', '01', '14', '1', '0', '', '', '', '', '', '无', '', '', '', '', '无', '18', '', '', 'O0M0P0', 'OMP', '0']
['g%2B6OX1EV4wfeXF8uLTWRD2UqsJCAzOML7YTmfTJJCAjXyuIlC930YDgjoGmDK8rRpvHdpM%2B5ekOu%0ALDeStR%2Bexq1r1PDWcxtXFC8UdippOZkjgduwpGdbqnGo1LYH8XgUGnNOSN9erAeZ6VKtXmZ8RYF0%0AzWUoEA%2Fk8zA%2FWNnWiqNVgBxWCGCcu%2BwC9AcE9i%2BdxHO9Eq%2FrHHLLXnYC98Bj5r%2BthuOzJXModHyl%0AVsZnlTIUsVxOLAml6ENzV7SZ5hbDslXSw0dYjbk%3D', '预订', '620000K5770M', 'K577', 'CSQ', 'ICW', 'CSQ', 'ICW', '14:00', '11:11', '21:11', 'Y', 'IRkHrYkIRZCqzgnyk8UX9YXI8MgVFQlyedHVqiZ00kO2rLXDiEJc1V2IWFE%3D', '20180430', '3', 'Q7', '01', '18', '0', '0', '', '', '', '无', '', '', '有', '', '无', '有', '', '', '', '', '10401030', '1413', '0']
['UavbzYfc3JEy%2FWiDCC7CFnez%2B0yB2%2FO95Sf9k5jyNr%2BHt1uVVpLQW%2FK4sblNLmhhoksWv4cbvw6P%0AXtUuJ8Zjax8sXizym4728qMqqxxVakGQ5%2BEjlIcLzVLQsRUiPEmE58lY5i8BxuXjtS8nRlCZSYxp%0AXuE5QkZoOY%2FJyGxKGTrHTlMlQFyYk%2B6T%2BTzMkODayHjLQZLDbaAahuGyBTwafk%2BddKqNccE%2FxEZi%0Aobibuu8DSDl0zhwiFR5erCpjcJART8kYzqnN0Y8%3D', '预订', '620000K5020B', 'K502', 'CSQ', 'ICW', 'CSQ', 'ICW', '17:02', '10:53', '17:51', 'Y', 'f0KvuTspxeAi4o6zM1EJoNScVo%2FFCToAmnUbqYBlf7lx3hm5Bl3tCYXpQ4I%3D', '20180430', '3', 'Q6', '01', '09', '0', '0', '', '', '', '无', '', '', '有', '', '无', '有', '', '', '', '', '10401030', '1413', '0']
['syzb%2BAJKph9Irw3WWHnyjqTkvARHk6cTlBzJ9zlln2%2BmY2juPvG8MCufJG45ZZgjvKJYDt3vpw5q%0ARmcuQfzDzlVwVvLzb3dgnUKTfhTg8gnuZQ8EOctkxfoDvjZyatZCHgqfYTp1DM%2FrzIRWID9I8O8H%0AU45T0oV8yI115yXqU7WQy7k0oO6Fj%2Fai6UtLfqxkQUJ7o7CYF9mjSDvDhAKwUG07NP%2B9ediKl1TD%0AFz3uWw4mL%2FoACiY78j94dFdBtYmQ7Tf3yV4aoHc%3D', '预订', '570000K7870O', 'K786', 'NCG', 'ICW', 'CSQ', 'ICW', '18:18', '13:27', '19:09', 'Y', 'iVuA2UPGmD02FGVf4e6rchJUifhgeOSd9i3F8jXZEp%2BCsOA0afut1Tlnx8o%3D', '20180430', '3', 'G1', '11', '19', '0', '0', '', '', '', '无', '', '', '有', '', '无', '无', '', '', '', '', '10401030', '1413', '0']

 

对照上面查询出来的列车信息图可以简单地分析出来一些信息。

 

info={
            "预定号": lst[0],  # 预定号
            "train_no": lst[2],
            "车次": lst[3],  # 车次
            "始发站": lst[4],  # 始发站
            "终点站": lst[5],  # 终点站
            "起始站": lst[6],  # 起始站
            "目标站": lst[7],  # 目标站
            "出发时间": "{} {}".format(date, lst[8]),  # 出发时间
            "到达时间": (date,lst[9]),  # 到达时间
            "历时": lst[10],  # 历时
            "train_location": lst[15],
            "高级动卧": lst[21],  # 高级动卧
            "软卧": lst[23],  # 软卧
            "软座": lst[24],  # 软座
            "特等座": lst[25],  # 特等座
            "无座": lst[26],  # 无座
            "硬卧": lst[28],  # 硬卧
            "硬座": lst[29],  # 硬座
            "二等座": lst[30],  # 二等座
            "一等座": lst[31],  # 一等座
            "商务座": lst[32],  # 商务座
            "动卧": lst[33],  # 动卧
        }

对应的城市编码可以在https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9051查看。比如长沙->CSQ,具体分析下一篇介绍。

Python3 requests 12306查票模块

 

至此,查票阶段差不多完成,可以根据上述的相关内容提取相应的字段,在下单时候post表单数据用到。

查票环节代码流程: post 查票url  ->  分析response中数据