我用Python爬取美食網站3032個菜譜并分析,真香!
2024-06-04 加入收藏

數據獲取
豆果美食網的數據爬取比較簡單,如果您對爬蟲感興趣,可查看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(1, 2))
16 print(caipu,"第" + str(i+1) + "頁提取完成")
17 end = time.time()
18 print('共用時',round((end - start) / 60, 2), '分鐘')
爬蟲核心代碼

數據清洗
導入數據
用pd.read方法導入爬取到的菜譜數據,并添加列名。預覽數據如下:
刪除重復項
爬蟲過程中少量菜譜數據被重復抓取,需要用drop_duplicates方法刪除。
缺失值處理
通過info方法發現少量記錄含有缺失值,用dropna方法刪除。
評分字段清洗
添加用料數字段

數據可視化
本文數據可視化主要用到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}:lnpoet4jdj%",font_size=18),
27 )
28 )
29c.render_notebook()
玫瑰圖代碼
菜譜評分分布玫瑰圖
各菜系菜譜數量對比
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 as opts
2from pyecharts.charts import Page, Pie
3df2 = df.groupby('菜系')['評分'].mean()
4df2 = df2.sort_values(ascending=False)
5df2 = df2.round(2)
6print(df2)
7c = (
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 )
22c.render_notebook()
環狀圖代碼
各菜系平均評分環狀圖
各菜系用料數量對比
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()
柱狀圖代碼
各菜系用料數量柱狀圖
川菜用料分析
1# 繪制詞云圖
2text1 = get_cut_words(content_series=df[df['菜系']=='川菜']['用料'])
3stylecloud.gen_stylecloud(text=' '.join(text1), max_words=1000,
4 collocations=False,
5 font_path='字酷堂清楷體.ttf',
6 icon_name='fas fa-thumbs-up',
7 size=653,
8 output_name='./川菜.png')
9Image(filename='./川菜.png')
詞云圖代碼
川菜用料詞云圖
川味砂鍋之足不出戶的麻辣燙 圖片來源:豆果美食
粵菜用料分析
粵菜用料詞云圖
廣式腸粉 圖片來源:豆果美食
湘菜用料詞云圖
湘菜用料詞云圖
麻辣鹵鴨三件 圖片來源:互聯網
東北菜用料詞云圖
東北菜用料詞云圖
翡翠白菜水餃 圖片來源:豆果美食
湖北菜用料詞云圖
湖北菜用料詞云圖
家常美味——香菇雞肉面 圖片來源:豆果美食
浙菜用料詞云圖
浙菜用料詞云圖
經典糖醋排骨 圖片來源:豆果美食
魯菜用料詞云圖
魯菜用料詞云圖
大白菜燉牛肉 圖片來源:豆果美食
清真菜用料詞云圖
清真菜用料詞云圖
糖醋蛋白肉 圖片來源:豆果美食
聲明
1.本數據分析只做學習研究之用途,提供的結論僅供參考,美食的烹飪涉及的影響因素還有很多,請獨立思考;
2.作者與豆果美食無任何瓜葛,只是他家數據比較全面且干凈,便于數據分析,大家也可以去其他美食平臺看看;
3.作者對傳統美食文化了解甚微,相關描述可能存在不盡完善之處,請勿對號入座。