python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!

    • 分析数据源
    • 总结思路
    • 准备工作:经纬度
    • 开始获取
    • 完成爬取

通过本文可获取全国6947个星巴克门店信息,包括:id、店名、地址(省、市、具体地址)、经纬度、营业时间等信息。

分析数据源

打开星巴克官网https://www.starbucks.com.cn/ ,点击门店。

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第1张图片

键盘 F12 快捷键,或者鼠标右击“检查”打开浏览器的检查页面。找到nearby?lat=&lon=这个请求。可以看到 Reruest URL 由经度、纬度、限制数量、搜索半径等参数构成。

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第2张图片

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第3张图片

在 Preview 中,可以看到本次请求返回了 1429 个门店,每个门店的字段信息都是相同的结构化数据,都在 data 这个键对应的值里。

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第4张图片

查看 response 数据,是 json 格式,其中 1 个门店信息展示如下,可以得到星巴克的 id、店名、地址(省、市、具体地址)、经纬度、营业时间等信息。

{
    "meta": {
        "total": 1623
    },
    "data": [
        {
            "id": "26873",
            "name": "苏州市立医院店",
            "address": {
                "city": "苏州市",
                "streetAddressLine1": "江苏省苏州市",
                "streetAddressLine2": "",
                "streetAddressLine3": "江苏省苏州市姑苏区道前街26号",
                "postalCode": "215000"
            },
            "coordinates": {
                "longitude": 120.62050849199296,
                "latitude": 31.30114163943174
            },
            "today": {
                "closeTime": "19:00:00",
                "openTime": "06:30:00"
            },
            "features": [
                "OG",
                "DL",
                "MOP"
            ],
            "hasArtwork": false,
            "storeNumber": "26873"
        }
}

总结思路

通过以上观察,我们总结思路:

  1. 根据经度、纬度等参数构建 url
  2. 用 request 库请求 url,返回值转为 json 数据
  3. 使用 pandas 库对 json 数据进行处理
  4. 将处理完的数据保存入 csv 文件或 excel 文件

准备工作:经纬度

其中的关键是如何获得第一步中份经度、纬度数据。可以参考我之前的这篇文章,https://mp.weixin.qq.com/s/C8wTMpSyYfKofQrHrWDRMA

开始获取

准备工作就绪,接下来就开始获取星巴克全国门店信息。

限于文章篇幅,只列出主函数,完整的代码和数据可以在“程序员coding”公众号后台回复星巴克获取。

首先,构建 starbucks(lon, lat)函数,解析 response

def starbucks(lon, lat):
    url = "https://www.starbucks.com.cn/api/stores/nearby"

    headers = {
        "Cookie": "Cookie",  #切换自己的Cookie
        "User-Agent": "User-Agent"  #切换自己的User-Agent
    }
    data = {
        "lat": lat,
        "lon": lon,
        "limit": "3000",
        "locale": "ZH",
        "features": "",
        "radius": "200000",
    }

    content_json = requests.get(url=url, headers=headers, params=data).json()
    print("等待3s")
    time.sleep(3)  # 防止被检测(不要低于3)
    print(content_json)  # 用于观察
    df = pd.DataFrame(content_json['data'])
    content_list.append(df)

其次,以全国地级市的经纬度作为参数,通过 pandas 的 apply 函数执行 starbucks(lon, lat)请求函数,遍历请求得到全国所有的星巴克门店信息。

并且使用 tqdm 库,显示执行过程的进度条:

from tqdm import tqdm
tqdm.pandas(desc='获取星巴克门店进度条', unit="请求")  # tqdm显示进度条
df.progress_apply(lambda x: starbucks(x['lon'], x['lat']), axis=1)

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第5张图片

最后,可以选择导出为 csv 文件或者 excel 文件:

df.to_csv('result.csv', index=False)  # 生成csv
df.to_excel('result.xlsx', index=False)  # 生成excel

完成爬取

得到 141511 条数据,如下图所示:

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第6张图片

经过数据去重处理,剩余 6947 条不重复数据。(数据更新时间为 2023 年 12 月 28 日)

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第7张图片

2023 年 11 月的新闻这样写到“星巴克首席执行官纳思瀚表示:至 2023 财年末,星巴克在中国的门店数已超过 6800 家”。

python 实战:爬取全国星巴克门店信息,上海竟有 1115 个门店!_第8张图片

经过与最新的新闻报道比对验证,可以证实本次基本上获取到了全国真实的星巴克门店数据。

之后,我将以这 6947 条数据,通过代码进行更多的分析,欢迎关注“程序员coding”公众号。

例如,各省门店数量如下:

数量
1 上海市 1115
2 广东省 986
3 浙江省 977
4 江苏省 867
5 北京市 560
6 四川省 290
7 湖北省 225
8 福建省 221
9 山东省 208
10 天津市 161
11 陕西省 154
12 重庆市 145
13 辽宁省 131
14 湖南省 114
15 安徽省 95
16 河北省 94
17 河南省 93
18 广西壮 74
19 云南省 73
20 江西省 59
21 海南省 52
22 吉林省 51
23 贵州省 47
24 山西省 43
25 黑龙江 38
26 内蒙古 35
27 甘肃省 23
28 宁夏回 9
29 青海省 7
总计 6947

门店数量 top20 的城市如下:

城市 数量
1 上海市 1115
2 北京市 560
3 杭州市 411
4 深圳市 330
5 广州市 298
6 苏州市 270
7 成都市 228
8 宁波市 200
9 南京市 193
10 武汉市 184
11 天津市 161
12 重庆市 145
13 西安市 135
14 无锡市 109
15 佛山市 94
16 长沙市 81
17 厦门市 77
18 青岛市 77
19 东莞市 71
20 福州市 66

完整的代码和数据集可在“程序员coding”公众号回复星巴克关键词获取。

你可能感兴趣的:(python,python)