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实现根据图标提取分类应用程序实例
Sep 28 Python
Python性能优化技巧
Mar 09 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Python构建网页爬虫原理分析
Dec 19 Python
python如何让类支持比较运算
Mar 20 Python
Python实现的凯撒密码算法示例
Apr 12 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
python和c语言的主要区别总结
Jul 07 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
python基于Kivy写一个图形桌面时钟程序
Jan 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代码优化技巧小结
2015/09/29 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python的词法分析与语法分析
2013/05/18 Python
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
python搜索指定目录的方法
2015/04/29 Python
用Python进行TCP网络编程的教程
2015/04/29 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
期中考试后的反思
2014/02/08 职场文书
优良学风班申请材料
2014/02/13 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
服装设计专业求职信
2014/06/16 职场文书
学习十八大演讲稿
2014/09/15 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
大学学生会辞职信
2015/05/13 职场文书
离职证明范本
2015/06/12 职场文书
员工旷工检讨书
2015/08/15 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers