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

news2024/11/17 2:54:09

🎈 博主:一只程序猿子

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

🎈 个人介绍:爱好(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的药膳食谱推荐系统,使用的是基于用户的协同过滤推荐算法。

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

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

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

相关文章

顺序表的应用之通讯录

学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

复现ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 项目代码https://github.com/THUDM/ChatGLM-6B 权重开放:…

VMware Workstation Pro 全屏模型隐藏上方命令栏

点击命令栏左侧的小图标&#xff0c;可以隐藏或固定命令栏。 如果要取消白线&#xff0c;参考&#xff1a; 虚拟机全屏后隐藏vmware菜单栏的问题

【KLEE】使用Docker安装KLEE KLEE的简单使用 KLEE的约束文件

本文架构 零、前言一、KLEE简介二、Docker安装KLEE1. 使用apt安装docker2.拉取klee镜像3.使用git 拉取klee源码4.安装klee镜像5. 运行镜像 三、试用KLEE的examples1.查看并了解待测文件examples/get_sign/get_sign.c2.KLEE进行符号测试的基本步骤编译成LLVM位码文件使用KLEE进行…

爬取微博热搜榜

需求&#xff1a; 利用python和xpath爬取微博热搜榜 步骤&#xff1a; 爬虫的步骤 获取网页数据-》分析网页数据-》提取网页数据。 1&#xff0c;首先获取微博热搜数据。 热搜主页为 https://s.weibo.com/top/summary?caterealtimehot 打开收&#xff0c;按F12获取网页源…

FebHost:墨西哥.MX域名概述

墨西哥&#xff0c;这片充满生机与历史的国度&#xff0c;以其丰富的文化传统、诱人的美食以及壮丽的自然景观吸引着世界各地的游客。从古老的阿兹特克和玛雅文明到现代都市的繁华街区&#xff0c;墨西哥为每一位访客和当地居民提供了一场视觉与感官的盛宴。 关于 .MX 域名 作…

特征值与特征向量的关系,Au=λu

特征值与特征向量的关系在线性代数中是一个核心概念&#xff0c;尤其在处理矩阵和线性变换时。给定一个矩阵 A A A&#xff0c;如果存在一个非零向量 u u u和一个标量 λ \lambda λ&#xff0c;使得 A u λ u Au \lambda u Auλu&#xff0c;那么我们就说 λ \lambda λ是矩…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …

【LeetCode】--- 动态规划 集训(二)

目录 一、63. 不同路径 II1.1 题目解析1.2 状态转移方程1.3 解题代码 二、931. 下降路径最小和2.1 题目解析2.2 状态转移方程2.3 解题代码三、174. 地下城游戏3.1 题目解析3.2 状态转移方程3.3 解题代码 一、63. 不同路径 II 题目地址&#xff1a; 不同路径 II 一个机器人位于…

2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2024年…

『VUE』13. Class绑定(详细图文注释)

目录 动态和静态类结合采用数组的方式引入数组语法的动态类名代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 首先样式类定义 <style> .active {font-size: 50px; } .text-danger {color: red; } </style&g…

一文带你理解完Git知识点

文章目录 Git基础概念Git基本操作**0. 初始化仓库****1. add到暂存区****2. 再commit到本地仓库****3. 推送到远程仓库****4. 拉取远程仓库****5. 撤销更改** Git分支管理1. 创建分支命令2. 切换分支命令3. 摘取提交4. 删除分支命令5. 合并分支命令6. 变基 Git进阶1. **git tag…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

五款户外运动耳机推荐,让你畅享户外运动时光

在繁忙的都市生活中&#xff0c;我们常常被各种琐事所困扰&#xff0c;以至于忘记了自然的美丽与宁静。然而&#xff0c;当我们走近大自然&#xff0c;放下心中的烦恼&#xff0c;我们会发现&#xff0c;自然是我们最好的治愈师。热爱自然的朋友们&#xff0c;这里有一份运动耳…

linux进阶篇:磁盘管理(一):LVM逻辑卷基本概念及LVM的工作原理

Linux磁盘管理(一)&#xff1a;LVM逻辑卷基本概念及LVM的工作原理 一、传统的磁盘管理 在传统的磁盘管理方案中&#xff0c;如果我们的磁盘容量不够了&#xff0c;那这个时候应该要加一块硬盘&#xff0c;但是新增加的硬盘是作为独立的文件系统存在的&#xff0c;原有的文件系…

怎么根据ip地址计算子网掩码

在计算机网络的世界中&#xff0c;IP地址和子网掩码扮演着至关重要的角色。IP地址用于标识网络中的每一台设备&#xff0c;而子网掩码则用于区分网络地址和主机地址&#xff0c;进而确定设备在网络中的具体位置。然而&#xff0c;有时我们可能需要根据已知的IP地址来计算子网掩…