做个合格的吃货~利⽤Python爬取美⾷⽹站3032个菜谱并分析导语:
这两天⽓温急剧下降,天冷的⼩编实在是不想出门,到了饭点~诶!兴冲冲点开某团美滋滋点了个外卖!然后就是等了快两⼩时(天⽓恶劣铁汁萌也要理解下外卖员下雪之后路⾯也滑咱也不要催单)终于等到外卖结果没吃⼏⼝……踩雷了!(重点难吃还贵)
于是,我默默打开了各⼤美⾷⽹站,如⾖果美⾷、下厨房、美⾷天下等。经过甄选,最终爬取了⾖果⽹最新发布的中国菜系共3032个菜谱,然后清洗数据并做可视化分析,试图⾛上美⾷博主的康庄⼤道。
01.数据获取
⾖果美⾷⽹的数据爬取⽐较简单
⾖果美⾷⽹
本次爬取的数据范围为川菜、粤菜、湘菜等⼋个中国菜系,包含菜谱名、链接、⽤料、评分、图⽚等字段。限于篇幅,仅给出核⼼代码。
02.数据清洗
短短⼏分钟就爬下了3032个菜谱信息,为了⽅便可视化分析,还需要对爬取的数据进⾏简单清洗。本⽂数据清洗主要⽤到Python的Pandas库,如果您对Pandas感兴趣,可查看J哥往期原创专辑「Pandas基础系列」,共五篇。
导⼊数据
⽤pd.read⽅法导⼊爬取到的菜谱数据,并添加列名。预览数据如下:
删除重复项
爬⾍过程中少量菜谱数据被重复抓取,需要⽤drop_duplicates⽅法删除。
缺失值处理
通过info⽅法发现少量记录含有缺失值,⽤dropna⽅法删除。
评分字段清洗
爬取的评分字段含有多余的字符串且为object类型,需要替换多余字符串并转换为数字类型,⽅便后续计算。
1
1# 主函数2
2def main(x):3
3    url = 'www.douguo/caipu/{}/0/{}'.format(caipu,x*20)4
4    print(url)5
5    html = get_page(url)6
6    parse_page(html,caipu)7
78
8if __name__ == '__main__':9
9    caipu_list = ['川菜', '湘菜','粤菜','东北菜','鲁菜','浙菜','湖北菜','清真菜'] #中国菜系10
10    start = time.time()  # 计时11
11    for caipu in caipu_list:12
12        for i in range(22):13
13            # 爬取多页14
14            main(x=i)15
15            time.sleep(random.uniform(1, 2))16
16            print(caipu,"第" + str(i+1) + "页提取完成")1717    end = time.time()1818    print('共⽤时',round((end - start) / 60, 2), '分钟')
添加⽤料数字段
为⽅便菜谱⽤料分析,需要根据⽤料字段计算出每个菜谱的⽤料数量。由于⽤料字段都是以逗号分隔,计算逗号数即可间接得到。
03.数据可视化
本⽂数据可视化主要⽤到pyecharts库,它能轻松实现酷炫的图表效果。如果您对可视化感兴趣,可查看J哥往期原创⽂章「数据可视化分析系列」,涉及地产、电商、招聘等各领域。
菜谱评分分布
11from pyecharts import options as opts
2 2from pyecharts.charts import Page, Pie
3 3cut = 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 4df['评分分布'] = df['评分'].map(cut)
5 5df2 = df.groupby('评分分布')['评分'].count()
6 6df2 = df2.sort_values(ascending=False)
7 7df2 = und(2)
8 8print(df2)
9 9c = (
1010        Pie()
1111        .add(
1212            "",
1313            [list(z) for z in zip(_list(),_list())],
1414            radius=["20%", "80%"],# 圆环的粗细和⼤⼩
1515            rosetype='area' #玫瑰图
1616        )
1717        .set_global_opts(
1818            title_opts=opts.TitleOpts(title="菜谱评分分布"
1919                                    ),
2020            legend_opts=opts.LegendOpts(
2121                orient="vertical", pos_top="5%", pos_left="2%" ,textstyle_opts=opts.TextStyleOpts(font_size=14)# 左⾯⽐例尺
2222            ),
2323
2424
2525        )
2626        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18),
2727                      )
2828    )
⾖果美⾷⽹菜谱评分实⾏5分制。由上图可知,4分以下的菜谱占⽐不到2%,满分菜谱⾼达32.6%,可见⽤户对中国菜系菜谱评价普遍较⾼。
各菜系菜谱数量对⽐
1
21from pyecharts import options as opts
3 2from pyecharts.charts import Page, Pie
4 3df2 = df.groupby('菜系')['评分'].count() #按菜系分组,对评分计数
5 4df2 = df2.sort_values(ascending=False) #降序
6 5print(df2)
7 6c = (
8 7        Pie()
9 8        .add("", [list(z) for z in zip(_list(),_list())])
10 9        .set_global_opts(title_opts=opts.TitleOpts(title="各菜系菜谱数量占⽐",subtitle="数据来源:⾖果美⾷"))
1110        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
1211    )
由上图可知,川菜和粤菜菜谱数量较多,显⽰出作为中国“⼋⼤菜系”成员的地位。湖北菜和清真菜菜谱数量较少,相对更为⼩众。
各菜系评分对⽐
1
21from pyecharts import options as opts
3 2from pyecharts.charts import Page, Pie
4 3df2 = df.groupby('菜系')['评分'].mean()
5 4df2 = df2.sort_values(ascending=False)
6 5df2 = und(2)
7 6print(df2)
8 7c = (
9 8        Pie()
10 9        .add(
1110            "",
1211            [list(z) for z in zip(_list(),_list())],
1312            radius=["40%", "75%"],  # 圆环的粗细和⼤⼩
1413        )
1514        .set_global_opts(
1615            title_opts=opts.TitleOpts(title="各菜系平均评分"),
1716            legend_opts=opts.LegendOpts(
1817                orient="vertical", pos_top="5%", pos_left="2%"  # 左⾯⽐例尺
1918            ),
2019        )
2120        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))
2221    )
由上图可知,各菜系评分⾮常接近,⽤户平均评分都在4.6分以上。相对⼀致的评分,导致通过⽤户评分来评价菜谱的可信度降低。各菜系⽤料数量对⽐
1
21from pyecharts.charts import Bar,Pie
3 2from pyecharts import options as opts
4 3df1 = df.groupby('菜系')['⽤料数'].mean() #按菜系分组,对评分计数
5 4df1 = df1.sort_values(ascending=False) #降序
6 5df1 = und(0)
7 6print(df1)
8 7bar = Bar()
9 8bar.add_xaxis(_list())
10 9bar.add_yaxis("⽤料数量",_list())豆果美食食谱大全app最新版
1110bar.set_global_opts(title_opts=opts.TitleOpts(title="各菜系⽤料数量",subtitle="数据来源:⾖果美⾷"))