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.mzph.cn/news/797144.shtml

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

相关文章

前端学习之DOM编程案例:抽奖案例

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>抽奖案例</title><style>*{margin: 0;padding: 0;}</style> </head> <body><div id"container"&g…

浅谈Redis和一些指令

浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端&#xff08;桌面程序&#xff0c;web程序&#xff09; 像这样的图形…

阿里云服务器可以干嘛?能干啥你还不知道么!

阿里云服务器可以干嘛&#xff1f;能干啥你还不知道么&#xff01;简单来讲可用来搭建网站、个人博客、企业官网、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云百科aliyunbaike.com整理阿里云服务器的用途&#xff1a; 阿里云服务器活动 aliyunbaike.com…

Flutter学习12 - SharedPreferences

1、shared_preferences 插件 类似于 Android 中的 SharedPreferences&#xff0c;键值对的形式进行本地存储 1.1、引入插件 在 pubspec.yaml 中引入 dependencies:shared_preferences: ^2.1.0在需要用到的文件中引入 import package:shared_preferences/shared_preference…

二维相位解包理论算法和软件【全文翻译- 掩码(3.4)】

本节我们将研究从质量图中提取掩码的问题。掩码是一个质量图,其像素只有两个值:0 或 1。零值像素标志着质量最低的相位值,这些相位值将被屏蔽、零权重或忽略。第 5 章中的某些 L/ 正则算法需要使用掩码来定义零权重。掩码还可用于某些路径跟踪算法,如第 4.5 节中将要介绍的…

基于Springboot的美发管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的美发管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

秋招刷题4(动态规划)

1.购物单 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc new Scanner(System.in);int N sc.nextInt();int m sc.nextInt();Goods[] goods new Goods[m];for(int i 0; i < m; i){goods[i] new Goods();}for(int i …

9_springboot_shiro_jwt_多端认证鉴权_整合jwt

1. Shiro框架回顾 到目前为之&#xff0c;Shiro框架本身的知识点已经介绍完了。web环境下&#xff0c;整个框架从使用的角度我们需要关注的几个点&#xff1a; 要使用Shiro框架&#xff0c;就要创建核心部件securityManager 对象。 SpringBoot项目中&#xff0c;引入shiro-spr…

python小练习(ps:可评论区讨论)

1. (单选题)海龟初始坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;让海龟往坐标原点后方移动200像素的语句是 A. turtle.penup(200)B. turtle.fd(200)C. turtle.goto(200)D. turtle.bk(200) 2. (单选题)改变海龟画笔尺寸的是 A. turtle.penwidth()B. turtle.pen…

分类预测 | Matlab实现DRN深度残差网络数据分类预测

分类预测 | Matlab实现DRN深度残差网络数据分类预测 目录 分类预测 | Matlab实现DRN深度残差网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现DRN深度残差网络数据分类预测&#xff08;完整源码和数据&#xff09;&#xff0c;运行环境为Matl…

智能数据采集API技术在电子商务跨境电商数字化转型中的核心作用|API数据采集接口的核心应用

随着科技的飞速发展和全球化的深入推进&#xff0c;数字化转型已经成为企业和社会发展的必然趋势。在这一背景下&#xff0c;智能数据采集技术作为数字化转型的核心驱动力&#xff0c;正发挥着越来越重要的作用。本文将从智能数据采集技术的定义、特点、应用场景以及对企业的影…

MES实施之工控机和电脑的选择

在MES项目实施过程中,经常会碰到工控机和电脑的选型问题,那么他们的区别是什么? 1、控机和普通个人电脑(PC)相比,具有以下几个区别: 1.运行环境不同:工控机通常需要在各种恶劣的工业环境中运行,如高温、高湿、强电磁干扰等,因此需要具有防尘、防水、抗干扰等特点。而…

基于Spring Boot的简历系统设计与开发

基于Spring Boot的简历系统设计与开发 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 部分系统展示 前台首页界面 简历模板管理界面 用户管理界面 管理员登录界…

Debian12 使用 nginx 与 php8.2 使用 Nextcloud

最近将小服务器升级了下系统&#xff0c;使用了 debian12 的版本&#xff0c;正好试试 nginx 和 php-fpm 这种方式运行 Nextcloud 这个私有云的配置。 一、基本系统及应用安装 系统&#xff1a;debian12 x86_64 位版本最小安装&#xff0c;安装后可根据自己需求安装一些工具&…

代码随想录算法训练营Day15|二叉树Part02|层序遍历||226翻转二叉树||101对称二叉树

今日任务 层序遍历 看完本篇可以一口气刷十道题&#xff0c;试一试&#xff0c; 层序遍历并不难&#xff0c;大家可以很快刷了十道题。 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 226.翻转二叉树 &#xff08;优先掌握递归&#xff09; 这道题目 一些做过的同学 理解…

二维相位解包理论算法和软件【全文翻译- 质量分布图(3.3)】

在本节中,我们将定义几个在相位解包中非常有用的质量映射。质量图是定义给定相位数据中每个像素质量或好坏的数值数组。它们对于指导第 4 章将要介绍的几种路径跟踪算法是必要的,对于第 5 章将要介绍的一些加权 L^P-norm 算法也是必要的。 我们要讨论的第一个质量图是相关图,…

SpringBoot整合Netty整合WebSocket-带参认证

文章目录 一. VectorNettyApplication启动类配置二.WebSocketServerBoot初始化服务端Netty三. WebsocketServerChannelInitializer初始化服务端Netty读写处理器四.initParamHandler处理器-去参websocket识别五.MessageHandler核心业务处理类-采用工厂策略模式5.1 策略上下文 六…

CSS-属性

&#x1f4da;详见 W3scholl&#xff0c;本篇只做快速思维索引。 CSS 背景 用于定义元素的背景效果。 background-colorbackground-imagebackground-positionbackground-repeatbackground-attachment background-color background-color 属性指定元素的背景色。 h1 {back…

蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

思路&#xff1a; 1. 此题考查的冒泡排序中的交换次数&#xff0c;其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数&#xff0c;应当使每一位都不小于后面的字符&#xff0c;否则会造成一次逆序对的浪费&#xff08;贪心&#xff0c;为了使总位数最少&#xff…

c++ 指数搜索(Exponential Search)

该搜索算法的名称可能会产生误导&#xff0c;因为它的工作时间为 O(Log n)。该名称来自于它搜索元素的方式。 给定一个已排序的数组和要 搜索的元素 x&#xff0c;找到 x 在数组中的位置。 输入&#xff1a;arr[] {10, 20, 40, 45, 55} x 45 输出&#xff1a;在索…