Python 爬取12306火车票
获取火车站
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火车票的更多相关文章
- python爬取12306及各参数的使用。完整代码
import requestsfrom retrying import retryreuquests和retrying的下载及安装可以通过命令行pip install 口令实现 # 调用重连装饰器固定 ...
- Python 爬取所有51VOA网站的Learn a words文本及mp3音频
Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- Python:爬取乌云厂商列表,使用BeautifulSoup解析
在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- python爬取免费优质IP归属地查询接口
python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...
- Python爬取豆瓣指定书籍的短评
Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...
- python爬取网页的通用代码框架
python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...
随机推荐
- java中的继承、重载和覆盖是什么意思
继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”.继承可以使得 ...
- vector注意事项
vector注意事项: 如果你添加元素,但是vector的容量(是容量,不是大小,容量比大小大,会预先多分配空间)不够的话,系统就会重新分配一段内存,然后把原先的内容全部拷贝过去,然后删除原先的内容. ...
- 1、cmd中检测远程的ip和端口是否处于监听状态
一.使用 ping 命令测试远程的ip是否可连通 cmd (右键 管理员角色) --- ping IP 二.使用 telnet 测试远程某一个ip的端口是否开放 1.为了安全起见,window ...
- poj 3744 矩阵快速幂+概率dp
题目大意: 输入n,代表一位童子兵要穿过一条路,路上有些地方放着n个地雷(1<=n<=10).再输入p,代表这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i ...
- Redis中存储对象区别
1.最常用的是String结构,key和value都是字符串类型: 2.哈希:比较是用于对对象的操作: 3.List:按照插入数据顺序保存,value是可以重复的,底层是双向链表: 4.集合:是Str ...
- 【纪中集训】2019.07.11【NOIP提高组】模拟 B 组TJ
Preface 今天的B组题确实比A组难多了... T1 Description 有一个长为\(n(n\in[1,2*10^5])\)的01串,有\(m(m\in[1,10^5])\)个限制\(a_i ...
- 使用Vue和djangoframwork完成登录页面构建 001
使用Vue和djangoframwork完成登录页面构建 001 环境的搭建 首先,我在我的电脑的F盘创建了一个文件夹 forNote,进入到这个文件夹中 F:\forNote> vue环境的搭 ...
- Ext 可编辑的GridPanel
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL中忘记用户登陆密码该如何修改
1.每个数据库登陆之前都必须先启动它本身的数据服务,SQL数据库也不例外,首先我们要做的是先打开我们的SQL数据服务! 2.随后在我们的开始菜单中找到我们的SQL启动图标,打开即可 3.弹出登录窗体( ...
- (转)OpenFire源码学习之六:用户注册
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...