Python爬虫-爬取药膳食谱数据

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:喜欢的话麻烦您点个👍和

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我

额滴名片儿

 目录

1.介绍

2.分析

(1)数据来源

(2)页面结构

3.爬取流程

4.源码

5.效果展示

6.拓展


1.介绍

        本文将介绍如何编写Python爬虫,爬取心食谱网站的一些与药膳相关的食谱信息,当然,通过修改对应食谱的URL,可以爬取其他食谱信息。爬取到的数据可用于数据分析和可视化,适用于学年设计或者毕设的数据来源。

2.分析

(1)数据来源

心食谱网站:菜谱|菜谱大全|家常菜谱 - 心食谱

(2)页面结构

        我们主要爬取食谱分类板块下的食谱数据:

         随便点开一个食谱,比如点开第一个家常菜:

        页面底部是换页按钮,需要注意的是:当查看本食谱中的尾页时,页面底部换页按钮并不会出现下一页的按钮了

 

        点开其中的一个菜品,可以看到菜品详细信息:

        需要注意的是:有些菜品可能会有更多项或更少项介绍:

         查看菜谱菜品的URL:

        菜谱翻页:

 菜品详细信息:

3.爬取流程

菜谱的URL-->获取菜谱页中所有菜品的URL-->根据菜品的URL获取菜品的详细信息

        因为菜谱有多个页面,一页中有多个菜品,所以我们将使用循环遍历菜谱中的所有界面,获取所有菜品url,最后根据菜品url获取菜品的详细信息.

4.源码

import requests
from settings import COOKIES, HEADERS
from lxml import etree
from utils.utils import *
from db_helper import DBHelper# 获取食谱类型
def get_type(url):response = requests.get(url, cookies=COOKIES, headers=HEADERS)html = etree.HTML(response.text)type = html.xpath('/html/body/div[2]/div/h1/text()')[0]type = type.strip()DBHelper().findType(type)return type# 获取本菜谱下一页菜单页url
def get_next_page(url):response = requests.get(url, cookies=COOKIES, headers=HEADERS)html = etree.HTML(response.text)next_page_url = html.xpath('//div[@class="page-turn fl"]/a/@href')[-1]return next_page_url# 获取本页菜谱内的所有菜品基础信息
def get_menu(url):response = requests.get(url, cookies=COOKIES, headers=HEADERS)html = etree.HTML(response.text)ys_name_list = html.xpath('//div[@class="new-menu mt20"]/div[@class="bpannel cb"]/a/@title')         # 药膳名称列表ys_url_list = html.xpath('//div[@class="new-menu mt20"]/div[@class="bpannel cb"]/a/@href')ys_img_list = html.xpath('//div[@class="new-menu mt20"]//div[@class="v-pw"]/img/@src')memu = zip(ys_name_list, ys_url_list, ys_img_list)return memu# 获取菜品详细信息
def get_details(url):response = requests.get(url, cookies=COOKIES, headers=HEADERS)html = etree.HTML(response.text)infos = html.xpath('/html/body/div[2]/div/div[1]/div[2]/div')details = ''for info in infos[:-1]:title = ''content = ''for i in info.xpath('./div[1]/text()'):title += ifor i in info.xpath('./div[2]//text()'):content += ititle = title.replace('\t', '').replace('\n', '')content = content.replace('\t', '').replace(' ', '').replace('\n\n', '').strip()# print(title, content)details += (title + '\n' + content + '\n')return details# 获取菜品的封面图片
def get_img(url):response = requests.get(url, cookies=COOKIES, headers=HEADERS)img_data = response.contentreturn img_data# 主程序
if __name__ == '__main__':# 每次运行前留一个url不被注释就行# url = 'https://www.xinshipu.com/caipu/112026/'# url = 'https://www.xinshipu.com/caipu/114076/'      # 健脾开胃# url = 'https://www.xinshipu.com/caipu/114485/'      # 虚补养身# url = 'https://www.xinshipu.com/caipu/115230/'      # 防癌抗癌# url = 'https://www.xinshipu.com/caipu/114194/'      # 清热解毒# url = 'https://www.xinshipu.com/caipu/115250/'      # 壮腰健肾# url = 'https://www.xinshipu.com/caipu/115222/'      # 益智补脑# url = 'https://www.xinshipu.com/caipu/114677/'      # 营养滋补# url = 'https://www.xinshipu.com/caipu/115222/'      # 美容养颜# url = 'https://www.xinshipu.com/caipu/114185/'      # 润肺止咳# url = 'https://www.xinshipu.com/caipu/115222/'      # 美容养颜url = 'https://www.xinshipu.com/caipu/114686/'      # 补气补血type = get_type(url)type = get_type(url)print(type)all_page_list = [url]while 1:# 定义详细信息# 1.获取本页菜单所有菜品基础信息menu = get_menu(url)for item in menu:# print(item)cname = item[0]     # 菜品名称detail_url = 'https://www.xinshipu.com' + item[1]       #菜品详情URL# 获取菜品详细信息details = get_details(detail_url)# print(details)img_url = 'https:' + item[2]        # 菜品的封面图片URL# 获取菜品的封面图片img_content = get_img(img_url)# 保存封面图片到本地img_name = getTimeStamp() + '.jpg'# saveImge(img_content, img_name)create_time = getCurrentTime()shipu = dict()shipu['type'] = typeshipu['cname'] = cnameshipu['img_name'] = img_nameshipu['details'] = detailsshipu['create_time'] = create_timeprint(shipu)DBHelper().saveItem(img_content, img_name, shipu)time.sleep(1)# 获取下一页菜单urlnext_page_url = 'https://www.xinshipu.com' + get_next_page(url)if next_page_url not in all_page_list:url = next_page_urlall_page_list.append(url)else:print('该菜谱所有页面的url已获取完毕')break

        篇幅有限,这里仅展示了最核心的源码,涉及到的基础变量配置,数据库操作,工具类的源码这里不做展示 ,如果需要完整源码的话可以通过文章底部个人名片联系我.

5.效果展示

6.拓展

        当我们获取了这些数据之后,可以做一个推荐系统之类的项目用作毕设或者参加比赛啥的,如下是我做的一个基于Django的药膳食谱推荐系统,使用的是基于用户的协同过滤推荐算法。

        如果有需要可以联系我哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/597020.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读笔记】SAM-Adapter: Adapting Segment Anything in Underperformed Scenes

1.论文介绍 SAM-Adapter: Adapting Segment Anything in Underperformed Scenes SAM适配器:在表现不佳的场景中适配任何片段 2023年 ICCV Paper Code SAM Fails to Segment Anything? – SAM-Adapter: Adapting SAM in Underperformed Scenes: Camouflage, Shado…

怎么在UE过场动画中加入振动效果

我们已经学会了怎么在游戏中加入振动效果,比较典型的交互场景如:在开枪时让手柄同步振动,实现起来真的很简单,就是定义场景和事件,然后在游戏事件发生时播放特定的振动资源文件,跟播放音效是极其相似的&…

软件系统测试方案套用模板(原件)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

Python爬取公众号封面图(零基础也能看懂)

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类,封装View的规格尺寸…

Netty NioEventLoop详解

文章目录 前言类图主要功能NioEventLoop如何实现事件循环NioEventLoop如何处理多路复用Netty如何管理Channel和Selector管理Channel管理Selector注意事项 前言 Netty通过事件循环机制(EventLoop)处理IO事件和异步任务,简单来说,就是通过一个死循环&…

洛谷 1126.机器人搬重物

思路:BFS 这道BFS可谓是细节爆炸,对于编程能力和判断条件的能力的考察非常之大。 对于这道题,我们还需要额外考虑一些因素,那就是对于障碍物的考虑和机器人方位的考虑。 首先我们看第一个问题,就是对于障碍物的考虑…

中颖51芯片学习2. IO端口操作

一、SH79F9476 I/O端口介绍 1. 特性 SH79F9476提供了30/26位可编程双向 I/O 端口;端口数据在寄存器Px中;端口控制寄存器PxCRy是控制端口作为输入还是输出;端口作为输入时,每个I/O端口均带有PxPCRy控制的内部上拉电阻。有些I/O引…

Java Spring IoCDI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 前提小知识:高内…

一点点金融

一点点金融 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多趋势分析 改进MACD策略,使用涨跌幅比值RSI计算MACD原始MACD计算改进思路:使用涨跌幅比值RSI计算MACD 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多…

使用AI开源引擎构建:智能文档处理系统提升企业生产效率

企业面临着海量文档的处理和管理挑战。智能文档处理技术(Intelligent Document Processing, IDP)应运而生,旨在通过人工智能(AI)技术提高文档处理的效率和准确性。本文将探讨IDP技术的核心功能、应用场景以及对企业效率…

RGB三通道和灰度值的理解

本文都是来自于chatGPT的回答!!! 目录 Q1:像素具有什么属性?Q2:图像的色彩是怎么实现的?Q3:灰度值和颜色值是一个概念吗?Q4:是不是像素具有灰度值,也有三个颜色分量RGB?Q5:灰度图像是没有色彩的吗?Q6: 彩色图像是既具有灰度值也具有RGB三…