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判断字符串与大小写转换
Jun 08 Python
Python命令启动Web服务器实例详解
Feb 23 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
Python实现微信翻译机器人的方法
Aug 13 Python
python自动点赞功能的实现思路
Feb 26 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
python自动化办公操作PPT的实现
Feb 05 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 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
网站上面有这种切换效果
2006/06/26 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
python制作一个桌面便签软件
2015/08/09 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
python如何将多个PDF进行合并
2019/08/13 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
Python中常见的数制转换有哪些
2020/05/27 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
2013年入党人员的自我鉴定
2013/10/25 职场文书
美术国培研修感言
2014/02/12 职场文书
小学生开学感言
2014/02/28 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书