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 += i
        for i in info.xpath('./div[2]//text()'):
            content += i

        title = 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.content

    return 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'] = type
            shipu['cname'] = cname
            shipu['img_name'] = img_name
            shipu['details'] = details
            shipu['create_time'] = create_time
            print(shipu)
            DBHelper().saveItem(img_content, img_name, shipu)
            time.sleep(1)
        # 获取下一页菜单url
        next_page_url = 'https://www.xinshipu.com' + get_next_page(url)

        if next_page_url not in all_page_list:
            url = next_page_url
            all_page_list.append(url)
        else:
            print('该菜谱所有页面的url已获取完毕')
            break

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

5.效果展示

6.拓展

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二十五周代码(蓝桥杯查缺补漏)

2024/03/31 周日 填充 题目链接 【参考代码】 想用暴力&#xff0c;没过 //枚举&#xff0c;未出结果QAQ #include <bits/stdc.h> using namespace std; string s00 "00"; string s11 "11"; int ans 0; //m个问号&#xff0c;子串有2^m…

C#探索之路基础夯实篇(4):UML类图中的六种关系详细说明

文章目录 UML类图中的关系前景1、关联关系&#xff08;Association&#xff09;&#xff1a;2、聚合关系&#xff08;Aggregation&#xff09;&#xff1a;3、组合关系&#xff08;Composition&#xff09;&#xff1a;4、泛化关系&#xff08;Generalization&#xff09;&…

计算机网络——37认证

认证 目标&#xff1a;Bob需要Alice证明他的身份 Protocol ap1.0&#xff1a;Alice说"A am Alice" 可能出现的问题&#xff1a; 在网络上Bob看不到Alice&#xff0c;因此Trudy可以简单的声称他是Alice 认证&#xff1a;重新尝试 Protocol ap2.0&#xff1a;Alice…

12.自定义的多帧缓存架构

1.简介 在数字图像处理中&#xff0c;经常需要用到的一个架构就是多帧缓存。视频流中需要用到多帧缓存来防止帧撕裂现象&#xff0c;图像处理中也需要帧差法来做移动目标检测。因此一个多帧缓存架构在图像系统的设计中是十分重要的。 2.多帧缓存 在视频流中&#xff0c;通常不…

数据库 06-03 时间戳

01.什么是时间戳 “时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 02.用时间戳实现调度 定义 数据库给予一个事务一个时…

用友U9 存在PatchFile.asmx接口任意文件上传漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 用友U9是由中国用友软件股份有限公司开发的一款企业…

前端学习笔记:display(未完成)

这是本人学习的总结&#xff0c;主要学习资料如下 目录 1、一般属性2、flex系列2.1、flex容器的维度2.2、flex其他的关联属性 – 1、一般属性 display是css中的一个重要属性&#xff0c;它的值基本决定了元素的布局。这里就对它的值如何影响元素布局做一个总结。 display:bl…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (e)

接上文&#xff0c;继续来看这个函数&#xff1a; /*** brief Initializes the GPIOx peripheral according to the specified* parameters in the GPIO_InitStruct.* param GPIOx: where x can be (A..G) to select the GPIO peripheral.* param GPIO_InitStruct:…

【环境变量】常见的环境变量 | 相关指令 | 环境变量系统程序的结合理解

目录 常见的环境变量 HOME PWD SHELL HISTSIZE 环境变量相关的指令 echo&env export unset 本地变量 环境变量整体理解 程序现象_代码查看环境变量 整体理解 环境变量表 环境变量表的传递 环境变量表的查看 测试验证 少说废话&#x1f197; 每个用户…

JavaScript 设计模式之代理模式

代理模式&#xff0c;代理&#xff08;proxy&#xff09;是一个对象&#xff0c;它可以用来控制对另一个对象的访问。 现在页面上有一个香港回归最想听的金典曲目列表&#xff1a; <ul id"container"><li>我的中国心</li><li>东方之珠<…

C# 使用共享文件生成项目

项目文件中添加共享文件 <ItemGroup><Compile Include"..\Shared\Interfaces\Services\ITextService.cs" Link"Interfaces\Services\ITextService.cs" /><Compile Include"..\Shared\Services\TextService.cs" Link"Service…

C++高频面试知识总结 part2

C高频面试 1.sizeof是什么&#xff1f;sizeof一个class大小怎么确定&#xff1f;是在编译期还是在运行期确定?2.函数重载的机制&#xff0c;重载是在编译期还是在运行期确定&#xff0c;重载有额外开销吗3.函数重写在编译还是运行时确定&#xff1f;4.如何找到虚函数表&#x…

【数据结构与算法】力扣 24. 两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4] 输出&#…

go | gin 重定向路由重定向

web 重定向 重定向有一点要注意&#xff0c;重定向是在客户端那边执行的&#xff0c;一次服务器只能响应一次请求。但是要注意路由重定向 路由重定向是在服务器内部完成重定向资源请求 package mainimport ("github.com/gin-gonic/gin""fmt" )/* func main…

C语言自定义类型变量——枚举(enum)

一.枚举的定义和声明 字面意思&#xff0c;枚举就是一一列举&#xff0c;把可能的取值一一列举&#xff0c;在我们现实生活中有许多可以列举的事物&#xff0c;例如&#xff1a;一周七天&#xff0c;一年四季&#xff0c;性别&#xff0c;月份&#xff0c;三原色等等。当我们需…

【SpringCloud】Nacos 注册中心

目 录 一.认识和安装 Nacos1.Windows安装1. 下载安装包2. 解压3. 端口配置4. 启动5. 访问 2.Linux安装1. 安装JDK2. 上传安装包3. 解压4. 端口配置5. 启动 二.服务注册到 nacos1. 引入依赖2. 配置 nacos 地址3. 重启 三.服务分级存储模型1. 给 user-service 配置集群2. 同集群优…

Spring Boot-01-通过一个项目快速入门

官方参考文档&#xff1a;Spring Boot Reference Documentation 0. 概述 Spring的缺点&#xff1a; 1. 配置繁琐&#xff1a;虽然Spring的组件代码是轻量级&#xff0c;但它的配置却是重量级的。 2. 依赖繁琐&#xff1a;项目的依赖管理也是一件耗时耗力的事情。分析要导入哪…

在单交换机局域网中,不同网段的主机通信探秘

在理解局域网中不同网段主机之间的通信之前&#xff0c;我们首先要明白网络的基本组成和工作原理。局域网&#xff08;LAN&#xff09;是一个封闭的网络环境&#xff0c;通常由交换机&#xff08;Switch&#xff09;作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机…

C语言 | Leetcode C语言题解之第13题罗马数字转整数

题解&#xff1a; 题解&#xff1a; int romanToInt(char* s) {int symbolValues[26];symbolValues[I - A] 1;symbolValues[V - A] 5;symbolValues[X - A] 10;symbolValues[L - A] 50;symbolValues[C - A] 100;symbolValues[D - A] 500;symbolValues[M - A] 1000;int a…

天龙八部_暗黑机制_人面桃花_单机架设搭建

一. 搭建成功视频演示 天龙八部_暗黑机制_人面桃花_单机架设搭建 二. 一些文件截图 完整教程和搭建文件获取: https://githubs.xyz/y24.html 三. 搭建步骤 安装虚拟机虚拟机打开一键端&#xff0c;然后登录root&#xff0c;密码&#xff1a;123456启动./run 脚本 &#xff0…