美食菜谱网站 菜谱网站

数据获取豆果美食网的数据爬取比较简单,本次爬取的数据范围为川菜、粤菜、湘菜等八个中国菜系,包含菜谱名、链接、用料、评分、图片等字段 。

美食菜谱网站  菜谱网站

文章插图
豆果美食网
限于篇幅,仅给出核心代码 。
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), '分钟')
数据清洗短短几分钟就爬下了3032个菜谱信息,为了方便可视化分析,还需要对爬取的数据进行简单清洗 。
本文数据清洗主要用到Python的Pandas库 。
导入数据用pd.read *** 导入爬取到的菜谱数据,并添加列名 。预览数据如下:

美食菜谱网站  菜谱网站

文章插图

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

美食菜谱网站  菜谱网站

文章插图

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

美食菜谱网站  菜谱网站

文章插图

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

美食菜谱网站  菜谱网站

文章插图

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

美食菜谱网站  菜谱网站

文章插图

数据可视化本文数据可视化主要用到pyecharts库,它能轻松实现酷炫的图表效果 。
菜谱评分分布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            ),232425        )26        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18),27                      )28    )29c.render_notebook()

推荐阅读