获取火车站

stations.py

#import certifi
#import urllib3
import re
import requests
from pprint import pprint url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9001'
response = requests.get(url, verify=False)
stations = re.findall('([\u4e00-\u9fa5]+)\|([A-Z]+)',response.text)
print(dict(stations))
#pprint(dict(stations),indent=4)

根据出发地,目的地,时间查询

#!/usr/bin/env python
#coding:utf-8
"""命令行的火车票查看器
Usage:
12306 [-gdtkz] <from> <to> <date> 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是添加显示颜色 """
import requests
from docopt import docopt
import sys
#sys.path.append(r"/py/stations")
from stations import stations
import json
from prettytable import PrettyTable class TrainsCollections:
header = '车次 车站 时间 历时 一等 二等 软卧 硬卧 硬座 无座'.split()
def __init__(self,available_tranins,options):
self.available_tranins = available_tranins
self.options = options
def _get_duration(self,raw_train):
durations = raw_train.get('lishi').replace(':','小时') + '分'
return durations #装饰器,把此函数定义为属性,以被别的函数调用
@property
def trains(self):
for raw_train in self.available_tranins:
train_no = raw_train['station_train_code']
initial = train_no[0].lower()
if not self.options or initial in self.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)
#生成器,一次返回一项
yield train def pretty_print(self):
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt) def cli():
'''
{
'-d':True,
'-g':True,
'-k':False,
'-t':False,
'-z':False,
'<date>':'2017-03-23',
'<from>':'海口',
'<to>':'北京'}
'''
arguments = docopt(__doc__)
print(arguments)
from_station = stations.get(arguments['<from>'])
to_station = stations.get(arguments['<to>'])
date = arguments['<date>']
#获取参数,列表解析
options = ''.join([k for k,v in arguments.items() if v is True])
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 in available_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火车票的更多相关文章

  1. python爬取12306及各参数的使用。完整代码

    import requestsfrom retrying import retryreuquests和retrying的下载及安装可以通过命令行pip install 口令实现 # 调用重连装饰器固定 ...

  2. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  3. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  4. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

  5. Python:爬取乌云厂商列表,使用BeautifulSoup解析

    在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...

  6. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

  7. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...

  8. Python爬取豆瓣指定书籍的短评

    Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...

  9. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

随机推荐

  1. tengine日志切割-配置分钟级别日志自动切割

    tengine日志切割-配置分钟级别日志自动切割 安装 以安装最新版本的tengine-2.1.2版本 下载连接 tengine支持许多变量 变量 $conn_requests 当前请求在长连接上的序 ...

  2. push declined due to email privacy restrictions

    使用git push到Github网站的时候提示: push declined due to email privacy restrictions 原因 在Github设置里有一个隐私选项 Block ...

  3. HTML标签分类总结

    块级元素和行内元素块级元素address - 地址blockquote - 块引用center - 举中对齐块dir - 目录列表div - 常用块级容易,也是css layout的主要标签dl - ...

  4. Android中当数据库需要更新时我们该怎么办?

    问题:Android数据库更新并保留原来的数据如何实现 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我 ...

  5. Minimum Snap轨迹规划详解(1)轨迹规划

    一. 轨迹规划是什么? 在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划.运动规划一般又分为两步: 1.路径规划:在地图(栅格地图.四\八叉树.RRT地图等)中搜索一条从A点到B ...

  6. I - Nice to Meet You

    传送门 和10-17 B 君的第三题 类似,应该算是简化版,给出了固定的点. f[s]表示只考虑连端都在s集合中的边,s中的固定点(1或者2)能到达整个集合的方案数. 预处理c[s]表示s集合中的总边 ...

  7. Ext 面板(Panel)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Spring 容器初始化方法

    Resource resource = new ClassPathResource("/bean.xml");         resource = new FileSystemR ...

  9. STM32嵌入式开发学习笔记(三):使用按键控制小灯

    按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作. 查阅技术手册,按钮连接GPIOA控制下的管脚0. 但与之不同的是,按键是一种输入设备,输入 ...

  10. AMS算法

    #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000//采样点的个数 #defi ...