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 client使用http post 到server端的代码
Feb 10 Python
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
django静态文件加载的方法
May 20 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python+django+rest框架配置创建方法
Aug 31 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
python deque模块简单使用代码实例
Mar 12 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
Django-silk性能测试工具安装及使用解析
Nov 28 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中的string类型使用说明
2010/07/27 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
php格式化金额函数分享
2015/02/02 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
青安岗事迹材料
2014/05/14 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
2016年校长新年寄语
2015/08/17 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
高中信息技术教学反思
2016/02/16 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
Python字典的基础操作
2021/11/01 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers