博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 爬取12306火车票
阅读量:5366 次
发布时间:2019-06-15

本文共 3765 字,大约阅读时间需要 12 分钟。

获取火车站

stations.py

#import certifi#import urllib3import reimport requestsfrom pprint import pprinturl = '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] 
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 requestsfrom docopt import docoptimport sys#sys.path.append(r"/py/stations")from stations import stationsimport jsonfrom prettytable import PrettyTableclass 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, '
':'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 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()

 

转载于:https://www.cnblogs.com/linyouyi/p/11409910.html

你可能感兴趣的文章
angular、jquery、vue 的区别与联系
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
描绘应用程序级的信息
查看>>
php环境搭建脚本
查看>>
php 编译常见错误
查看>>
MES架构
查看>>