python3.X 抓取火车票信息【修正版】
作者:MorganLions 时间:2022-01-26 01:24:53
代码是在源代码的基础上进行的修改。希望对你有所帮助!
实现后如图所示:
首先我们需要抓取一些基础的数据,各大火车站信息!
import urllib
from urllib import request
import re
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955'
req = urllib.request.Request(url)
r = urllib.request.urlopen(req).read().decode('utf-8')
stations = re.findall(r'([\u4e00-\u9fa5]+)|([A-Z]+)', r)
stations = dict(stations)
stations = dict(zip(stations.keys(),stations.values()))
上面的代码通过抓取,网页信息,返回一个字典数据:
stations = dict(zip(stations.keys(),stations.values()))#
这行代码在后面进行了建值互换,这里没有进行过修改,这是原文的数据。
火车站的数据抓取成功,我们接下来抓取查询数据,代码如下:
from station import stations
import warnings
def change_date(d1) :
if '.' in d1 :
d1 = d1.replace('.', '-')
if not d1.startswith('0') :
d1 = str(0) + d1
if '-' in d1[-2] :
d1 = d1[:-1] + '0' + d1[-1]
return d1
def student_or_not(student) :
if 'y' in student[0].lower() :
return '0X00'
else :
return 'ADULT'
f1 = input('请输入开始城市:\n')
f = stations[f1]
t1 = input('请输入目的城市:\n')
t = stations[t1]
d1 = input('请输入出发时间:\n')
d = str('2018-') + change_date(d1)
student = input('是否为学生票,输入(yes/no)')
print('正在查询' + f1 + '至' + t1 + '的列车,请听听音乐......')
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={d}&leftTicketDTO.from_station={f}&leftTicketDTO.to_station={t}&purpose_codes={student}'
url = url.format(f=f, d=d, t=t, student=student_or_not(student))
warnings.filterwarnings("ignore")
这里本人增加了两个函数 change_date() 和 student_or_not()
change_date()
这个函数对用户输入日期的行为进行了简化,提高了用户体验,可以直接输入比如7.3这样的日期,其他的符号,我们可以自己进行扩展。
student_or_not()
这个函数的作用是判断查询的是普通票还是学生票
美化显示,区分到站和出发站点的颜色,我们加入如下函数
def colored(color, text) :
table = {
'red' : '\033[91m',
'green' : '\033[92m',
'nc' : '\033[0m'
}
cv = table.get(color)
nc = table.get('nc')
return ''.join([cv, text, nc])
最后我们进行数据处理展示:
import requests
from get_urltrain import url
from prettytable import PrettyTable
from color_set import colored
from station import stations
def chair_lists(row_list) :
chair_list = []
for i in range(len(row_list) - 5, 21, -1) :
if row_list[i] != '' :
chair_list.append(row_list[i])
else :
chair_list.append('--')
return chair_list
headers = {
'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
}
r = requests.get(url, verify=False, headers=headers) # 请求网址1的内容
rows = r.json()['data']['result'] # 将内容解析为列表
trains = PrettyTable()
trains.field_names = ["车次", "车站", "时间", "历时", "商务座\特等座", "一等座", "二等座", "高级软卧", "软卧", "动卧", "硬卧 ", "软座 ", "硬座", "无座",
"其他"]
# 设置table的header
num = len(rows) # 打印列表的个数
# station1 = dict([v, k] for k, v in stations.items())
station_list = dict(zip(stations.values(), stations.keys()))
for row in rows : # 列表循环
row_list = row.split('|')
chair_list = chair_lists(row_list)
trains.add_row([row_list[3],
'\n'.join([colored('green', station_list[row_list[6]]),
colored('red', station_list[row_list[7]])]),
'\n'.join([colored('green', row_list[8]),
colored('red', row_list[9])]),
row_list[10],
] + chair_list)
print('查询结束,共有 %d 趟列车。' % num) # 列表个数也就是列车个数
print(trains)
这里我增加了 chair_lists()
函数进行循环处理对应的表段
用于空数据替换成‘–'
station_list = dict(zip(stations.values(), stations.keys()))
#station_list 进行了建值互换方便下面的循环中的调用
trains.add_row([row_list[3],
'\n'.join([colored('green', station_list[row_list[6]]),
colored('red', station_list[row_list[7]])]),
'\n'.join([colored('green', row_list[8]),
colored('red', row_list[9])]),
row_list[10],
] + chair_list)
这个抓取案例我们可以举一反三,可以拓展很多功能,方便我们进行数据快速查询,比如展示价格等等!
源代码在:https://github.com/morganlions/train
总结
以上所述是小编给大家介绍的python3.X 抓取火车票信息【修正版】网站的支持!
来源:https://blog.csdn.net/TianPingXian/article/details/80717544
标签:python,抓取,火车票
0
投稿
猜你喜欢
phpstudy apache开启ssi使用详解
2023-05-25 08:04:44
Python实现光速定位并提取两个文件的不同之处
2023-11-01 10:42:25
破解 屏蔽 防框架代码 top.location != self.location
2008-11-27 12:59:00
Anaconda+pycharm安装及环境配置全过程
2023-05-20 09:40:14
Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)
2023-06-06 21:28:07
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2024-04-30 08:47:06
运用ASP调用数据库中视图及存储过程
2008-02-03 15:33:00
python如何对实例属性进行类型检查
2021-08-17 09:28:19
pytorch常用数据类型所占字节数对照表一览
2021-07-25 15:26:29
Sql 语句学习指南第1/2页
2024-01-25 07:13:01
python实现根据给定坐标点生成多边形mask的例子
2022-03-22 14:40:15
ASP下标越界错误的解决方法
2008-10-19 17:39:00
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2024-05-13 09:29:36
python小项目之五子棋游戏
2022-07-12 06:24:23
django如何实现视图重定向
2022-05-28 12:22:13
设计模式-自动完成
2010-11-30 21:44:00
W3C 接连推出 7 个 HTML 草案
2010-03-10 10:37:00
关于python 读取csv最快的Datatable的用法,你都学会了吗
2022-02-22 20:38:32
on error goto (Vbscript)和try catch
2008-08-04 13:22:00
关于设计品质保证(DQA)的几点想法
2007-11-16 16:55:00