python爬虫:从12306网站获取火车站信息

打印 上一主题 下一主题

主题 1764|帖子 1764|积分 5292

代码逻辑



  • 初始化 (init 方法):

    • 设置哀求头信息。
    • 设置车站版本号。

  • 同步车站信息 (synchronization 方法):

    • 发送GET哀求获取车站信息。
    • 返回服务器响应的文本。

  • 提取信息 (extract 方法):

    • 从服务器响应中提取车站信息字符串。
    • 去掉字符串末端的多余字符。

  • 处理信息 (process 方法):

    • 提取并处理车站信息。
    • 打印车站总数。
    • 创建一个新的车站字典,只包罗所需的字段。
    • 调用 save_station 方法保存车站信息。

  • 保存车站信息 (save_station 方法):

    • 将车站信息保存到本地JSON文件。

  • 查找含有关键词的车站 (find_keyword_station 静态方法):

    • 从本地文件加载车站信息。
    • 根据关键词查找符合条件的车站。

  • 查找以指定字符结尾的车站 (find_stations_with_last_char 方法):

    • 从本地文件加载车站信息。
    • 找出以指定字符结尾的车站名称。
    • 调用 save_matching_stations 方法保存结果。

  • 保存匹配的车站 (save_matching_stations 方法):

    • 将匹配的车站信息保存到本地JSON文件。

  • 查找地点城市的车站 (find_stations_in_city 方法):

    • 从本地文件加载车站信息。
    • 找出地点城市为指定城市的车站。

  • 主程序入口 (if name == “main” 块):

    • 实例化 Station 类。
    • 调用 process 方法处理车站信息。
    • 调用 find_stations_with_last_char 方法查找以特定字符结尾的车站。
    • 调用 find_keyword_station 方法查找含有关键词的车站。
    • 调用 find_stations_in_city 方法查找地点城市的车站。

完整代码

  1. import json
  2. import re
  3. import requests
  4. # 定义车站信息的URL
  5. URL_STATION_NAME = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'
  6. class Station:
  7.     def __init__(self):
  8.         # 设置请求头
  9.         self.headers = {
  10.             'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  11.                           "Chrome/123.0.0.0 Safari/537.36"
  12.         }
  13.         # 获取车站版本号
  14.         self.version = '1.9320'
  15.     def synchronization(self):
  16.         # 发送GET请求获取车站信息
  17.         response = requests.get(URL_STATION_NAME, headers=self.headers, params={
  18.             "station_version": self.version
  19.         })
  20.         return response.text
  21.     def extract(self):
  22.         # 提取响应中的车站信息
  23.         response = self.synchronization()
  24.         response = response.replace("var station_names =", '').strip()
  25.         return response[:-2]  # 去掉末尾的多余字符
  26.     def process(self):
  27.         # 处理提取的数据
  28.         response = self.extract()
  29.         response = re.findall(r'@(.*?)\|\|\|', response)
  30.         print(f'共有{len(response)}个车站')
  31.         response = [i.split("|") for i in response]
  32.         # 创建一个新的车站字典,只包含所需的字段
  33.         station_dict = []
  34.         for item in response:
  35.             station_info = {
  36.                 "车站名": item[1],
  37.                 "车站代码": item[2],
  38.                 "车站编号": item[5],
  39.                 "所在城市": item[7],
  40.                 "城市编号": item[6]
  41.             }
  42.             station_dict.append(station_info)
  43.         self.save_station(station_dict)
  44.         
  45.         return station_dict
  46.     def save_station(self, station_dict):
  47.         # 将车站信息保存到本地文件
  48.         with open('resource/station_dict.json', 'w', encoding='utf-8') as f:
  49.             json.dump(station_dict, f, ensure_ascii=False, indent=4)
  50.     @staticmethod
  51.     def find_keyword_station(keyword, _type='station'):
  52.         # 查找含有keyword的站名
  53.         with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:
  54.             station_dict = json.load(f)
  55.         
  56.         if _type == 'station':
  57.             response = [item for item in station_dict if keyword.lower() in item["车站名"].lower()]
  58.         elif _type == 'code':
  59.             response = [item for item in station_dict if keyword.lower() in item["车站代码"].lower()]
  60.         else:
  61.             response = []
  62.         return response
  63.    
  64.     def find_stations_with_last_char(self, char):
  65.         # 查找所有字典的key里最后一个字是指定字符的站名,并保存结果到JSON文件
  66.         with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:
  67.             station_dict = json.load(f)
  68.         
  69.         # 使用列表推导式来找到符合要求的站名
  70.         matching_stations = [item for item in station_dict if item['车站名'].endswith(char)]
  71.         
  72.         # 保存结果到JSON文件
  73.         self.save_matching_stations(matching_stations, char)
  74.         
  75.         return matching_stations
  76.     def save_matching_stations(self, matching_stations, char):
  77.         # 将车站信息保存到本地文件
  78.         filename = f'resource/stations_with_last_char_{char}.json'
  79.         with open(filename, 'w', encoding='utf-8') as f:
  80.             json.dump(matching_stations, f, ensure_ascii=False, indent=4)
  81.     def find_stations_in_city(self, city_name):
  82.         # 查找所在城市为指定城市的车站
  83.         with open('resource/station_dict.json', 'rt', encoding='utf-8') as f:
  84.             station_dict = json.load(f)
  85.         
  86.         # 使用列表推导式来找到符合要求的站名,并排除不需要的字段
  87.         matching_stations = [
  88.             {k: v for k, v in item.items() if k not in ['所在城市', '城市编号']}
  89.             for item in station_dict if city_name.lower() in item['所在城市'].lower()
  90.         ]
  91.         
  92.         return matching_stations
  93. # 主程序入口
  94. if __name__ == "__main__":
  95.     station = Station()
  96.     station.process()
  97.    
  98.     result = station.find_stations_with_last_char('东')
  99.     print(f"找到 {len(result)} 个以 '东' 结尾的站名")
  100.    
  101.     result = station.find_stations_with_last_char('西')
  102.     print(f"找到 {len(result)} 个以 '西' 结尾的站名")
  103.    
  104.     result = station.find_stations_with_last_char('南')
  105.     print(f"找到 {len(result)} 个以 '南' 结尾的站名")
  106.    
  107.     result = station.find_stations_with_last_char('北')
  108.     print(f"找到 {len(result)} 个以 '北' 结尾的站名")
  109.    
  110.     # 查找含有'湛江'的站名
  111.     keyword = '湛江'
  112.     result = station.find_keyword_station(keyword, _type='station')
  113.     print(result)
  114.    
  115.     # 查找所在城市为'湛江'的车站
  116.     city_name = '湛江'
  117.     result = station.find_stations_in_city(city_name)
  118.     print(f"找到 {len(result)} 个位于 '{city_name}' 的车站:")
  119.     print(result)
复制代码
运行结果


   本文参考了这个项目,在此表示感谢,但由于该项目必要配置flask,笔者对此并不认识,于是自己抽取出查询车站的代码并完善了相关功能,不再必要其他配置。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表