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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
Python线程同步的实现代码
Oct 03 Python
python中的tcp示例详解
Dec 09 Python
python将视频转换为全字符视频
Apr 26 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
如何解决pycharm调试报错的问题
Aug 06 Python
python实现简单猜单词游戏
Dec 24 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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判断上传文件类型的解决办法
2015/10/20 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
详解javascript void(0)
2020/07/13 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
python爬取51job中hr的邮箱
2016/05/14 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
高中班长自我鉴定
2013/12/20 职场文书
小学生植树节活动总结
2014/07/04 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
社会实践活动总结
2015/02/05 职场文书
表扬信范文
2015/05/04 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电