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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
用python删除java文件头上版权信息的方法
Jul 31 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
python针对excel的操作技巧
Mar 13 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
python之super的使用小结
Aug 13 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python实现验证码识别
Jun 15 Python
用opencv给图片换背景色的示例代码
Jul 08 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数据加密详解
2013/06/18 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
js实现拖拽效果
2015/02/12 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python库安装速度过慢解决方案
2020/07/14 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
高中毕业自我评价
2014/02/08 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript