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

2023-12-29 07:17:58

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

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

分析数据源

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

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

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

查看 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)

image-20231225215537695

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

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

完成爬取

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

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

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

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

之后,我将以这 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”公众号回复星巴克关键词获取。

文章来源:https://blog.csdn.net/stormhou/article/details/135280464
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。