0. 需求
爬取所有城市下的站台信息保存到Excel中:
效果:
1. 定位数据源
在12306随便一个车票查询页面上,通过F12控制台获取网站请求车站数据的URL
博主当前获取的URL为:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9270
*注意: 不同时期车站数据可能会发生变化, 准确度要求不高的话, 可以直接用这个, 获取时间是2023年7月5日.
2. 解构数据
可以看到每个站台的数据结构是:
@bjb | 北京北 | VAP | beijingbei | bjb | 0 | 0357 | 北京 | | |
我们需要的是其中的站台数据北京北 和城市数据:北京, 这种需要用到正则表达式的东西,我们现在就不用自己再去找正则表达式语法了, 直接让AI干, 效果如下:
提问:
字符串为: @bjb|北京北|VAP|beijingbei|bjb|0|0357|北京|||@bjd|北京东|BOP|beijingdong|bjd|1|0357|北京|||@shn|上海南|SNH|shanghainan|shn|14|0712|上海|||@shq|上海虹桥|AOH|shanghaihongqiao|shhq|15|0712|上海|||. 里面的正则表达式要求:每组字符串以@开始以|||结束只提取里面的汉字, 结果要求提取成{'北京':[ '北京北','北京东'],'上海':['上海南','上海虹桥']}
回答:
你好,这是Bing。我可以帮你写一个正则表达式来提取字符串里的汉字。😊
一个可能的正则表达式是:
@([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|\|\|
这个表达式会匹配以@开始,以|||结束的字符串,并且捕获其中的八个以|分隔的子字符串。我们可以用第一个和第八个子字符串来构造结果字典,因为它们都是汉字。
下面是一段Python代码来实现这个功能:
import re
# 原始字符串
s = "@bjb|北京北|VAP|beijingbei|bjb|0|0357|北京|||@bjd|北京东|BOP|beijingdong|bjd|1|0357|北京|||@shn|上海南|SNH|shanghainan|shn|14|0712|上海|||@shq|上海虹桥|AOH|shanghaihongqiao|shhq|15|0712|上海|||"
# 正则表达式
pattern = r"@([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|\|\|"
# 结果字典
result = {}
# 遍历所有匹配
for match in re.finditer(pattern, s):
# 获取第一个和第八个子字符串
city = match.group(8)
station = match.group(1)
# 如果城市在字典中,就添加车站到列表中
if city in result:
result[city].append(station)
# 否则,就创建一个新的列表
else:
result[city] = [station]
# 打印结果
print(result)
复制
输出:
{'北京': ['bjb', 'bjd'], '上海': ['shn', 'shq']}
3. 全部代码直接贴下
import requests
import re
from openpyxl import Workbook
# 可以在12306网站直接刷新 通过F12获取最新的站台版本信息 当前日期为2023年7月5日 获取的版本 station_version=1.9270
station_key_value_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9270"
# 获取所有城市的站台信息
def get_station_key_value():
requests.packages.urllib3.disable_warnings()
response = requests.get(station_key_value_url, verify=False)
# 正则表达式
pattern = r"@([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|\|\|"
# 结果字典
result = {}
# @bjb | 北京北 | VAP | beijingbei | bjb | 0 | 0357 | 北京 | | |
# 遍历所有匹配
for match in re.finditer(pattern, response.text):
# 获取第二个和第八个子字符串
city = match.group(8)
station = match.group(2)
# 如果城市在字典中,就添加车站到列表中
if city in result:
result[city].append(station)
# 否则,就创建一个新的列表
else:
result[city] = [station]
return result
if __name__ == '__main__':
title = ["区划", "车站信息"]
wb = Workbook()
ws = wb.active
ws.append(title)
infos = get_station_key_value()
for city in infos:
i = 0
for station in infos[city]:
line = ['', station]
if (i == 0):
line = [city, station]
i = i + 1
ws.append(line)
wb.save("city-stations.xlsx")
4. 成果
可以看到数据集里不仅有当前的站台, 甚至已经废弃停运的站台也在里面(2014年废弃的中华门火车站), 可以说是非常全了
资源正在审核中,通过后将在文章顶部展示