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实现检测服务器是否可以ping通的2种方法
Jan 01 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
Python中使用items()方法返回字典元素对的教程
May 21 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
python实现杨辉三角思路
Jul 14 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
Python中新式类与经典类的区别详析
Jul 10 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 Python
python中filter,map,reduce的作用
Jun 10 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
常用DOM整理
2015/06/16 Javascript
js解决movebox移动问题
2016/03/29 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
Python模拟登录12306的方法
2014/12/30 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
软件测试题目
2013/02/27 面试题
大学四年的个人自我评价
2014/01/14 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
Python 实现Mac 屏幕截图详解
2021/10/05 Python
Java详细解析==和equals的区别
2022/04/07 Java/Android