HTML应用指南:利用POST请求获取全国公牛门店位置信息

发布于:2025-07-31 ⋅ 阅读:(31) ⋅ 点赞:(0)

公牛作为国内领先的民用电工与智能电气品牌,自创立以来,依托其强大的产品品质与渠道建设能力,积极布局线下零售网络,打造了覆盖全国的“公牛旗舰店”及授权销售网点体系。公牛门店不仅是产品销售的重要窗口,更是集品牌展示、产品体验、专业咨询和售后服务于一体的综合服务平台,成为公牛品牌与消费者之间沟通的重要桥梁。公牛始终坚持“安全用电,守护万家”的理念,依托丰富的产品线和完善的供应链体系,结合线下门店的标准化形象与专业服务,为消费者提供安全、可靠、智能化的用电解决方案。

在注重产品功能与质量的同时,公牛门店也强调空间设计的现代感与服务体验的人性化,营造出简洁、专业、富有科技感的购物环境,提升消费者在选购过程中的信任感与满意度。门店广泛分布于各大城市的核心商圈、建材市场及家电卖场,形成了高密度、广覆盖的终端网络,有效支撑了品牌在C端市场的渗透与影响力提升。

本文将探讨如何通过POST请求从官方网站或公开接口中获取公牛门店的分布信息,并展示使用Python的requests库发送HTTP请求的方法,以提取详细的门店位置数据。这些信息涵盖全国范围内的公牛旗舰店及重点销售网点,通过解析返回的JSON数据或HTML内容,实现对门店名称、地址、所在区域等关键字段的结构化提取。此类数据采集方式有助于深入分析公牛在不同省市的渠道布局策略、区域市场覆盖率及其与人口经济分布的关联性。通过对门店数据的清洗与整理,还可为后续的地理可视化、商圈分析、渠道优化及市场拓展预测提供坚实的数据支持。

公牛旗舰店查询官方网址:公牛旗舰店查询

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

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

负载:对于POST请求:负载通常包含了传递的参数,因为所有参数都通过URL传递,这里我们可以看到省份、地级市、市,县级市的明文,没有进行加密;

预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段,我们可以看到与其他方式不同,数据是直接存在了html里;

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

方法思路

  1. 找到对应数据存储位置,获取所有店铺列表的相关标签数据;
  2. 我们通过page 从 1 到 maxpage 循环,来遍历全国门店数据;
  3. 地理编码→地址转经纬度,再通过coord-convert库实现GCJ-02转WGS84;

第一步:我们直接在"Fetch/XHR"先找到对应数据存储位置,获取所有店铺列表, 我们可以看到门店信息直接存在html,并且包括的全国所有的数据,所以我们直接遍历整个html,将 page 从 1 到 maxpage 循环,获取全部门店即可;

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

    完整代码#运行环境 Python 3.11

    import requests
    import time
    from bs4 import BeautifulSoup
    import csv
    
    # ========== 配置信息 ==========
    url = "https://www.gongniu.cn/index.php?m=content&c=search&a=mdlist"
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://www.gongniu.cn',
        'Referer': 'https://www.gongniu.cn/',
    }
    
    # 固定参数(地区等)
    base_data = {
        'pagesize': '5',
        'key': '',
        's_province': '省份',
        's_city': '地级市',
        's_county': '市、县级市',
        'noid': '281',
        'catid': '281'
    }
    
    # 存储所有门店信息
    all_stores = []
    
    # ========== 第一步:获取总页数 maxpage ==========
    print("正在获取第一页以确定总页数...")
    first_data = {**base_data, 'page': '1'}
    try:
        response = requests.post(url, headers=headers, data=first_data, timeout=10)
        response.raise_for_status()
        result = response.json()
    
        if result.get('status') != 1:
            print("接口返回失败:", result.get('info', '未知错误'))
            exit()
    
        maxpage = result['data']['maxpage']
        print(f"共 {maxpage} 页,开始爬取...")
    
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        exit()
    except Exception as e:
        print(f"解析失败: {e}")
        exit()
    
    # ========== 第二步:遍历每一页 ==========
    for page in range(1, maxpage + 1):
        print(f"正在爬取第 {page} 页...")
        page_data = {**base_data, 'page': str(page)}
    
        try:
            response = requests.post(url, headers=headers, data=page_data, timeout=10)
            if response.status_code != 200:
                print(f"第 {page} 页请求失败,状态码: {response.status_code}")
                continue
    
            result = response.json()
            if result.get('status') != 1:
                print(f"第 {page} 页接口返回失败: {result.get('info')}")
                continue
    
            html_content = result['data']['html']
            soup = BeautifulSoup(html_content, 'html.parser')
    
            for li in soup.find_all('li'):
                title_tag = li.find('a', class_='tit1')
                address_tag = li.find('p')
    
                name = title_tag.get_text(strip=True) if title_tag else "未知门店"
                address = address_tag.get_text(strip=True).replace('门店地址:', '') if address_tag else "未知地址"
    
                all_stores.append({
                    'name': name,
                    'address': address
                })
    
            # 控制请求频率,避免被封
            time.sleep(1)
    
        except Exception as e:
            print(f"解析第 {page} 页时出错: {e}")
            continue
    
    print(f" 爬取完成!共获取 {len(all_stores)} 家门店。")
    
    # ========== 第三步:保存为 CSV 文件 ==========
    csv_filename = 'gongniu_stores.csv'
    with open(csv_filename, 'w', encoding='utf-8-sig', newline='') as f:  # utf-8-sig 避免 Excel 中文乱码
        writer = csv.DictWriter(f, fieldnames=['name', 'address'])
        writer.writeheader()
        writer.writerows(all_stores)
    
    print(f" 所有门店信息已保存至: {csv_filename}")

    获取数据标签如下,店铺名称、店铺名称地址;

    如果需要换成单个城市,直接把这里的城市换成对应的需要查询的城市即可;

    如果需要获取城市的层级关系,在"网络"里随便检索一个二级行政区,比如"石家庄市",我们就可以找到行政区对应关系;

    第三步:地理编码和坐标系转换,这里因为数据标签没有直接的坐标数据,需要把获取的门店地址进行地理编码,具体实现方法可以参考我这篇文章:地址转坐标:利用高德API进行批量地理编码_高德地图api-CSDN博客

    这里直接下载转换结果,坐标系GCJ-02,当然还有个别地址描述太模糊的或者格式无法识别,会查不出坐标,手动查一下坐标即可,大部分还是可以查到的,因为当前坐标系是GCJ02,需要批量转成WGS84/BD09的话可以用免费这个网站:批量转换工具:地图坐标系批量转换 - 免费在线工具 (latlongconverter.online),也可以通过coord-convert库实现GCJ-02转WGS84;
    对CSV文件中的门店坐标列进行转换。完成坐标转换后,再将数据导入ArcGIS进行可视化;

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

    东部沿海地区,如广东、江苏、浙江、山东等省份,公牛门店的数量显著高于其他地区。这些省份不仅人口密集,而且经济活动频繁,居民消费水平较高,对高品质用电产品的需求旺盛。因此,公牛选择在这些地区密集布点,以满足市场需求并提升品牌影响力。此外,东部沿海地区的物流网络发达,供应链管理便捷,有助于公牛高效地进行产品配送和服务支持。

    中部地区,如河南、湖北、湖南等省份,公牛门店也表现出较强的渗透力。尽管与东部沿海地区相比,中部地区的门店密度稍低,但整体分布较为均匀,覆盖了多个城市和乡镇。这表明公牛在中部地区采取了广泛的渠道布局策略,通过旗舰店和授权销售网点相结合的方式,实现了对不同层级市场的有效覆盖。

    相比之下,西部和东北地区的公牛门店分布相对稀疏。这些地区的经济发展水平和人口密度较低,市场规模相对较小。然而,公牛并未忽视这些市场,在一些重点城市和经济中心仍设有门店,以保持品牌存在感并逐步拓展市场。随着西部大开发和东北振兴战略的推进,未来这些地区的市场潜力有望进一步释放,公牛门店的布局也可能随之调整。

    从城市等级来看,一线城市和新一线城市是公牛门店布局的重点区域,门店数量最多且分布最为密集。这些城市的消费者对高品质、智能化的用电产品需求强烈,公牛通过在核心商圈设立旗舰店,提供沉浸式的产品体验和专业服务,有效提升了品牌形象和用户满意度。而在二三线城市及以下,公牛则更多依赖于授权销售网点和专卖店,实现对更广泛市场的覆盖。

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


    网站公告

    今日签到

    点亮在社区的每一天
    去签到