随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马鲜生官方网站获取门店位置信息,包括全国业态的盒马鲜生店、盒马X会员店、盒马邻里店、盒马奥莱店,通过解析构造请求、响应数据以及实现数据可视化,并通过可视化分析来展示盒马鲜生在我国的分布情况。
盒马鲜生官方网址:盒马
我们第一步先找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置;
负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递;
盒马就没有负载这一部分,那么为什么没有呢?
根据 HTTP/1.1 的规范(RFC 7231),GET 请求不应包含请求体。虽然技术上可以在 GET 请求中包含请求体,但这并不符合规范,且大多数服务器和中间件不会处理 GET 请求中的请求体,也就是说HTTP 协议没有为 GET的请求体赋予语义,也就是即不要求也不禁止 GET 请求带请求体;
前面的状态码提到了200 OK (从磁盘缓存) 又是什么意思?
200 好理解,也就是 HTTP 状态码,表示请求已成功处理,那什么是从磁盘缓存?
(从磁盘缓存) 缓存机制:这部分信息表明响应内容是从客户端的缓存中获取的,而不是直接从服务器获取的。缓存可以是浏览器的内存缓存或磁盘缓存。
磁盘缓存:当浏览器访问某个资源时,它会将该资源存储在本地的磁盘缓存中,以便在后续请求中快速访问,而无需再次向服务器发送请求。这有助于提高加载速度和减少网络带宽的使用。
预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;
接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;
方法思路
- 获取所有店铺列表的相关标签数据,另存为csv;
- 根据每个店铺地址信息查询地理坐标信息;
- 坐标转换,GCJ-02转WGS84;
第一步:我们先找到对应数据存储位置,获取所有店铺列表,并根据标签进行保存,另存为csv;
完整代码#运行环境 Python 3.11
import requests
import json
import csvdef fetch_json_data():# 请求的 URLurl = 'https://hema-infra-center.oss-cn-zhangjiakou.aliyuncs.com/lnc/store.json'# 自定义请求头headers = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Mobile Safari/537.36 Edg/132.0.0.0'}try:# 发送 GET 请求response = requests.get(url, headers=headers)# 检查响应状态response.raise_for_status() # 如果响应状态码不是 200,将引发异常# 解析 JSON 数据data = response.json()# 打开 CSV 文件以写入数据with open('store_data.csv', mode='w', newline='', encoding='utf-8') as csv_file:fieldnames = ['resourceName','address','city','county','province','bizStatus','bizStatusName','businessFormat','businessFormatName','role','roleName']writer = csv.DictWriter(csv_file, fieldnames=fieldnames)writer.writeheader() # 写入表头# 遍历 data 列表for item in data.get("data", []): # 从 JSON 中提取 "data" 字段writer.writerow({'resourceName': item.get("resourceName"),'address': item.get("address"),'city': item.get("city"),'county': item.get("county"),'province': item.get("province"),'bizStatus': item.get("bizStatus"),'bizStatusName': item.get("bizStatusName"),'businessFormat': item.get("businessFormat"),'businessFormatName': item.get("businessFormatName"),'role': item.get("role"),'roleName': item.get("roleName")})print("数据已成功保存到 store_data.csv")except requests.exceptions.RequestException as e:print(f"请求错误: {e}")if __name__ == "__main__":fetch_json_data()
这里我们已经拿到了所有门店的标签数据和门店地址信息,包括地址(address)、业务状态(bizStatus)表示商店的运营状态,通常用数字表示,而业务状态名称(bizStatusName)则是其中文描述,如“正常”表示商店正常运营。业务格式(businessFormat)指商店的经营模式或类型,简写为“ALZK”,而业务格式名称(businessFormatName)则是其中文描述,例如“奥莱折扣”。城市ID(cityId)、区县(county)、省份(province),这里解释一下role标签中的NB,意为Neighbour Business(社邻商业)也就是盒马邻里,Fresh也就是盒马鲜生;
第二步部分:坐标系转换,因为数据用的是高德坐标系(GCJ02),我们需要把转换成wgs84坐标系在argis上展示才不会偏移,我们把csv的坐标列手动分列一下,并把坐标从高德坐标系(GCJ02)转到WGS84,具体实现方法可以参考我这篇文章:地址转坐标:利用高德API进行批量地理编码_高德地图api-CSDN博客;
这里可以直接下载转换结果,坐标系GCJ-02,当然还有个别地址描述太模糊的或者格式无法识别,会查不出坐标,手动查一下坐标即可,大部分还是可以查到的,因为当前坐标系是GCJ02,需要批量转成WGS84/BD09的话可以用免费这个网站:批量转换工具:地图坐标系批量转换 - 免费在线工具 (latlongconverter.online);
第三步部分:坐标数据可视化,我们把转好的WGS84坐标信息放到argis进行可视化,可以看到盒马门店在空间上的分布情况;
从图中我们可以看到盒马门店的主要集中区域:盒马门店主要集中在上海及其周边地区,包括苏州、嘉兴等城市。这表明盒马在这些城市的市场渗透率较高,在大城市(如上海)中,门店分布较为密集,可能是因为这些地区的人口密度高,消费能力强,适合盒马的商业模式。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。