自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
得到了请求地址与请求参数后,可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换而来的,所以需要在网页中仔细查找是否有将车站名自动转换为英文缩写的请求信息,具体步骤如下:
(1)关闭并重新打开网络监视器,然后按下快捷键<F5>进行余票查询网页的刷新,此时在网络监视器中选择类型为js的网络请求。在文件类型中仔细分析文件内容是否有,与车站名相关的信息如图30所示。
图30 找到与车站名相关信息
说明:在分析信息位置时,查询按钮仅仅实现了发送查票的网络请求,而并没有发现将文字转换为车站名缩写的相关处理,此时可以判断在进入余票查询页面时就已经得到了将车站名转换为英文缩写的相关信息,所以可以刷新页面查看网络监视器中的网络请求。
(2)选中与车站名相关的网络请求,在请求细节中找到该请求的完整地址。然后在网页中打开该地址测试返回数据,如图31所示。
图31 返回车站名英文缩写信息
说明:看到返回的车站名信息,此时可以确认根据该信息可以进行车站名汉字与对应的英文缩写进行转换。例如,可以在该条信息中找到北京对应的是BJP。由于该条信息并没有自动转换的功能,所以需要将该信息以文件的方式保存在项目中。当需要转换时在文件中查找对应的英文缩写即可。
(3)打开PyCharm开发工具,在check tickets目录中右键菜单依次选择New → Python File,创建一个名称为get_stations.py文件,然后在菜单栏中依次选择File → Default Settings,再参考14.4.2小节中的步骤(4)、步骤(5)安装requests模块即可。
(4)在get_stations.py文件中分别导入requests模块、re模块及os模块,然后创建getStation()方法,该方法用于发送获取地址信息的网络请求,并将返回的数据转换为需要的类型。关键代码如下:
def getStation():
# 发送请求获取所有车站名称,通过输入的站名转换为查询地址的参数
url = 'https://kyfw.12306.cn/otn/resources/js/framework/
station_name.js?station_version=1.9050'
response = requests.get(url, verify=True) # 请求并进行验证
# 获取需要的车站名称
stations = re.findall('([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
stations = dict((stations)) # 转换为字典类型
stations = str(stations) # 转换为字符串类型否则无法写入文件
write(stations) # 调用写入方法
说明:requests模块为第三方模块,该模块主要用于处理网络请求;re模块为Python自带的模块,主要通过正则表达式匹配并处理相应的字符串;os模块为Python自带的模块,主要用于判断某个路径下的某个文件。
注意:随着12306官方网站的更新,请求地址会发生改变,要以当时获取的地址为准。
(5)分别创建write()方法、read()方法及isStations()方法,分别用于写入文件、读取文件以及判断车站文件是否存在,代码如下:
def write(stations):
file = open('stations.text', 'w', encoding='utf_8_sig') # 以写模式打开文件
file.write(stations) # 写入文件
file.close()
def read():
file = open('stations.text', 'r', encoding='utf_8_sig') # 以写模式打开文件
data = file.readline() # 读取文件
file.close()
return data
defisStations():
isStations = os.path.exists('stations.text') # 判断车站文件是否存在
return isStations
(6)打开window.py文件,首先导入get_stations文件下的所有方法,然后在模拟python的程序入口处修改代码。接下来判断是否存在所有车站信息的文件,如果没有该文件就下载车站信息的文件然后显示窗体,如果存在将直接显示窗体即可。修改后代码如下:
from get_stations import * # 导入get_stations文件下的所有方法
if __name__ == "__main__":
ifisStations() == False: # 判断是否存在所有车站的文件,没有就下载,有就直接显示窗体
getStation() # 下载所有车站文件
show_MainWindow() # 调用显示窗体的方法
else:
show_MainWindow() # 调用显示窗体的方法
(7)在window.py文件下,单击右键菜单中选择“Run 'window'”菜单运行主窗体,主窗体界面显示后在check tickets目录下将自动下载stations.text文件,如图32所示,通过该文件可以实现车站名称与对应的英文缩写进行转换。
图32 下载stations.text文件