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简单实现Base64编码和解码的方法
Apr 29 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
django启动uwsgi报错的解决方法
Apr 08 Python
django ajax json的实例代码
May 29 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
python实现移动木板小游戏
Oct 09 Python
Python importlib模块重载使用方法详解
Oct 13 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 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
php增删改查示例自己写的demo
2013/09/04 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
div模拟滚动条效果示例代码
2013/10/16 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
德国旅游网站:weg.de
2018/06/03 全球购物
如何写好建议书
2014/03/13 职场文书
优秀教师个人总结
2015/02/11 职场文书
大学生军训感言
2015/08/01 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
JavaScript实现简单拖拽效果
2021/09/15 Javascript
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
linux目录管理方法介绍
2022/06/01 Servers