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) ...
随机推荐
- vue全家桶(vue2.x+vue-router+axios+webpack)项目搭建
参考博客文章 博主FungLeo的Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版 注:原博主写的非常详细 本文章为根据原博主教程总结的自己的搭建流程 一.安装n ...
- macOS截屏
Command+Shift+3: 全屏幕截屏,并自动保存在桌面 Command+Shift+4: 手动截屏,并自动保存在桌面 Command+Shift+4, + Space, 之后点击程序的窗口,实 ...
- Github pages博客搭建与域名绑定
Github Page github page是由用户编写的托管在github上的静态网页,为了搭建一个个人博客,我们可以租用一个云服务器然后部署我们的博客项目,常见的比如wordpress,像wp这 ...
- 【原理】RabbitMQ架构图
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息 ...
- checklistbox用法
删除:CheckListBox.DeleteSelected; 上下移: CheckListBox.Items.Move 删除用 CheckListBox1.Items.Delete(Index); ...
- json格式化在线工具推荐
现在系统对接基本都采用json格式的报文,杂乱无章的json让人看起来头大,这里推荐一款在线格式化json的工具, 工具地址: http://www.matools.com/json 这个在线Json ...
- ios获取软键盘完成事件
ios获取软键盘完成事件,通过判断input的onBlur事件即可
- 2017年上半年,一线城市豪宅TOP50成交均价排名
辣眼睛!最新豪宅排行榜来了!释放重磅信号 东方财富网 2017-07-27 08:47 阅读:152 摘要:在中国,在买房这个问题上,不少工薪族都感到亚历山大.但是,在富豪眼里,犯难的是投资哪个房地产 ...
- js实现点击按钮传值
js实现点击按钮传值 page1源码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...
- Codeforces 1173B Nauuo and Chess
题目链接:http://codeforces.com/problemset/problem/1173/B 思路参考:https://www.cnblogs.com/blowhail/p/1099123 ...