#!/usr/bin/env python#coding:utf-8

"""命令行的火车票查看器

Usage:

12306 [-gdtkz]

Options:

-h,--help 显示帮助

-g 高铁

-d 动车

-t 特快

-k 快速

-z 直达

Example:

12306 上海 北京 2016-12-16

12306 -dg 上海北京 2016-12-16

pip install requests prettytable docopt colorama

#prettytable格式化工具

#docopt是python3命令行的位置参数解析工具

#colorama是添加显示颜色"""

importrequestsfrom docopt importdocoptimportsys#sys.path.append(r"/py/stations")

from stations importstationsimportjsonfrom prettytable importPrettyTableclassTrainsCollections:

header= '车次 车站 时间 历时 一等 二等 软卧 硬卧 硬座 无座'.split()def __init__(self,available_tranins,options):

self.available_tranins=available_tranins

self.options=optionsdef_get_duration(self,raw_train):

durations= raw_train.get('lishi').replace(':','小时') + '分'

returndurations#装饰器,把此函数定义为属性,以被别的函数调用

@propertydeftrains(self):for raw_train inself.available_tranins:

train_no= raw_train['station_train_code']

initial=train_no[0].lower()if not self.options or initial inself.options:

train=[

train_no,'\n'.join([raw_train['from_station_name'],raw_train['to_station_name']]),'\n'.join([raw_train['start_time'],raw_train['arrive_time']]),

self._get_duration(raw_train),

raw_train['zy_num'],

raw_train['ze_num'],

raw_train['rw_num'],

raw_train['yw_num'],

raw_train['yz_num'],

raw_train['wz_num'],

]#print(train)

#生成器,一次返回一项

yieldtraindefpretty_print(self):

pt=PrettyTable()

pt._set_field_names(self.header)for train inself.trains:

pt.add_row(train)print(pt)defcli():'''{

'-d':True,

'-g':True,

'-k':False,

'-t':False,

'-z':False,

'':'2017-03-23',

'':'海口',

'':'北京'}'''arguments= docopt(__doc__)print(arguments)

from_station= stations.get(arguments[''])

to_station= stations.get(arguments[''])

date= arguments['']#获取参数,列表解析

options = ''.join([k for k,v in arguments.items() if v isTrue])

url= 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(date,from_station,to_station)#url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'

r = requests.get(url,verify=False)print(url)#jjj = json.loads(str(r))

available_tranins1 = r.json()['data']

available_tranins=[]for available_tranins2 inavailable_tranins1:

available_tranins.append(available_tranins2['queryLeftNewDTO'])#available_tranins = list(available_tranins.keys())

#print(available_tranins)

#TrainsCollections(available_tranins,options).pretty_print()

#available_tranins = available_tranins2['queryLeftNewDTO']

#print(available_tranins)

#print(type(available_tranins[0]))

TrainsCollections(available_tranins,options).pretty_print()if __name__ == '__main__':#TrainsCollections.cli()

cli()

python爬取12306_Python 爬取12306火车票相关推荐

  1. python爬取12306_Python爬取12306车次信息代码详解

    详情查看下面的代码: 如果被识别就要添加一个cookie如果没有被识别的话就要一个user-agent就好了.如果出现乱码就设置编码格式为utf-8 #静态的数据一般在elements中(复制文字到s ...

  2. python爬取12306_python爬取12306列车信息

    #!/usr/bin/env python #coding=utf8 #12306查票爬虫 import requests,json,sys #获取地址代码 #https://kyfw.12306.c ...

  3. python爬取12306_python爬取12306火车车次信息

    #-*- coding:utf-8 -*- importrequestsimportreimportjson#关闭https证书验证警告 requests.packages.urllib3.disab ...

  4. python爬取12306_python爬取12306的车次信息

    #静态的数据一般在elements中(复制文字到sources按ctrl+f搜索.找到的为静态),而动态去network中去寻找相关的信息 import requests import re def ...

  5. python模拟登录12306_Python模拟登录12306的方法

    #!/usr/bin/python # -*- coding: utf-8 -*- import re; import sys; import cookielib; import urllib; im ...

  6. python模拟登录12306_python模拟登录12306缺少cookies

    [Python] 纯文本查看 复制代码API_GET_BROWSER_DEVICE_ID = '此处填接口地址' def request_device_id(self): ""&q ...

  7. Python脚本实现12306火车票自动抢票回家or旅游

    最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入正题: 这个脚本目前只能刷一趟车的,人数可以是多个,支持 ...

  8. Python3.6实现12306火车票自动抢票(内含源码)

    最近在学Python,刚好过完年啦!大家应该都需要买高铁票继续去当打工人了吧!所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入 ...

  9. 如何用Python3实现12306火车票自动抢票,小白必学

    最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入正题:在进入正题之前,我想说明一下,由于12306官网的 ...

最新文章

  1. Dat.gui 使用教程
  2. myeclipse10.7激活
  3. 无招胜有招之Java进阶JVM(四)内存模型plus
  4. @scheduled只执行一次_SpringBoot第四篇:定时任务@Scheduled
  5. Thymeleaf的Spring数据
  6. 解决SSH登录无响应timed out问题
  7. Geometric Shapes - POJ 3449(多边形相交)
  8. 网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议
  9. Exchange2003/2010共存模式环境迁移
  10. python实时监控redis队列_Python的Flask框架应用调用Redis队列数据
  11. 教程:GIMP中改变画布大小
  12. 全国高中数学联赛——代数
  13. 注册公众号(企业类型的订阅号)参考步骤
  14. J2SE - super
  15. NASA WIND卫星观测数据作图——origin
  16. Java多态1 - 引入多态,多态解决主人给不同动物喂食物的问题
  17. 华为mate10开机android,华为Mate 10双清教程
  18. 编辑部的故事:后厂村有没有生活?
  19. 企业级Docker虚拟化平台实战
  20. iOS AdHoc ipa包改用企业账号重新签名(含动态framework)

热门文章

  1. Spring JDBC 访问数据库
  2. php artisan code,源码解读 Laravel PHP artisan config:cache
  3. 青海师范大学计算机专业分数线,青海师范大学2018年各省及各专业录取分数线及最低录投档线【理科 文科】...
  4. 指纹支付 android 9,华为荣耀9支持指纹支付吗_华为荣耀9支持指纹识别吗-太平洋IT百科...
  5. 智慧城市的互联网大脑架构图,大社交网络与智慧城市结合是关键
  6. android 短信 代码错误,android – Firebase手机身份验证错误:短信代码已过期
  7. 计算机科学职业位置,计算机专业的职业生涯规划范文
  8. 蓝桥杯 ADV-201 VIP试题 我们的征途是星辰大海(试题解析)
  9. 谈谈以前端的角度出发做好seo需要做什么?
  10. leetcode_345 Reverse Vowels of a String