美食菜譜網站 菜譜網站

數據獲取豆果美食網的數據爬取比較簡單,本次爬取的數據范圍為川菜、粵菜、湘菜等八個中國菜系,包含菜譜名、鏈接、用料、評分、圖片等字段 。

美食菜譜網站  菜譜網站

文章插圖
豆果美食網
限于篇幅,僅給出核心代碼 。
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=":dikr8e4r4%",font_size=18),27                      )28    )29c.render_notebook()

推薦閱讀