HTML应用指南:利用GET请求获取全国无印良品门店位置信息

发布于:2025-03-29 ⋅ 阅读:(42) ⋅ 点赞:(0)

在当今全球化迅速发展的时代,消费者对于产品的需求不仅限于质量与功能,更延伸到了品牌背后的理念与生活方式的认同。无印良品(Muji),以其独特的“无品牌”理念、简约而不失品味的设计风格,在全球范围内赢得了众多消费者的喜爱和追随。自1980年在日本成立至今,无印良品已经从一个主打日常用品的品牌发展成为一个涵盖服装、家居、食品等多个领域的综合性生活品牌。其在全球范围内的门店分布,不仅是品牌影响力扩展的重要标志,也是研究现代零售业及消费趋势变化的一个重要视角。

本文将深入探讨GET请求在获取无印良品门店分布信息中的实际应用,并展示如何使用Python的requests库发送GET请求,从无印良品官方网站提取详细的门店位置信息,涵盖全国范围内的所有无印良品店铺,处理响应数据的方法,包括解析JSON格式的数据或者HTML页面,以便有效地提取所需信息,探讨无印良品的门店分布情况,通过分析其地理位置选择、市场布局策略以及不同区域的发展特点,通过对无印良品门店分布的研究,我们也能窥见现代社会中消费者行为的变化趋势及其对生活品质追求的不断升级。这将有助于相关从业者制定更为精准的市场营销策略,并为有兴趣的读者提供深入了解这一独特品牌的机会。

无印良品官方网址:无印良品 | 店铺信息

    我们第一步先找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;

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

    负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递,这里我们可以看到它的传参包括,城市名称,是明文传输;

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

    接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

    方法思路

    1. 找到对应数据存储位置,获取所有店铺列表的相关标签数据;
    2. 我们通过改变查询关键字(省级行政区),来遍历全国门店数据;
    3. 坐标转换,通过coord-convert库实现BD-09转WGS84;

    第一步:我们先找到对应数据存储位置,获取所有店铺列表,经过测试,每次查询城市会返回一个html,我们通过修改负载的城市名称来进行数据获取,为了方便我们直接建立一个包含地级行政区的字典,通过遍历地级行政区查询全国数据;

    第二步:利用GET请求获取所有店铺列表,并根据标签进行保存,另存为csv;

    完整代码#运行环境 Python 3.11

    import requests
    import pandas as pd
    import json
    import time
    import random
    
    # 中国省级行政区字典
    CHINA_REGIONS = {
        "直辖市": ["北京市", "上海市", "天津市", "重庆市"],
        "特别行政区": ["香港特别行政区", "澳门特别行政区"],
        "省份": [
            "河北省", "山西省", "辽宁省", "吉林省", "黑龙江省", "江苏省", "浙江省", "安徽省",
            "福建省", "江西省", "山东省", "河南省", "湖北省", "湖南省", "广东省", "海南省",
            "四川省", "贵州省", "云南省", "陕西省", "甘肃省", "青海省", "台湾省"
        ],
        "自治区": [
            "内蒙古自治区", "广西壮族自治区", "西藏自治区", "宁夏回族自治区", "新疆维吾尔自治区"
        ]
    }
    
    
    def get_all_regions():
        """获取所有省级行政区列表"""
        regions = []
        for region_type, region_list in CHINA_REGIONS.items():
            regions.extend(region_list)
        return regions
    
    
    def get_muji_stores(keyword):
        """获取指定地区的MUJI无印良品店铺信息"""
        url = "https://www.muji.com/storelocator/"
    
        params = {
            "_ACTION": "_SEARCH",
            "c": "cn",
            "lang": "LC",
            "baidu_flag": "1",
            "keyword": keyword
        }
    
        headers = {
            "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Mobile Safari/537.36 Edg/134.0.0.0",
        }
    
        try:
            response = requests.get(url, params=params, headers=headers)
            print(f"正在查询 {keyword} 的店铺信息...")
            print(f"状态码: {response.status_code}")
    
            if response.status_code == 200:
                try:
                    data = response.json()
                    stores = []
                    if isinstance(data, list):
                        for store in data:
                            store_info = {
                                'region': keyword,  # 添加查询地区信息
                                'shopid': store.get('shopid', ''),
                                'shopname': store.get('shopname', ''),
                                'access': store.get('access', ''),
                                'itemlist': store.get('itemlist', []),
                                'latitude': store.get('latitude', ''),
                                'longitude': store.get('longitude', ''),
                                'opentime': store.get('opentime', ''),
                                'relatedlist': store.get('relatedlist', []),
                                'shopaddress': store.get('shopaddress', ''),
                                'shopstyle': store.get('shopstyle', []),
                                'tel': store.get('tel', ''),
                                'zipcode': store.get('zipcode', '')
                            }
                            stores.append(store_info)
    
                    print(f"在 {keyword} 找到 {len(stores)} 家店铺")
                    return stores
                except json.JSONDecodeError as e:
                    print(f"JSON解析错误: {str(e)}")
                    return None
            else:
                print(f"请求失败,状态码:{response.status_code}")
                return None
    
        except requests.RequestException as e:
            print(f"请求异常: {str(e)}")
            return None
    
    
    def save_to_csv(all_stores, filename="muji_stores_china.csv"):
        """将所有店铺数据保存为CSV文件"""
        if not all_stores:
            print("没有数据可保存")
            return
    
        try:
            # 将列表类型的字段转换为字符串
            for store in all_stores:
                store['itemlist'] = ','.join(map(str, store['itemlist']))
                store['relatedlist'] = ','.join(map(str, store['relatedlist']))
                store['shopstyle'] = ','.join(map(str, store['shopstyle']))
    
            df = pd.DataFrame(all_stores)
            df.to_csv(filename, index=False, encoding='utf-8-sig')
            print(f"\n所有数据已保存到 {filename}")
    
            # 显示统计信息
            print("\n数据统计:")
            print(f"总店铺数量: {len(df)}")
            print("\n各地区店铺数量:")
            print(df['region'].value_counts())
    
        except Exception as e:
            print(f"保存数据时出错: {str(e)}")
    
    
    def main():
        all_stores = []
        regions = get_all_regions()
    
        print(f"开始查询全国 {len(regions)} 个省级行政区的无印良品店铺信息...")
    
        for region in regions:
            stores = get_muji_stores(region)
            if stores:
                all_stores.extend(stores)
    
            # 添加随机延时,避免请求过于频繁
            delay = random.uniform(2, 5)
            print(f"等待 {delay:.1f} 秒后继续下一个查询...\n")
            time.sleep(delay)
    
        # 保存所有数据
        if all_stores:
            save_to_csv(all_stores)
    
            # 显示汇总信息
            print("\n查询完成!")
            print(f"共找到 {len(all_stores)} 家无印良品店铺")
    
            # 创建区域统计的DataFrame
            df_stats = pd.DataFrame(all_stores)
            region_stats = df_stats['region'].value_counts()
    
            print("\n各地区店铺分布:")
            for region, count in region_stats.items():
                print(f"{region}: {count}家")
        else:
            print("未找到任何店铺信息")
    
    
    if __name__ == "__main__":
        main()

    这里我们建立一个包含中国所有省级行政区的字典,并遍历查询每个地区的无印良品店铺,获取数据标签如下,shopid(店铺ID)、shopname(店铺名称)、shopaddress(地址)、tel(电话)、opentime(营业时间)、latitude,longitude(经纬度)、longitude(经纬度),其他一些非关键标签,这里省略;

    第三步:坐标系转换,由于无印良品门店使用的是百度坐标系(BD-09),为了在ArcGIS上准确展示而不发生偏移,我们需要将门店的坐标从BD-09转换为WGS-84坐标系。我们可以利用coord-convert库中的bd2wgs(lng, lat)函数,也可以用免费这个网站:批量转换工具:地图坐标系批量转换 - 免费在线工具 (latlongconverter.online)

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

    接下来,我们进行看图说话:

    无印良品在中国的门店分布呈现出显着的地理特征,主要集中于东部沿海地区,包括长三角(上海、江苏、浙江)、珠三角(广东)以及京津冀地区(北京、天津)。这些区域不仅是我国经济发展的前沿阵地,也是人口密度高、消费能力强的重要市场。在一线城市如北京、上海、广州和深圳,无印良品的门店数量尤为密集,显示出品牌对高端市场的重视及对时尚潮流引领者的定位。

    此外,在一些快速发展的二线城市,例如成都、重庆、西安、南京和杭州等,无印良品也进行了较为广泛的布局。这些城市不仅经济发展迅速,而且拥有庞大的中产阶级群体,为品牌的持续扩展提供了坚实的市场基础。尽管如此,西部地区的门店分布相对较少,但像乌鲁木齐、昆明、贵阳等重点城市仍可见到无印良品的身影,这表明品牌也在逐步探索新兴市场的机会。

    对于北部和南部地区而言,辽宁、吉林、黑龙江及内蒙古的部分地区,以及福建、广西和海南等地也有一定的门店分布,尤其是在省会城市和经济较发达的城市。这种分布策略不仅反映了无印良品对中国市场的深刻理解,也展现了其致力于在全国范围内提供一致的品牌体验和服务质量的决心。

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