注册 登录
编程论坛 VFP论坛

怎样用VFP爬取全国40城5000地铁站点数据

王咸美 发布于 2025-11-29 10:14, 581 次点击
怎样用VFP爬取全国40城5000地铁站点数据,
生成Excel表格?具体字段有:站点名称  拼音名称 gd经度 gd纬度 路线名称 城市名称 行政区名称 bd经度 bd纬度
网页地址:http://map.
请高手赐教,万分感谢!!!
10 回复
#2
foxfans2025-11-29 11:04
你这是出题让人做吧,掌握之前别人教的,早就可以举一反三了。
#3
王咸美2025-11-29 11:15
以前看过别人用python爬取这个网站数据,觉得很有意思,可惜看不懂,不知vfp能否做到?没有其他意思。如有冒犯,敬请谅解!

[此贴子已经被作者于2025-11-29 11:20编辑过]

#4
foxfans2025-11-29 12:24
回复 3楼 王咸美
就觉得很好奇,类似的问题,这么久了怎么还不会独立处理,未能用心理解别人花时间给你写的代码……
毫无头绪的问如同 抄代码 = 给人布置作业
只有本站会员才能查看附件,请 登录


#5
王咸美2025-11-29 12:32
兴趣所至,但水平有限,望见谅!
#6
nbwww2025-11-29 19:07
第一  你网址输入有误   正确应该是 http://map.
第二  如果今天能看到回复   试下下面的网址 一般来说是能搞定了
http://map.
http://map.
http://map.
#7
王咸美2025-11-29 19:27
不好意思!不小心输错一个字母。
正确网址为:http://map.

[此贴子已经被作者于2025-11-29 19:30编辑过]

#8
kangss2025-11-29 20:06
以下是引用王咸美在2025-11-29 19:27:59的发言:

不好意思!不小心输错一个字母。
正确网址为:http://map.

6楼那3个获取数据的网址是这么来的:浏览器控制台,也就是调试模式,按F12出来的。搞web、html时会用到
只有本站会员才能查看附件,请 登录
#9
hsfisher2025-12-01 08:31
关注学习
#10
yiyanxiyin2025-12-01 10:40
写爬虫最强的就是python, 提供了很多很方便的库, 不过你如果用的xp那还是算了, 很多库xp不支持的,  下面是deepseek给出的代码, 测试没问题:
程序代码:
import requests
import json
from typing import Dict, List, Any

def get_chengdu_subway_data(url: str) -> Dict[str, Any]:
    """
    获取成都地铁数据
   
    Args:
        url: 数据接口URL
        
    Returns:
        解析后的JSON数据
    """
    try:
        # 设置请求头,模拟浏览器访问
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        # 发送GET请求
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 如果请求失败会抛出异常
        
        # 解析JSON数据
        data = response.json()
        return data
        
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return {}
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {e}")
        return {}

def parse_subway_data(data: Dict[str, Any]) -> Dict[str, List[Dict]]:
    """
    解析地铁数据
   
    Args:
        data: 原始地铁数据
        
    Returns:
        结构化的地铁线路信息
    """
    if not data:
        return {}
   
    result = {
        'lines': [],
        'stations': []
    }
   
    # 提取基本信息
    city_name = data.get('s', '')
    city_code = data.get('i', '')
   
    print(f"城市: {city_name} (代码: {city_code})")
    print("=" * 50)
   
    # 解析线路信息
    lines = data.get('l', [])
   
    for line in lines:
        line_info = {
            'line_name': line.get('ln', ''),
            'line_name_en': line.get('kn', ''),
            'line_color': line.get('cl', ''),
            'line_status': line.get('su', ''),
            'stations': []
        }
        
        # 解析站点信息
        stations = line.get('st', [])
        for station in stations:
            station_info = {
                'station_id': station.get('si', ''),
                'station_name': station.get('n', ''),
                'station_name_en': station.get('sp', ''),
                'coordinates': station.get('sl', ''),
                'position': station.get('p', ''),
                'is_transfer': station.get('t', '0') == '1',  # 是否为换乘站
                'transfer_lines': station.get('r', '').split('|') if station.get('r') else [],
                'status': station.get('su', '')
            }
            line_info['stations'].append(station_info)
        
        result['lines'].append(line_info)
        
        # 打印线路信息
        print(f"线路: {line_info['line_name']} ({line_info['line_name_en']})")
        print(f"颜色: {line_info['line_color']}")
        print(f"站点数量: {len(line_info['stations'])}")
        print("站点列表:")
        for i, station in enumerate(line_info['stations'], 1):
            transfer_flag = " (换乘站)" if station['is_transfer'] else ""
            print(f"  {i:2d}. {station['station_name']}{transfer_flag}(经纬:{station['coordinates']})")
        print("-" * 30)
   
    return result

def get_station_transfer_info(data: Dict[str, Any]) -> Dict[str, List[str]]:
    """
    获取换乘站信息
   
    Args:
        data: 原始地铁数据
        
    Returns:
        换乘站及其对应的线路
    """
    transfer_stations = {}
   
    lines = data.get('l', [])
   
    for line in lines:
        line_name = line.get('ln', '')
        stations = line.get('st', [])
        
        for station in stations:
            if station.get('t', '0') == '1':  # 换乘站
                station_name = station.get('n', '')
                if station_name not in transfer_stations:
                    transfer_stations[station_name] = []
                if line_name not in transfer_stations[station_name]:
                    transfer_stations[station_name].append(line_name)
   
    return transfer_stations

def main():
    # 成都地铁数据URL
    url = "http://map./service/subway?_1764553326419&srhdata=5101_drw_chengdu.json"
   
    print("正在获取成都地铁数据...")
   
    # 获取数据
    data = get_chengdu_subway_data(url)
   
    if not data:
        print("未能获取到数据")
        return
   
    # 解析数据
    parsed_data = parse_subway_data(data)
   
    # 获取换乘站信息
    transfer_info = get_station_transfer_info(data)
   
    # 打印换乘站信息
    print("\n换乘站信息:")
    print("=" * 50)
    for station, lines in transfer_info.items():
        print(f"{station}: {', '.join(lines)}")
   
    # 保存解析后的数据到文件(可选)
    try:
        with open('chengdu_subway_data.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        print(f"\n原始数据已保存到: chengdu_subway_data.json")
        
        with open('chengdu_subway_parsed.json', 'w', encoding='utf-8') as f:
            json.dump(parsed_data, f, ensure_ascii=False, indent=2)
        print(f"解析数据已保存到: chengdu_subway_parsed.json")
    except Exception as e:
        print(f"保存文件时出错: {e}")

if __name__ == "__main__":
    main()
核心代码都有了, 想怎么使用数据, 稍微改造即可
#11
yiyanxiyin2025-12-01 10:46
python是一个比vfp更简单的语言,有变成基础, 要上手太容易了, 要写爬虫还是放弃vfp吧,  学编程最重要的不是语言, 是方法, 是思路, 如果你精通一门语言, 要上手另一种语言那是分分钟的事情
1