便利蜂(Bianlifeng)作为中国领先的数字化连锁便利店品牌,自创立以来始终坚持“用科技改变零售”的核心理念,致力于为城市消费者提供便捷、高效、高品质的日常消费服务。依托大数据驱动与人工智能算法深度融合的运营体系,便利蜂构建起覆盖多个重点城市的智能化门店网络,形成了以区域管理中心为枢纽、标准化门店为基础、移动应用与自助服务为延伸的新型零售服务生态。
门店作为便利蜂线下服务的核心节点,不仅是销售食品饮料、日用百货、鲜食快餐等高频消费品的重要场所,更是实现用户行为分析、动态定价优化、库存智能调度与即时配送协同的关键数据入口。每一家便利蜂门店均采用统一的视觉识别系统与数字化管理系统,注重购物环境的整洁性、安全性和科技感,广泛部署自助收银机、智能货架、远程巡店系统等技术设施,持续提升运营效率与顾客体验。
本文将探讨如何通过程序化方式,利用 POST 请求调用公开接口,从便利蜂官方服务平台获取门店分布数据。通过 Python 的 requests 库发送 HTTP 请求,解析返回的 JSON 结构化数据,提取门店编码(shopCode)、门店名称、所属城市与行政区(cityName, districtName)、详细地址、地理坐标(lng, lat)、营业时间(openFrom / openTo)以及服务功能(如是否支持外卖、自提、会员服务)等关键字段,实现对门店信息的自动化采集与结构化存储,该数据集可广泛应用于分析便利蜂的城市拓展策略、门店密度分布规律、商圈覆盖能力及城乡服务渗透水平等课题。例如,结合人口密度、交通流量、写字楼分布等外部数据,可建模评估新店选址潜力;通过时间序列分析门店增减趋势,可洞察企业战略重心的区域迁移。此类研究不仅为新零售行业的空间布局优化提供实证支持,也为智慧社区建设、城市便民服务规划与即时零售生态发展提供有力的数据参考。
便利蜂门店查询网址:便利蜂
首先,我们找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置;
负载:对于POST请求:负载通常包含了传递的参数,因为所有参数都通过URL传递,这里我们可以看到城市的编码,没有进行加密;
预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段,我们可以看到数据在data里;
接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;
方法思路
- 找到对应数据存储位置,获取行政区id表数据;
- 我们通过requests库发送HTTP请求,来遍历全国网点的标签数据;
- 地理编码→地址转经纬度,再通过coord-convert库实现BD09转WGS84;
首先,我们观察到它的查询方式依然是通过行政区id进行网点查询,那我们直接在"Fetch/XHR"先找到对应数据存储位置, 另外,根据上面负载的内容,我们可以知道,数据是直接通过行政区id进行传递的,为了方便我们可以建立一个包含行政区id的字典,通过遍历行政区名称来查询全国数据;
第一步:利用requests库发送HTTP请求获取所有行政区id表,并根据标签进行保存,另存为csv;
完整代码#运行环境 Python 3.11
import requests
import csv
url = "https://www.bianlifeng.com/product/free/city/openShop/v1"
csv_file = 'bianlifeng_cities.csv'
# 请求数据
res = requests.get(url, params={"_": __import__('time').time_ns()}, timeout=10).json()
data = res["data"]
# 提取 cityCode 和 cityName
cities = [{"cityCode": c["cityCode"], "cityName": c["cityName"]} for c in data]
# 保存为 CSV(UTF-8-SIG 防止 Excel 乱码)
with open(csv_file, 'w', encoding='utf-8-sig', newline='') as f:
w = csv.DictWriter(f, fieldnames=["cityCode", "cityName"])
w.writeheader()
w.writerows(cities)
print(f"完成!共 {len(cities)} 个城市,已保存至:{csv_file}")
数据会以csv表格的形式,保存在运行脚本的目录下,数据标签包括:cityCode(城市id)、cityName(城市名称);
第二步:利用POST请求获取所有便利蜂门店数据,并根据标签进行保存,另存为csv;
完整代码#运行环境 Python 3.11
import requests
import csv
import time
# ===== 配置 =====
url = "https://www.bianlifeng.com/product/free/list/city/v1"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
csv_file = 'bianlifeng_stores.csv'
# ===== 门店字段定义 =====
fields = [
"id", "shopCode", "name", "displayName",
"address", "province", "city", "district",
"lng", "lat", "businessPhone", "openFrom", "openTo"
]
def main():
# 1. 先读取城市文件(bianlifeng_cities.csv)
try:
with open('bianlifeng_cities.csv', 'r', encoding='utf-8-sig') as f:
cities = list(csv.DictReader(f))
except Exception as e:
return print("读取城市文件失败,请先运行城市提取脚本:", e)
# 2. 准备保存门店数据
with open(csv_file, 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
total_shops = 0
# 3. 遍历每个城市
for city in cities:
cityCode = city["cityCode"]
cityName = city["cityName"]
print(f"\n正在获取 {cityName} ({cityCode}) ...")
try:
res = requests.post(
url,
json={"cityCode": cityCode},
headers=headers,
timeout=10
).json()
if res.get("status") != 0:
print(f"跳过 {cityName}: 接口返回错误 {res.get('msg', '未知')}")
continue
shops = res["data"]
print(f"获取到 {len(shops)} 家门店")
for shop in shops:
loc = shop.get("location") or {}
ot = shop.get("openTime") or {}
row = {
"id": shop.get("id", ""),
"shopCode": shop.get("shopCode", ""),
"name": shop.get("name", ""),
"displayName": shop.get("displayName", ""),
"address": shop.get("address", ""),
"province": shop.get("province", ""),
"city": shop.get("city", ""),
"district": shop.get("district", ""),
"lng": loc.get("lng", ""),
"lat": loc.get("lat", ""),
"businessPhone": shop.get("businessPhone", ""),
"openFrom": ot.get("from", ""),
"openTo": ot.get("to", "")
}
writer.writerow(row)
total_shops += 1
except Exception as e:
print(f"请求 {cityName} 失败:", e)
time.sleep(1) # 友好请求,避免过快
print(f"\n全部完成!共获取 {total_shops} 家门店,已保存至:{csv_file}")
if __name__ == "__main__":
main()
获取数据标签如下:id(门店id)、name(门店名称)、address(门店地址)、province(所在行政省级行政区)、city(所以在地级行政区)、district(所在县级行政区)、lng&lat(地理编码)businessPhone(电话)、openFrom(营业开始时间)、openTo(营业结束时间),其他一些非关键标签,这里省略;
第三步:坐标系转换,由于便利蜂门店数据使用的是百度坐标系(BD09),为了在ArcGIS上准确展示而不发生偏移,我们需要将网点的坐标从BD09转换为WGS-84坐标系。我们可以利用coord-convert库中的bd2wgs(lng, lat)函数,也可以用免费这个网站:批量转换工具:地图坐标系批量转换 - 免费在线工具;
对CSV文件中的门店坐标列进行转换,完成坐标转换后,再将数据导入ArcGIS进行可视化;
接下来,我们进行看图说话:
便利蜂作为近年来快速崛起的连锁便利店品牌,其在全国范围内的门店布局呈现出高度集中的区域化特征,并未实现广泛意义上的全国化覆盖。目前,企业的业务重心明显偏向北方市场,形成了以京津冀为核心、长三角为次中心的“双核驱动”格局。这种分布模式反映出便利蜂在战略上采取了区域深耕、稳扎稳打的发展路径,而非盲目扩张。
其中,北京市是便利蜂的绝对核心市场,门店数量高达592家,占全国总数的70%以上。这一数字不仅远超其他城市,也表明便利蜂在北京已进入深度渗透阶段,实现了高密度布点和品牌强曝光。北京市场的成熟运营为其积累了丰富的管理经验与供应链体系,成为企业发展的“大本营”和战略支点。
在京津冀区域,天津市以158家门店位居第二,与北京形成紧密的协同效应,进一步巩固了北方市场的整体优势。同时,廊坊市布局6家门店,虽数量不多,但地理位置关键,处于京津走廊的重要节点,有助于完善区域物流网络和服务通勤人群,体现出企业在区域一体化战略中的前瞻性布局。
相比之下,便利蜂在华东地区的拓展则显得较为谨慎,整体呈现“北强南弱”的格局。上海市作为南方市场的桥头堡,拥有37家门店,是长三角地区的运营支点;南京市紧随其后,有34家门店,显示出向南京都市圈辐射的意图。而杭州市和济南市分别仅有5家和7家门店,属于试探性布局,尚未形成规模效应,表明企业在南方市场仍处于试点和初步渗透阶段。
从城市选择来看,便利蜂优先聚焦于直辖市和省会等高能级城市,反映出其倾向于进入经济发达、人口密集、消费能力强的核心城市。这种策略有助于降低市场风险、提升单店效益,并依托大城市的品牌影响力辐射周边区域。总体而言,便利蜂当前的扩张模式是典型的“区域连锁”路径——以北京为大本营,逐步向外辐射,整体形成以北京为绝对核心,辐射天津、廊坊,形成强大的京津冀基本盘;同时以上海为支点,试探性布局长三角,整体呈现“北强南弱、区域聚焦”的典型区域连锁品牌特征。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。