鱼C论坛

 找回密码
 立即注册
查看: 3470|回复: 12

[技术交流] Python3 采集 12306 车票信息

[复制链接]
发表于 2016-8-2 14:01:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
很久没做 Python 的采集项目了, 这次是一个基于 API 的小玩意, 需要 requests 库
  1. pip3 install requests
复制代码

不废话, 贴代码
  1. import requests
  2. import os
  3. from requests.packages.urllib3.exceptions import InsecureRequestWarning


  4. class Train:
  5.     ticket_hash = {
  6.         '商务座': 'swz_num',
  7.         '特等座': 'tz_num',
  8.         '一等座': 'zy_num',
  9.         '二等座': 'ze_num',
  10.         '高级软卧': 'gr_num',
  11.         '软卧': 'rw_num',
  12.         '硬卧': 'yw_num',
  13.         '软座': 'rz_num',
  14.         '硬座': 'yz_num',
  15.         '无座': 'wz_num',
  16.         '其它': 'qt_num'
  17.     }

  18.     def __init__(self, date, from_station, to_station, train_code=None, ticket_type=None):
  19.         # 抑制 12306 自签发的 SSL 证书引发的 warning
  20.         requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

  21.         self.stationList = self.stationInit()
  22.         self.date = date
  23.         self.from_station = from_station
  24.         self.to_station = to_station
  25.         self.train_code = train_code
  26.         self.ticket_type = ticket_type

  27.     @staticmethod
  28.     def stationInit():
  29.         """
  30.         @bji|北京|BJP|beijing|bj|2
  31.         @拼音缩写三位|站点名称|编码|拼音|拼音缩写|序号
  32.         :return:
  33.         """
  34.         stations = {}
  35.         if not os.path.isfile('station_name.js'):
  36.             res = requests.get(
  37.                 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js',
  38.                 verify=False
  39.             )
  40.             with open('station_name.js', 'wb') as fp:
  41.                 fp.write(res.content)
  42.         with open('station_name.js', encoding='utf8') as fp:
  43.             data = fp.read()
  44.             data = data.partition('=')[2].strip("'")  # var station_names ='..'
  45.         for station in data.split('@')[1:]:
  46.             items = station.split('|')  # bjb|北京北|VAP|beijingbei|bjb|0
  47.             stations[items[1]] = items[2]
  48.         return stations

  49.     def query(self):
  50.         query_url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={}' \
  51.                     '&from_station={}&to_station={}'.format(
  52.             self.date,
  53.             self.stationList[self.from_station],
  54.             self.stationList[self.to_station]
  55.         )
  56.         res = requests.get(query_url, verify=False).json()
  57.         if res == -1:
  58.             return False
  59.         if not res['data']['flag']:
  60.             return False
  61.         if self.train_code and self.ticket_type:
  62.             for each_train in res['data']['datas']:
  63.                 if each_train['station_train_code'] == self.train_code:
  64.                     for each_ticket in self.ticket_type:
  65.                         print(each_ticket + ': ' + each_train[self.ticket_hash[each_ticket]])
  66.         else:
  67.             for each_train in res['data']['datas']:
  68.                 print(each_train['station_train_code'])


  69. t = Train('2016-08-20', '武汉', '上海南', 'K121', ['硬卧', '软卧', '硬座', '软座', '无座'])
  70. t.query()
复制代码


*nix 系统请确保运行目录有写权限


评分

参与人数 2荣誉 +13 鱼币 +13 贡献 +13 收起 理由
小甲鱼 + 8 + 8 + 8 热爱鱼C^_^
SixPy + 5 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-2 16:12:35 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-2 20:02:13 | 显示全部楼层
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 抑制 12306 自签发的 SSL 证书引发的 warning
        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

这个是啥,不太懂,能解释下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-2 21:30:35 | 显示全部楼层
ft3312591 发表于 2016-8-2 20:02
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 抑制 12306 自签发的 SSL  ...

你注释掉这段就知道是什么意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-2 21:30:35 | 显示全部楼层
ft3312591 发表于 2016-8-2 20:02
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 抑制 12306 自签发的 SSL  ...

你注释掉这段就知道是什么意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-3 11:38:48 | 显示全部楼层
requests  InsecureRequestWarning
没有这两个库吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-3 12:02:45 | 显示全部楼层
支持 特别棒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-3 20:25:55 | 显示全部楼层
miss陈 发表于 2016-8-3 11:38
requests  InsecureRequestWarning
没有这两个库吗
  1. pip3 install requests
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-5 02:36:02 | 显示全部楼层
requests 让 urllib 成了摆设~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-30 11:02:09 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-30 15:37:03 | 显示全部楼层
膜拜。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-30 16:41:31 | 显示全部楼层
厉害了我的哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-16 15:20:42 | 显示全部楼层
学习下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 16:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表