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的消息队列包SnakeMQ使用初探
Jun 29 Python
python算法演练_One Rule 算法(详解)
May 17 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
python suds访问webservice服务实现
Jun 26 Python
python合并多个excel文件的示例
Sep 23 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 Python
变长双向rnn的正确使用姿势教学
May 31 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
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
php集成动态口令认证
2016/07/21 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
为Python的web框架编写前端模版的教程
2015/04/30 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
车间机修工岗位职责
2014/02/28 职场文书
司机职责范本
2014/03/08 职场文书
中秋节主持词
2014/04/02 职场文书
春游踏青活动方案
2014/08/14 职场文书
银行授权委托书格式
2014/10/10 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android