Agent应用指南:利用GET请求获取理想汽车门店位置信息

理想汽车作为中国新势力造车的头部品牌,始终秉持"创造移动的家,创造幸福的家"的品牌使命,已构建覆盖家庭用户与高端商务出行的完整产品矩阵,包括L6、L7、L8、L9、MEGA以及即将推出的i6、i8等车型。在渠道建设上,理想自2019年起坚定推行全直营模式,打造了由零售中心、交付中心、售后服务中心和钣喷中心组成的"四位一体"线下服务网络,确保用户体验的高度统一与服务标准的严格可控。

截至2026年6月,理想汽车在全国31个省、自治区、直辖市共布局1369家门店,细分为7类功能型网点:其中零售中心586家,主要设于核心商圈,承担产品展示与试驾体验;售后服务中心288家、钣喷中心269家,提供维修保养与事故修复服务;交付中心135家,专责新车交付流程;另有71家临时售后支持点、19家授权服务中心及1家临时交付点,用于灵活响应区域市场拓展需求。得益于全直营体系,所有门店数据均由总部统一管理,并通过标准化API接口对外提供,为高效获取结构化数据创造了技术条件。

本文将通过逆向分析理想汽车官网前端JavaScript代码,定位其门店数据加载逻辑。具体而言,借助浏览器开发者工具对网络请求(Network → XHR/Fetch)进行抓包,结合源码搜索关键词(如"service-center"、"store"等),可快速识别出核心数据接口。该接口为无鉴权的公开GET接口,响应格式为标准JSON,无需登录或Token验证。利用Python的requests库发起一次简单HTTP GET请求,即可完整获取全国1369家门店的结构化数据。返回字段极为丰富,包括门店ID、名称、类型、省市区三级地址、详细地址、联系电话、营业状态(营业中/在建/已关闭)、开业时间、所属公司、星级评分、支持试驾车型、展车系列,以及多套地理坐标体系。通过csv模块可直接导出为UTF-8-BOM编码的CSV文件以兼容Excel中文显示,亦可进一步使用pandas或openpyxl生成带表头样式、列宽自适应的格式化Excel报表,为渠道密度热力图绘制、区域服务能力评估、竞品网点对标等深度分析提供高质量数据集。

理想汽车门店查询地址:理想汽车丨理想,给车和家赋予生命。 | 查找服务网点

首先,我们找到网点数据的存储位置,然后看3个关键部分标头、负载、 预览;

标头:通常包括URL的连接,也就是目标资源的位置;

负载:对于GET请求:负载通常包含了传递的参数,因为所有参数都通过URL传递,这里我们可以看到查询关键词type,这段字符串是经过 URL 编码

预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段,我们可以看到数据在data里;

接下来就是数据获取部分,先讲一下方法思路,双击对应的门店信息响应网页,我们可以看到数据均在数组里,而且里面有高德和百度的二套坐标系可供使用;

方法思路

  1. 请求API → 直接 GET 接口,data 字段就是一个平铺的数组;
  2. 字段清洗输出 → 将数组类型字段转为分隔符拼接字符串,英文类型代码转中文,输出CSV;
  3. 坐标转换:从GCJ-02转换WGS-84坐标,同时进行arcgis可视化;

**第一步:**利用requests 库发送HTTP请求获取所有汽车门店数据,并根据标签进行保存,另存为csv;

完整代码#运行环境 Python 3.11

python 复制代码
import json
import csv
import requests
from collections import Counter
from pathlib import Path

# 配置
API_URL = "https://www.lixiang.com/saos-store-web/tur_store/v1-0/service-centers"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
TIMEOUT = 30

TYPE_MAP = {
    "RETAIL": "零售中心",
    "AFTERSALE": "售后服务中心",
    "SPRAY": "钣喷中心",
    "DELIVER": "交付中心",
    "UNION": "授权服务中心",
    "TEMPORARY_AFTERSALE_SUPPORT": "临时售后支持",
    "TEMPORARY_DELIVER": "临时交付",
}

STATUS_MAP = {
    "INBUSINESS": "营业中",
    "CLOSED": "已关闭",
    "INCONSTRUCTION": "在建"
}

FIELDS = [
    'id', 'name', 'type', 'provinceName', 'cityName', 'countyName', 'address',
    'telephone', 'openingHours', 'openedAt', 'status',
    'companyName', 'starLevel',
    'driveCarSeriesName', 'exhibitionCarSeriesName',
    'lat', 'lng', 'gdLat', 'gdLng', 'baiduLat', 'baiduLng',
    'testDriveStatus', 'isMetalSpray'
]


def map_value(value, mapping, fallback=True):
    return mapping.get(value, value if fallback else "")


def main():
    try:
        resp = requests.get(API_URL, headers=HEADERS, timeout=TIMEOUT)
        resp.raise_for_status()
        data = resp.json()

        if 'data' not in data or not isinstance(data['data'], list):
            raise ValueError("API 返回数据格式异常")

        all_stores = data['data']
        total = len(all_stores)
        print(f"成功获取到 {total} 家门店信息")

        # 保存 CSV 到脚本所在目录(不新建 output 文件夹)
        csv_path = Path(__file__).parent / 'LIXIANG_store_data.csv'

        with open(csv_path, 'w', newline='', encoding='utf-8-sig') as f:
            writer = csv.DictWriter(f, fieldnames=FIELDS, extrasaction='ignore')
            writer.writeheader()

            for store in all_stores:
                row = {k: store.get(k, "") or "" for k in FIELDS}

                for k in ['driveCarSeriesName', 'exhibitionCarSeriesName']:
                    val = row[k]
                    if isinstance(val, list):
                        row[k] = '|'.join(str(x) for x in val if x is not None)
                    else:
                        row[k] = str(val) if val else ""

                locations = store.get('locations', {})
                row.update({
                    'gdLat': locations.get('gdLat', ''),
                    'gdLng': locations.get('gdLng', ''),
                    'baiduLat': locations.get('baiduLat', ''),
                    'baiduLng': locations.get('baiduLng', ''),
                })

                row['type'] = map_value(row['type'], TYPE_MAP)
                row['status'] = map_value(row['status'], STATUS_MAP)

                for k in row:
                    if row[k] is None:
                        row[k] = ""
                    else:
                        row[k] = str(row[k])

                writer.writerow(row)

    except Exception as e:
        print(f"获取门店数据失败:{e}")


if __name__ == "__main__":
    main()

数据会以csv表格的形式,保存在运行脚本的目录下,表格名:LIXIANG_store_data.csv;

数据字段说明:

字段 示例值 说明
id RCSX07 门店唯一ID
name 理想汽车长沙梅溪湖步步高新天地零售中心 门店全称
type 零售中心 门店类型(7种)
provinceName 湖南 省份
cityName 长沙 城市
countyName 芙蓉 区县
address 湖南省长沙市岳麓区东方红南路... 详细地址
telephone 15616036081 联系电话
openingHours 10:00-22:00 营业时间
openedAt 2022-06-30 开业日期
status 营业中 营业状态
companyName 理想智造汽车销售服务(长沙)... 运营公司全称
starLevel 3 门店星级评分
driveCarSeriesName 理想L6|理想L9|... 可试驾车型列表
exhibitionCarSeriesName 理想MEGA|理想L9 展厅展示车型
gdLat / gdLng 28.199993 / 112.860117 高德坐标系
baiduLat / baiduLng 28.205654 / 112.866701 百度坐标系
testDriveStatus 1 是否支持试驾
isMetalSpray 0 是否具备钣喷能力

第二步: 坐标系转换,由于理想门店数据使用的是高德坐标系(GCJ-02)和百度坐标系(BD-09),这里为了方便转换,以高德坐标系为准,为了在ArcGIS上准确展示而不发生偏移,我们需要将门店的坐标从GCJ-02转换为WGS-84坐标系。我们可以利用coord-convert库中的gcj2wgs(lng, lat)函数,也可以用免费这个网站:批量转换工具:地理编码 (高德) 地址转经纬度 - 批量工具网

对CSV文件中的门店坐标列进行转换,完成坐标转换后,再将数据导入ArcGIS进行可视化;

接下来,我们基于采集到的1369家门店数据,从空间分布、类型结构、城市渗透三个维度进行分析;

第一段:空间分布特征

理想汽车门店呈现典型的"胡焕庸线"分布格局------东部沿海密集、中西部沿省会点状扩散。TOP 5省份------广东(146家)、浙江(121家)、江苏(118家)、山东(96家)、四川(79家)------合计占比超过40%。这一分布高度契合中国乘用车消费的核心市场版图:长三角和珠三角既是经济高地,也是新能源车渗透率最高的区域。西部省份中,四川以79家遥遥领先,得益于成都作为西南消费中心的辐射力以及理想在川渝地区的先发布局。东北三省合计约28家,西北五省区合计约18家------这些区域的低密度,既是经济水平与新能源接受度的客观反映,也指示了未来渠道下沉的潜在空间。

第二段:门店类型结构分析

1369家门店中,零售中心(586家,42.8%)是绝对主力,这与理想"商场流量获客+线下体验转化"的直营模式高度吻合。售后及钣喷中心合计557家(40.7%),形成了与前端零售紧密配套的服务网络------每1家零售中心背后平均有0.95家后端服务门店支撑,服务密度在行业处于领先水平。

值得关注的是71家"临时售后支持"网点------这些过渡性网点的存在,揭示了理想正在用"先轻后重"的方式拓展下沉市场:先以低成本设立售后触点验证区域需求,待当地销量达到阈值后再升级为正式门店。这种策略有效降低了前期投入风险,但在品牌形象一致性和服务标准管控上面临挑战。

第三段:城市层级渗透情况

从城市能级看:一线城市(北上广深)单城门店30-50+家,以零售中心为核心,辅以多个交付和服务中心,形成"高密度、全功能"的城市网络;新一线城市(杭州、成都、武汉等)单城10-25家;普通地级市平均1-3家,多为单一零售中心或与售后合并的综合门店。

值得注意的是,部分经济欠发达地区已有钣喷中心覆盖但尚无零售中心------例如新疆阿克苏、甘肃武威、青海西宁等地------呈现出"服务先行、销售跟进"的下沉策略。这可能是受限于当地高端商场资源或零售团队组建周期,但在用户心目中可能造成"能修不能买"的认知断层。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

相关推荐
阿猫的故乡1 小时前
Vue模板引用和组件暴露:ref拿DOM、defineExpose调方法,案例多到眼花
前端·javascript·vue.js
TMT星球1 小时前
AI定义汽车,赛豆科技发布AI汽车品牌AIVA
人工智能·科技·汽车
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月9日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
谁似人间西林客1 小时前
汽车智能制造如何解决整车工艺质量管控难题?
汽车·制造
小雨下雨的雨7 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
love530love10 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達10 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
CryptoPP10 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫11 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript