欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

我用 Python 从美食网站上抓取了 3032 份食谱并对其进行了分析,它闻起来真香!

最编程 2024-05-02 07:37:03
...
点击上方“ Python爬虫与数据挖掘 ”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

江雨霏霏江草齐,六朝如梦鸟空啼。


这是巨变的中国,人和食物,比任何时候走的更快。近日,J哥为了寻味中国,奔走于某五线城市的大街小巷,结果除了累,啥也没寻到。

于是,J哥默默打开了各大美食网站,如豆果美食、下厨房、美食天下等。经过甄选,最终爬取了豆果网最新发布的中国菜系共3032个菜谱,然后清洗数据并做可视化分析,试图走上美食博主的康庄大道。


数据获取


豆果美食网的数据爬取比较简单,如果您对爬虫感兴趣,可查看J哥往期原创文章「实战|手把手教你用Python爬虫(附详细源码)」,思路一致。


豆果美食网


本次爬取的数据范围为川菜、粤菜、湘菜等八个中国菜系,包含菜谱名、链接、用料、评分、图片等字段。限于篇幅,仅给出核心代码。


 1# 主函数
2def 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
8if __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(12))
16            print(caipu,"第" + str(i+1) + "页提取完成")
17    end = time.time()
18    print('共用时',round((end - start) / 602), '分钟')

爬虫核心代码



数据清洗


短短几分钟就爬下了3032个菜谱信息,为了方便可视化分析,还需要对爬取的数据进行简单清洗。

本文数据清洗主要用到Python的Pandas库,如果您对Pandas感兴趣,可查看J哥往期原创专辑「Pandas基础系列」,共五篇

导入数据


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



删除重复项


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



缺失值处理


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



评分字段清洗


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



添加用料数字段


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




数据可视化


本文数据可视化主要用到pyecharts库,它能轻松实现酷炫的图表效果。如果您对可视化感兴趣,可查看J哥往期原创文章「数据可视化分析系列」,涉及地产、电商、招聘等各领域


菜谱评分分布


 1from pyecharts import options as opts
2from pyecharts.charts import Page, Pie
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分'))
4df['评分分布'] = df['评分'].map(cut)
5df2 = df.groupby('评分分布')['评分'].count()
6df2 = df2.sort_values(ascending=False)
7df2 = df2.round(2)
8print(df2)
9c = (
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    )
29c.render_notebook()

玫瑰图代码


菜谱评分分布玫瑰图


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


各菜系菜谱数量对比


 1from pyecharts import options as opts
2from pyecharts.charts import Page, Pie 
3df2 = df.groupby('菜系')['评分'].count() #按菜系分组,对评分计数
4df2 = df2.sort_values(ascending=False#降序
5print(df2)
6c = (
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    )
12c.render_notebook()

饼图代码


各菜系菜谱数量占比饼图


由上图可知,川菜和粤菜菜谱数量较多,显示出作为中国“八大菜系”成员的地位。湖北菜和清真菜菜谱数量较少,相对更为小众。

各菜系评分对比


 1from pyecharts import options 
						

上一篇: 以 YouGet 批量下载视频到 B 站点为例

下一篇: 从鱼眼镜头成像原理到像差校正(完整版)