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,一经查实,立即删除!

相关文章

C++ 【填充书架】

填充书架 dp[ i ] 放下第i 本书的最小高度 递推公式&#xff1a;要放第 i 本书的时候 假定前面有 j 本书在书架上&#xff0c;j<i &#xff0c;【 j - i 】之间的书作为最上层的&#xff0c;算出最上层书的最小层数 本题的目的是划分成多个子数组&#xff0c;这类问题&a…

前端学习之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…

搜索(DFS BFS)

DFS 常规DFS: 二叉树前序,中序&#xff0c;后序遍历-CSDN博客 void postorderTraversal(root)初始化一个空列表 arrfind访问总树(root,arr)return arrvoid find(temp, arr)if temp 为空return // 调用顺序由前中后序决定find递归访问左子树find递归访问右子树arr加入当前节点…

深入了解Flutter中的Sealed Class及其使用

Flutter Sealed Class 简介 Sealed Class 是 Dart 3 中引入的一个新特性&#xff0c;它允许您创建一组有限且封闭的类层次结构。这意味着&#xff1a; Sealed 类只能在其定义所在的同一文件中扩展。所有可能的子类在编译时都必须已知。 Sealed Class 的主要优点是&#xff1…

浅谈Redis和一些指令

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

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

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

速盾:cdn防止dns劫持原理

CDN&#xff08;内容分发网络&#xff09;在防止DNS劫持方面的原理主要有以下几个方面&#xff1a; 域名解析多级验证&#xff1a;CDN会在DNS服务器上设置多级域名解析验证。当用户请求访问一个网站时&#xff0c;CDN会首先从DNS服务器获取到域名的IP地址&#xff0c;并验证该I…

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 节中将要介绍的…

人工智能时代呼唤科技与创新成为新榜样

人工智能时代呼唤科技与创新成为新榜样 雷军&#xff0c;好久不见&#xff01;这两天&#xff0c;你的出现仿佛为商业界注入了一股清流&#xff0c;让我深感欣慰。尽管你的目的或许只是为了推广产品&#xff0c;但你确实在这个充斥着各种卖货、卖情怀和卖道德的商业大潮中&…

基于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 …

浏览器、网页及JS脚本详解

一、交互关系 当我们谈论浏览器、网页以及JavaScript代码的交互关系时&#xff0c;我们其实是在讨论现代网络应用的基石。这一主题涵盖了浏览器的内部工作机制、HTML、CSS、JavaScript之间的相互作用&#xff0c;以及这些技术是如何共同塑造用户体验的。接下来的探讨将深入这一…

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;正发挥着越来越重要的作用。本文将从智能数据采集技术的定义、特点、应用场景以及对企业的影…

初识Android 属性

属性是存储在系统共享内存中的一个个key:value键值对&#xff0c;主要有以下作用: 提供系统公共的信息进程间通讯作为rc文件的触发器&#xff0c;用于行为控制 提供系统公共属性 比如获取SDK版本&#xff0c;获取系统语言其实都是通过系统属性得到的 ro.build.version.sdk30…

golang变量初始化顺序

顺序&#xff1a; 1.引用的包 2.全局变量 3.init()函数 4.main()函数 package pkgimport "fmt"func init() {fmt.Println("pkg init") }package mainimport ("fmt"_ "gg/pkg" )var v val()func val() int {fmt.Println("func()…

React Native调用Android的原生功能

React Native 通过 JavaScript 接口与原生代码通信&#xff0c;这是通过名为 Bridge 的机制实现的。Bridge 负责在 JavaScript 和原生端之间建立通信桥梁。 以下是调用 Android 原生功能的基本步骤&#xff1a; 在 JavaScript 中&#xff0c;使用 React Native 提供的模块创建…