【python爬虫实战】——爬取肯德基餐厅数据+可视化(附完整代码)

在数据分析和商业决策中,获取准确的餐厅位置信息是非常重要的。本文将介绍如何使用Python编写一个简单的爬虫程序,采集全国各地的餐厅数据,并将这些数据保存为CSV文件。我们将重点介绍爬虫的分析过程、采集的字段以及具体的实现步骤。

> 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

一、项目背景

肯德基在中国拥有数千家门店,遍布各大城市和乡镇。这些餐厅的分布情况、地址信息以及营业时间等数据,对于以下场景具有重要意义:

  1. 市场分析:了解肯德基的市场布局,分析其在不同地区的市场渗透率。

  2. 地理信息系统(GIS)研究:将餐厅数据与地理信息相结合,研究其选址策略和区域分布特征。

  3. 商业选址:为其他企业或品牌提供参考,帮助其选择合适的商业地点。

二、爬虫分析

1. 目标网站分析

目标网站:肯德基餐厅信息查询

该页面提供了全国各省市的餐厅信息,包括餐厅名称、地址、所在城市和省份等。

通过分析页面结构,我们发现:

  • 餐厅列表是通过异步加载(Ajax)的方式获取的,数据以JSON格式返回。

  • 页面首先加载了所有省份和城市的信息,用户选择城市后,页面会通过POST请求获取该城市的餐厅数据。

2. 采集字段

我们需要采集的字段包括:

  • 餐厅名称:餐厅的名称。

  • 餐厅地址:餐厅的具体地址。

  • 城市:餐厅所在的城市。

  • 省份:餐厅所在的省份。

  • 详情:餐厅的附加信息(如营业时间等)。

这些字段能够帮助我们全面了解肯德基在中国的分布情况及其营业细节。

三、环境准备

在开始之前,请确保你已经安装了以下Python库:

  • requests:用于发送HTTP请求。

  • parsel:用于解析HTML页面。

  • csv:用于将数据保存为CSV文件。

你可以通过以下命令安装这些库:

pip install requests parsel

四、爬虫分析与采集步骤

1. 分析目标网站

肯德基官方网站提供了餐厅信息查询功能,通过输入城市名称或省份,可以查询到相应地区的餐厅列表。经过分析,我们发现其数据是通过后端接口动态加载的,这意味着我们可以直接通过接口获取数据,而无需解析网页内容。

2. 获取城市列表

肯德基餐厅信息查询页面提供了按省份和城市查询的功能。首先,我们需要获取所有省份及其对应的城市列表。通过分析页面的 HTML 结构,我们提取了所有省份和城市的名称,并将其存储为列表,以便后续使用。

3. 构造请求获取餐厅数据

肯德基提供了餐厅信息查询接口,我们可以通过 POST 请求向接口发送城市名称和分页参数,获取该城市的餐厅数据。接口返回的是 JSON 格式的数据,其中包含了餐厅名称、地址、城市、省份等关键信息。

4. 数据解析与存储

获取到餐厅数据后,我们需要解析 JSON 数据,提取所需的字段,并将其存储为 CSV 文件。CSV 格式便于后续的数据分析和处理。

5. 自动化采集流程

为了实现自动化采集,我们将上述步骤整合到主程序中。程序首先获取所有城市信息,然后针对每个城市依次采集其餐厅数据,并将结果写入 CSV 文件。

五、运行效果

运行程序后,程序会自动采集肯德基餐厅的数据,并将其存储为 kfc.csv 文件。

六、完整代码

1. 数据采集代码

<如果您对源码(爬虫+可视化)感兴趣(不白嫖)迪迦,可以在评论区留言(主页 \/)伪善,我会根据需求提供指导和帮助>

2. 可视化(完整可视化代码)

2.1 中国各省肯德基餐厅数量发布
from pyecharts import options as opts
from pyecharts.charts import Map

province_counts = df['省份'].value_counts().reset_index()
province_counts.columns = ['省份', '数量']
data_pair = [(row['省份'], row['数量']) for _, row in province_counts.iterrows()]


map_chart = Map()

map_chart.add(
    series_name="",
    data_pair=data_pair,
    maptype="china",
    is_map_symbol_show=False  # 不显示地图标记
)

# 设置全局配置项
map_chart.set_global_opts(
    title_opts=opts.TitleOpts(title="中国各省KFC餐厅数量发布"),  
    visualmap_opts=opts.VisualMapOpts(
        is_piecewise=True,  # 设置为分段形式
        pieces=[
            {"min": 0, "max": 200, "label": "200以下", "color": "#deebf7"},  # 更浅的蓝色
            {"min": 200, "max": 500, "label": "200-500", "color": "#c6dbef"},  # 中等蓝色
            {"min": 500, "max": 1500, "label": "500-1500", "color": "#3182bd"},  # 深蓝色
            {"min": 1500, "label": "1500以上", "color": "#08519c"}  # 更深的蓝色
        ],
        pos_left="left",  # 设置视觉映射组件的位置
        textstyle_opts=opts.TextStyleOpts(color="#333333")  # 设置文本颜色
    )
)

map_chart.render_notebook()

2.2 广东省KFC餐厅数量排行榜
city_counts = df[df['省份']=='广东省']['城市'].value_counts()[::-1]

plt.figure(figsize=(10, 6))
city_counts.plot(kind='barh', color='skyblue',)
plt.title("广东省KFC餐厅数量排行榜")
plt.xlabel("")
plt.ylabel("餐厅数量")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
2.3 KFC餐厅服务设施分布
services = df['详情'].str.get_dummies(sep=',')
services.columns = [col.strip() for col in services.columns]  
service_counts = services.sum()

plt.figure(figsize=(10, 6))
service_counts.plot(kind='bar', color='lightgreen')
plt.title("KFC餐厅服务设施分布")
plt.xlabel("服务设施")
plt.ylabel("数量")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

2.4 KFC餐厅24小时服务分布
df['24小时服务'] = df['详情'].str.contains("24小时")
service_24h = df['24小时服务'].value_counts()

sns.set_theme(style="white",rc={
                  "font.sans-serif": ["SimHei"],  # 设置字体为黑体
                  "axes.unicode_minus": False,   # 正确显示负号
                  "font.family": "sans-serif"    # 设置字体族为 sans-serif
              }

plt.figure(figsize=(8, 8))
palette = sns.color_palette("pastel")  
plt.pie(
    service_24h, 
    labels=['非24小时服务', '24小时服务'], 
    autopct='%1.1f%%', 
    startangle=140, 
    colors=palette
)


plt.title("KFC餐厅24小时服务分布", fontsize=16, fontweight='bold')
centre_circle = plt.Circle((0, 0), 0.70, fc='white')
fig = plt.gcf()
fig.gca().add_artist(centre_circle)

plt.tight_layout()
plt.show()
2.5 KFC餐厅服务设施与省份的关联
city_services = df.join(services).groupby('省份').sum().reset_index()

plt.figure(figsize=(14, 8))
sns.heatmap(city_services.set_index('省份'), cmap='viridis', annot=True, fmt=".0f", linewidths=.5)
plt.title("KFC餐厅服务设施与省份的关联", fontsize=16)
plt.xlabel("服务设施", fontsize=14)
plt.ylabel("省份", fontsize=14)
plt.xticks(fontsize=12, rotation=45)
plt.yticks(fontsize=12)
plt.tight_layout()
plt.show()