Python爬虫实战,pyecharts模块,Python实现美食网站菜谱数据可视化

303 阅读4分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

前言

这一期我们利用Python爬虫豆果网最新发布的中国菜系共3032个菜谱数据可视化

废话不多说,让我们愉快地开始吧~

开发工具

Python版本: 3.7.4

相关模块:

pyecharts模块;

Pandas模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

数据获取

本次爬取的数据范围为川菜、粤菜、湘菜等八个中国菜系,包含菜谱名、链接、用料、评分、图片等字段

 1 # 主函数
 2 def main(x):
 3    url = 'https://www.douguo.com/caipu/{}/0/{}'.format(caipu,x*20)
 4    print(url)
 5    html = get_page(url)
 6    parse_page(html,caipu)
 7
 8 if __name__ == '__main__':
 9    caipu_list = ['川菜', '湘菜','粤菜','东北菜','鲁菜','浙菜','湖北菜','清真菜'] #中国菜系
10    start = time.time()  # 计时
11    for caipu in caipu_list:
12        for i in range(22):
13            # 爬取多页
14            main(x=i)
15            time.sleep(random.uniform(1, 2))
16            print(caipu,"第" + str(i+1) + "页提取完成")
17    end = time.time()
18    print('共用时',round((end - start) / 60, 2), '分钟')

数据清洗

本文数据清洗主要用到Python的Pandas库

导入数据

用pd.read方法导入爬取到的菜谱数据,并添加列名。

图片

删除重复项

爬虫过程中少量菜谱数据被重复抓取,需要用drop_duplicates方法删除。

图片

缺失值处理

通过info方法发现少量记录含有缺失值,用dropna方法删除。

图片

评分字段清洗

爬取的评分字段含有多余的字符串且为object类型,需要替换多余字符串并转换为数字类型,方便后续计算。

图片

添加用料数字段

为方便菜谱用料分析,需要根据用料字段计算出每个菜谱的用料数量。由于用料字段都是以逗号分隔,计算逗号数即可间接得到。

图片

数据可视化

数据可视化主要用到pyecharts库,它能轻松实现酷炫的图表效果。

菜谱评分分布+

 1 from pyecharts import options as opts
 2 from pyecharts.charts import Page, Pie
 3 cut = lambda x : '4分以下' if x < 4 else ('4.1-4.5分' if x <= 4.5 else('4.6-4.9分' if x <=    4.9 else '5分'))
 4 df['评分分布'] = df['评分'].map(cut)
 5 df2 = df.groupby('评分分布')['评分'].count()
 6 df2 = df2.sort_values(ascending=False)
 7 df2 = df2.round(2)
 8 print(df2)
 9 c = (
10        Pie()
11        .add(
12            "",
13            [list(z) for z in zip(df2.index.to_list(),df2.to_list())],
14            radius=["20%", "80%"],# 圆环的粗细和大小
15            rosetype='area' #玫瑰图
16        )
17        .set_global_opts(
18            title_opts=opts.TitleOpts(title="菜谱评分分布"
19                                     ),
20            legend_opts=opts.LegendOpts(
21                orient="vertical", pos_top="5%", pos_left="2%" ,textstyle_opts=opts.TextStyleOpts(font_size=14)# 左面比例尺
22            ),
23
24
25        )
26        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18),
27                      )
28    )
29 c.render_notebook()

图片

豆果美食网菜谱评分实行5分制。由上图可知,4分以下的菜谱占比不到2%,满分菜谱高达32.6%,可见用户对中国菜系菜谱评价普遍较高。

各菜系菜谱数量对比

 1 from pyecharts import options as opts
 2 from pyecharts.charts import Page, Pie 
 3 df2 = df.groupby('菜系')['评分'].count() #按菜系分组,对评分计数
 4 df2 = df2.sort_values(ascending=False) #降序
 5 print(df2)
 6 c = (
 7        Pie()
 8        .add("", [list(z) for z in zip(df2.index.to_list(),df2.to_list())])
 9        .set_global_opts(title_opts=opts.TitleOpts(title="各菜系菜谱数量占比",subtitle="数据来源:豆果美食"))
10        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
11    )
12 c.render_notebook()

图片

各菜系评分对比

 1 from pyecharts import options as opts
 2 from pyecharts.charts import Page, Pie
 3 df2 = df.groupby('菜系')['评分'].mean()
 4 df2 = df2.sort_values(ascending=False)
 5 df2 = df2.round(2)
 6 print(df2)
 7 c = (
 8        Pie()
 9        .add(
10            "",
11            [list(z) for z in zip(df2.index.to_list(),df2.to_list())],
12            radius=["40%", "75%"],   # 圆环的粗细和大小
13        )
14        .set_global_opts(
15            title_opts=opts.TitleOpts(title="各菜系平均评分"),
16            legend_opts=opts.LegendOpts(
17                orient="vertical", pos_top="5%", pos_left="2%"  # 左面比例尺
18            ),
19        )
20        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))
21    )
22 c.render_notebook()

图片

各菜系评分非常接近,用户平均评分都在4.6分以上。相对一致的评分,导致通过用户评分来评价菜谱的可信度降低。

各菜系用料数量对比

 1from pyecharts.charts import Bar,Pie
 2from pyecharts import options as opts
 3df1 = df.groupby('菜系')['用料数'].mean() #按菜系分组,对评分计数
 4df1 = df1.sort_values(ascending=False) #降序
 5df1 = df1.round(0)
 6print(df1)
 7bar = Bar()
 8bar.add_xaxis(df1.index.to_list())
 9bar.add_yaxis("用料数量",df1.to_list())
10bar.set_global_opts(title_opts=opts.TitleOpts(title="各菜系用料数量",subtitle="数据来源:豆果美食"))
11bar.render_notebook()

图片

粤菜更注重菜品的原味鲜香,具有清、鲜、爽、嫩、滑等特色,因此用料相对更少。清真饮食风俗源于伊斯兰教,部分食材属于禁忌物,因此用料也不多。