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中的类与实例
Apr 27 Python
详解python的几种标准输出重定向方式
Aug 15 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
浅谈Python基础之I/O模型
May 11 Python
Python 闭包的使用方法
Sep 07 Python
python3.7.0的安装步骤
Aug 27 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
Django中的DateTimeField和DateField实现
Feb 24 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中数据的批量导入(csv文件)
2006/10/09 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
图解javascript作用域链
2019/05/27 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
详解用python实现简单的遗传算法
2018/01/02 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python2 对excel表格操作完整示例
2020/02/23 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
统计员岗位职责
2013/11/14 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
最感人的道歉情书
2015/05/12 职场文书
检举信的写法
2019/04/10 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python