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和C++求解方法
Aug 20 Python
python实现感知器
Dec 19 Python
使用python编写监听端
Apr 12 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
python实现机器学习之元线性回归
Sep 06 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
对Django中内置的User模型实例详解
Aug 16 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
python ssh 执行shell命令的示例
Sep 29 Python
python中的unittest框架实例详解
Feb 05 Python
Python基础详解之邮件处理
Apr 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用户指南-cookies部分
2006/10/09 PHP
PHP5 安装方法
2007/01/15 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python实现KNN邻近算法
2021/01/28 Python
python对于requests的封装方法详解
2019/01/03 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
python实现登录与注册系统
2020/11/30 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
2014的自我评价
2014/01/13 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
购房协议书范本
2014/04/11 职场文书
个人融资协议书
2014/10/02 职场文书
优秀党员个人总结
2015/02/14 职场文书
暖春观后感
2015/06/08 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL