麦门永存 · 上海麦麦版图:619 家门店、152 家在浦东、97% 卖咖啡
POST请求
所有大规模连锁品牌都有两个面。正面是你打开手机 App 看到的那些------菜单划不到底、门店图修得像摄影棚、每一张优惠券都经过 A/B 测试。背面是接口,是数据管道,是前端和后端之间那些工程师背后的东西。
麦当劳的背面,有一条 POST 请求。
它躺在官网地图页的 Network 面板里,像一封没有贴封条的信。Payload 是一对经纬度,返回值是方圆一公里内所有麦当劳的简短档案------店名、门牌号、电话、坐标,外加四个布尔开关:有没有麦咖啡、有没有滑梯、通不通宵、能不能不下车就拿到一袋薯条。

打开官方门店查询网址,按 F12 打开开发者工具 → 切换到 Network(网络) 面板 → 刷新页面 → 筛选 Fetch /XHR 请求。
首先,我们找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置;

负载:对于POST请求:负载通常包含了传递的参数,因为所有参数都通过URL传递,这里我们可以看到查询关键词、当前查询位置的lon,lat(经纬度坐标);

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

布网
这个接口的返回半径是大约1.5公里。我需要的是一张能兜住整座上海的渔网。
网眼确定之后,还得知道网往哪儿投。我从一个 SHP 文件里掏出了上海的形状------完整的多边形描边,六个独立环,描出大陆岸线、崇明岛的入海口、长兴岛孤立的礁石轮廓。用这些环把网格筛了一遍:落在水里的剔除,掉进江心的丢掉,最后剩下 3234 个有效格点。
3234 不是一个小数字。但它恰好是那个刚好够用的数字------多一个格点不增加新门店,少一个格点你就肯定漏了点什么。这是统计学和直觉在 3234 这个点上达成的精确妥协。

这里通过脚本遍历所有门店数据并去重得到对应的数据集;
数据标签包括:title(门店名称)、address(门店地址)、tel(电话)、worktime(工作时间)、lon&lat(坐标),其他一些非关键标签,这里省略;

由于门店数据使用的是百度坐标系(BD-09),而我们通过地图展示的又是高德坐标系(GCJ-02),所以这里进行一次坐标转换;
数字
总账:619 间。
619,不是 618,不是 620。这个数字里有浦东新区 152 间店的疯狂,也有崇明岛 6 间店的倔强。

上海一共 16 个行政区,每一块行政边界内都至少躺着一家麦当劳。这不是偶然------这只说明一件事:麦当劳在行政区划层面不存在盲区。 只要行政边界画好了,地图上就必须长出一个红底金字的 M。
但分布不是均匀的。浦东一家就占了所有门户的四分之一,第二名的闵行需要拉上宝山、徐汇两个弟兄才能勉强和它平起平坐。这不是马太效应,这是城市的肌理在用数据说话。

更狠的一组数字藏在标签里:
- 麦咖啡覆盖率 97%。 这不是"部分门店提供",这是几乎全线标配。你在上海地图上随机戳一个红点,走进去,大概率有现磨咖啡。星巴克需要为这个数字感到紧张------不是因为它少,而是因为麦当劳做到这个覆盖率几乎没花额外的租金成本。
- 儿童游乐区覆盖 52%。 过半的门店给滑梯和海洋球池留了地。这是一个信号:家庭客群在麦当劳的客流模型里,比任何第三方报告告诉你的都要重。
- 得来速只有 52 家,24 小时只有 29 家。 这两个标签的稀缺程度反过来解释了上海的商业地产逻辑------绝大多数麦当劳开在商场内部,没有临街车道,夜间人流主要靠骑手配送而不是堂食。

梯度

把上海拆成五层:
浦东单枪匹马 152 间。中心城区七区合计,不过再多一点点。到了近郊三区,数量开始断崖。进入远郊四区和崇明岛之后,两位数变成了个位数。每一层都是一道衰减梯度,每一道梯度背后都有商业地产的开发节奏、人口密度、通勤热力在撑腰。
这张图比任何规划部门的文件都诚实。
收束
619 家门店的数据,最后收拢成一个 CSV 文件、一张 Leaflet 交互地图。
文件不长,脚本不复杂,接口不需要登录。
我只是好奇:上海到底有几家麦当劳。现在我知道了。
619 家。每一家的地板上都粘过一滴番茄酱。

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