python3.X 抓取火车票信息【修正版】


Posted in Python onJune 19, 2018

代码是在源代码的基础上进行的修改。希望对你有所帮助!

 实现后如图所示:

python3.X 抓取火车票信息【修正版】

首先我们需要抓取一些基础的数据,各大火车站信息!

import urllib
from urllib import request
import re
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955'
req = urllib.request.Request(url)
r = urllib.request.urlopen(req).read().decode('utf-8')
stations = re.findall(r'([\u4e00-\u9fa5]+)|([A-Z]+)', r)
stations = dict(stations)
stations = dict(zip(stations.keys(),stations.values()))

上面的代码通过抓取,网页信息,返回一个字典数据:

   stations = dict(zip(stations.keys(),stations.values()))#这行代码在后面进行了建值互换,这里没有进行过修改,这是原文的数据。

火车站的数据抓取成功,我们接下来抓取查询数据,代码如下:

from station import stations
import warnings
def change_date(d1) :
  if '.' in d1 :
    d1 = d1.replace('.', '-')
  if not d1.startswith('0') :
    d1 = str(0) + d1
  if '-' in d1[-2] :
    d1 = d1[:-1] + '0' + d1[-1]
  return d1
def student_or_not(student) :
  if 'y' in student[0].lower() :
    return '0X00'
  else :
    return 'ADULT'
f1 = input('请输入开始城市:\n')
f = stations[f1]
t1 = input('请输入目的城市:\n')
t = stations[t1]
d1 = input('请输入出发时间:\n')
d = str('2018-') + change_date(d1)
student = input('是否为学生票,输入(yes/no)')
print('正在查询' + f1 + '至' + t1 + '的列车,请听听音乐......')
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={d}&leftTicketDTO.from_station={f}&leftTicketDTO.to_station={t}&purpose_codes={student}'
url = url.format(f=f, d=d, t=t, student=student_or_not(student))
warnings.filterwarnings("ignore")

这里本人增加了两个函数 change_date() 和 student_or_not()

 change_date() 这个函数对用户输入日期的行为进行了简化,提高了用户体验,可以直接输入比如7.3这样的日期,其他的符号,我们可以自己进行扩展。

student_or_not() 这个函数的作用是判断查询的是普通票还是学生票

美化显示,区分到站和出发站点的颜色,我们加入如下函数

def colored(color, text) :
  table = {
    'red'  : '\033[91m',
    'green' : '\033[92m',
    'nc'  : '\033[0m'
  }
  cv = table.get(color)
  nc = table.get('nc')
  return ''.join([cv, text, nc])

最后我们进行数据处理展示:

import requests
from get_urltrain import url
from prettytable import PrettyTable
from color_set import colored
from station import stations
def chair_lists(row_list) :
  chair_list = []
  for i in range(len(row_list) - 5, 21, -1) :
    if row_list[i] != '' :
      chair_list.append(row_list[i])
    else :
      chair_list.append('--')
  return chair_list
headers = {
  'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
}
r = requests.get(url, verify=False, headers=headers) # 请求网址1的内容
rows = r.json()['data']['result'] # 将内容解析为列表
trains = PrettyTable()
trains.field_names = ["车次", "车站", "时间", "历时", "商务座\特等座", "一等座", "二等座", "高级软卧", "软卧", "动卧", "硬卧 ", "软座 ", "硬座", "无座",
           "其他"]
# 设置table的header
num = len(rows) # 打印列表的个数
# station1 = dict([v, k] for k, v in stations.items())
station_list = dict(zip(stations.values(), stations.keys()))
for row in rows : # 列表循环
  row_list = row.split('|')
  chair_list = chair_lists(row_list)
  trains.add_row([row_list[3],
          '\n'.join([colored('green', station_list[row_list[6]]),
                colored('red', station_list[row_list[7]])]),
          '\n'.join([colored('green', row_list[8]),
                colored('red', row_list[9])]),
          row_list[10],
          ] + chair_list)
print('查询结束,共有 %d 趟列车。' % num) # 列表个数也就是列车个数
print(trains)

这里我增加了 chair_lists()函数进行循环处理对应的表段

 用于空数据替换成‘?'

station_list = dict(zip(stations.values(), stations.keys()))
 #station_list 进行了建值互换方便下面的循环中的调用
 trains.add_row([row_list[3],
          '\n'.join([colored('green', station_list[row_list[6]]),
                colored('red', station_list[row_list[7]])]),
          '\n'.join([colored('green', row_list[8]),
                colored('red', row_list[9])]),
          row_list[10],
          ] + chair_list)

这个抓取案例我们可以举一反三,可以拓展很多功能,方便我们进行数据快速查询,比如展示价格等等!

 源代码在:https://github.com/morganlions/train

总结

以上所述是小编给大家介绍的python3.X 抓取火车票信息【修正版】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
Python中实现switch功能实例解析
Jan 11 Python
python面向对象法实现图书管理系统
Apr 19 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
python3使用SMTP发送简单文本邮件
Jun 19 #Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 #Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 #Python
python爬虫实例详解
Jun 19 #Python
Python实现的NN神经网络算法完整示例
Jun 19 #Python
python中的二维列表实例详解
Jun 19 #Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 #Python
You might like
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
vue中如何使用ztree
2018/02/06 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
Django 外键的使用方法详解
2019/07/19 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
终端业务员岗位职责
2013/11/27 职场文书
读书小明星事迹材料
2014/05/03 职场文书
爱心捐款感谢信
2015/01/20 职场文书
黑白记忆观后感
2015/06/18 职场文书
学术研讨会主持词
2015/07/04 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
Java无向树分析 实现最小高度树
2022/04/09 Javascript
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL