我用 Python 从美食网站上抓取了 3032 份食谱并对其进行了分析,它闻起来真香!
最编程
2024-05-02 07:37:03
...
回复“书籍”即可获赠Python从入门到进阶共10本电子书
数据获取
豆果美食网的数据爬取比较简单,如果您对爬虫感兴趣,可查看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}:{d}%",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
下一篇:
从鱼眼镜头成像原理到像差校正(完整版)