代码采用python3编写,本来用PyQt5做了一个方便的查询界面,不过这篇文章主要来介绍爬取功能,就不把Qt代码贴出来了,可以先看一下效果。运行后只需输入起始站、终点站和日期就可以看到如下效果,和火车站的显示屏有点相似。

查询车次的脚本还是比较简单的,只是访问一下车次信息而已,不需要用到Cookie和Session这些信息。
首先把过程写出来:
1.分析查询需要的信息参数
2.找到查询的链接
3.写代码
4.测试


首先分析网站

通过抓包可以知道查询请求的网址链接,比如:https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-24&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT

因为12306的网站信息是经常变化的,所以需要实时地在代码中修改它,到时候再查看即可。其中有三个参数:
train_date
from_station
to_station
我们可以看到其中的车站信息都不是以汉字的形式给出的,比如上面的BJP和SHH。所以需要把车站名和这些代号的联系找出来。

获取车站信息

这些信息储存再一个js里面,链接:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9091

再查询的界面抓包也可以找到,打开这个链接可以看到这样的界面:
把这些信息截取下来:

import re
import requests
from pprint import pprintdef main():url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9091'# 获取信息,且不判断证书response = requests.get(url, verify=False)# 使用正则表达式提取所有的站点stations = dict(re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text))# 分别把车站名和代号提取出来pprint(stations.keys())pprint(stations.values())if __name__ == '__main__':main()

新建一个stations.py来储存这些信息并且建立双向关系:

names = ['北京北', '北京东', '北京', '北京南', '北京西'......]
codes = ['VAP', 'BOP', 'BJP', 'VNP', 'BXP'......]#关系转换
def get_name(code):return names[telecodes.index(code)]def get_code(name):return codes[names.index(name)]

写代码进行提取

爬取需要用到的库:
requests:爬虫必用的发送请求,获取HTML网页内容的库。
发挥爬取功能只需要这个库就绰绰有余,为了显示方便我们加上一个显示库:
prettytable:能让你的数据像MySQL的命令行显示数据的格式一样。
本次爬取不需要请求头也能正常进行,当然加上也可以。

以下是主要代码,可以根据需求自己更改,如果是直接复制下来可能无法成功运行,毕竟写了有一段时间了,12306每隔一段时间就会更改网站信息,所以看情况更改。当然,重在学习知识。
这是在win10上面编写的,要在linux上运行就加上必要的头信息。

import requests
from prettytable import PrettyTable
import stations
from colorama import init, Fore#请求信息
f_station = stations.get_code(input('起始站:'))
t_station = stations.get_code(input('终点站:'))
date = input('出行时间:')# 构造请求地址
url = ('https://kyfw.12306.cn/otn/leftTicket/queryZ?''leftTicketDTO.train_date={}&''leftTicketDTO.from_station={}&''leftTicketDTO.to_station={}&'  'purpose_codes=ADULT').format(date, f_station, t_station)# 不判断证书
r = requests.get(url, verify=False)
r.encoding = r.apparent_encoding# requests得到的是一个json格式的对象
# 原始火车数据
raw_trains = r.json()['data']['result']
header = ('车次 车站 时间 历时 特等座 一等 二等 高级软卧 软卧 硬卧'+ '软座 硬座 无座 备注').split()# 历时转换
def get_duration(raw_trains):duration = raw_train[10].replace(':', '小时') + '分'if duration.startswith('00'):return duration[4:]if duration.startswith('0'):return duration[1:]return duration# 返回每个车次的基本信息
def trains(raw_train):for raw_train in raw_trains:# 列车号train_no = raw_train[3]# 得到什么列车并小写initial = train_no[0].lower()# 反转station所对应的字典stations_re = dict(zip(stations.values(), stations.keys()))# 将车次的信息保存到列表中# train 出发地begin_station = stations_re.get(raw_train[4])# train 目的地end_station = stations_re.get(raw_train[5])# your 出发地from_station = stations_re.get(raw_train[6])# your 目的地to_station = station_re.get(raw_train[7])# 判断是起始还是经过begin_flag = __check_equals(begin_station, from_station)end_flag = __check_equals(end_station, to_station)train = [train_no,# 时间get_duration(raw_train),# 历时raw_train[9],# 特等座__show_color(raw_train[31]),# 一等__show_color(raw_train[30]),# 二等__show_color(raw_train[22]),# 高级软卧__show_color(raw_train[23]),# 软卧__show_color(raw_train[25]),# 软座__show_color(raw_train[24]),# 硬座__show_color(raw_train[29]),# 无座__show_color(raw_train[26]),# 备注__show_color(raw_train[1]),]# 更改不运行车次的时间和历时if raw_train[14] == 'null':train[2] = '--\n--'train[3] = '--'for i, item in enumerate(train):if not item:train[i] = '--'yield traindef __check_equals(from_station, to_station):if from_station == to_station:return '始'else:return '过'def __get_color(color, content):return color + content + Fore.RESETdef __show_color(content):if content == '有':return Fore.GREEN + content + Fore.RESETelse:return content#打印信息
def pretty_print():pt = PrettyTable()pt._set_field_names(self.header)for train in self.trains():pt.add_row(train)print(pt)if __name__ == '__main':time = get_duration(raw_trains)

部分参考来源:https://blog.csdn.net/tigaoban/article/details/78558417

Python查询12306车次信息相关推荐

  1. python爬取12306_Python爬取12306车次信息代码详解

    详情查看下面的代码: 如果被识别就要添加一个cookie如果没有被识别的话就要一个user-agent就好了.如果出现乱码就设置编码格式为utf-8 #静态的数据一般在elements中(复制文字到s ...

  2. python 12306查询不到车次_Python3.x 抓取12306车次信息,表格详情显示,让你学会思路,分析网站特点,爬取数据。12306车票查看器!...

    我的例子都比较适合新手,那种老司机请绕道,谢谢! ps 前言 最近学习Python,所以呢?跟大家一样,都是看看官网,看看教程,然后就准备搞一个小东西来试试,那么我使用的例子是实验楼中的12306火车 ...

  3. (二)、Python查询12306余票:联网查询余票信息并解析

    前一篇–>实现始发站.终点站和出发日期的合法性检验 以下如果有的变量不明白说明在前面的文章已经介绍了,切记! 首先我们来看看每查询一条信息12306网站返回的信息: 请求链接: https:// ...

  4. 小白入门爬虫~爬取12306车次信息(静态网站和动态网站的区分)(get动态网页的爬取)

    elements,console,source,network elements分析网络结构,获取想要的数据 console打印一些网站的数据,做网站的时候有时候可能会在控制台上打印一些数据 sour ...

  5. python查询12306余票_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  6. (三)Python查询12306余票:漂亮的输出-----prettytable和colorama的使用

    前一篇–>联网查询余票信息并解析 在前面的代码中我们已经实现了对result结果的解析,并且能把车票信息打印出来了.可是输出的格式很不好控制,这时我们需要使用prettytable来实现将车票信 ...

  7. (五)Python查询12306余票:添加票价信息

    前一篇–>docopt实现参数的输入-–查询任意时间任意车站余票 票价的查询根据前面result的解析是无法获取的,票价需要另外发送请求获取. 请求链接: https://kyfw.12306. ...

  8. Python实现查询12306火车票信息

    例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过! 1.接口设置 ...

  9. python识别火车票二维码_Python实现查询12306火车票信息

    例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过! 1.接口设置 ...

最新文章

  1. java 顺序 读写 Properties 配置文件 支持中文 不乱码
  2. python如何编程-终于发现怎么自学python编程
  3. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值
  4. Ubuntu修改root密码以及允许证书和密码登陆
  5. 宜兴电信成功跨界合作开拓农村物联网市场
  6. python中0xf2_python入门(一)
  7. 在linux上cuda9.0 cudnn7.* 安装python3.6 tensorflow 1.5.1
  8. RS(2)--从文本数据到用户画像
  9. 《Android 应用测试指南》——第2章,第2.4节包浏览器
  10. 用Visual C#来清空回收站(2)
  11. node服务器中打开html文件的两种方法
  12. [Java] 蓝桥杯ADV-135 算法提高 三角形面积
  13. 【C++leetcode】寻找给定字符串的最大回文子串
  14. 【回归预测】基于matlab哈里斯鹰算法优化混合核极限学习机KELM回归预测【含Matlab源码 1751期】
  15. MIDAS截面特性计算器说明
  16. 手贱大意删除重要的文件怎么办!!!一招教你怎样恢复误删的文件
  17. 普林斯顿陈丹琦组:以实体为问题中心,让稠密检索模型DPR光环暗淡
  18. 小米的智能家居全套下来需要多少钱?
  19. 首届西瓜PLAY视频嘉年华狂欢来袭,万张门票几近售罄
  20. PaddleOCR报错Process finished with exit code

热门文章

  1. java企业网站源码,模版,有前后台,springmvcSSM,freemaker
  2. 3月钓鱼网站简报:.COM域名超68% 中国数据居二
  3. 中英文说明书丨艾美捷MYC(人)重组蛋白介绍
  4. GT940MX能学C语言吗,940mx能玩csgo吗(940mx的csgo多少帧)
  5. Delphi 通过窗口句柄 加粗窗口边框、描边
  6. 配置 containerd 镜像仓库完全攻略
  7. 缓冲区溢出攻击实验(深大计系2实验4)三题思路+答案
  8. 网址域名查询-域名注册查询工具
  9. python中的paste deploy
  10. 微信小程序发送模板消息踩的坑