博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈:
Python语言、Django框架、scrapy爬虫框架、Echarts可视化、下厨房网站爬虫数据

1)数据采集:
本应用采集目前的下厨房网站(https://www.xiachufang.com/)的食谱内容,对本周最受欢迎的食谱和新秀食谱进行爬取,对采集获得的食物制作方法数据进行初步处理,得到原始文本的食谱数据,包含了脱敏处理后的食谱名称、用料、做法、时间,食物图片等内容,根据分析的需要,从数据中抽取出“具体做法”一列。

2、项目界面

(1)推荐美食
在这里插入图片描述

(2)美食用料排行榜分析
在这里插入图片描述
(3)美食分类占比分析

在这里插入图片描述

(4)饮食科普

在这里插入图片描述

(5)美食分类
在这里插入图片描述

(6)美食详情信息
在这里插入图片描述

(7)美食详情做法
在这里插入图片描述

(8)后台数据管理

在这里插入图片描述

3、项目说明

1)数据采集:
本应用采集目前的下厨房网站(https://www.xiachufang.com/)的食谱内容,对本周最受欢迎的食谱和新秀食谱进行爬取,对采集获得的食物制作方法数据进行初步处理,得到原始文本的食谱数据,包含了脱敏处理后的食谱名称、用料、做法、时间,食物图片等内容,根据分析的需要,从数据中抽取出“具体做法”一列。
(2)数据预处理:
原始数据中存在异常值、重复值、系统自动推荐等数据,这部分数据价值含量低、数据结构混乱,严重影响数据挖掘模型的执行效率,导致挖掘结果的偏差,所以进行数据清洗是必不可少的。结合原始数据的具体情况,数据预处理采用文本去重、机械压缩去词和短句删除。
(3)中文分词及用户关注点:
中文分词是将句子中汉字按照序列切成一个个单独的中文词语,结巴词库提供了精确模式、全模式和搜索引擎模式三种分词模式,是Python中一个重要的第三方中文分词函数库。Jieba词库能够支持中文简体和繁体,在分析用户评论中能够对文本评论数据提取关键词。
用户关注点是用户对某一商品特定属性的关注点,反映客户在某种商品上的聚焦点,关注某一特性的用户数量越高,说明该商品的这一属性对用户来说越重要,一般是食谱标题、所用原料、具体做法、食物图片。分析利用Jieba词库,结合用户用词习惯,设置以“家常菜”、“快手菜”、“下饭菜”、”早餐”、“减肥”、“烘焙”、“小吃”、“汤羹”八个为用户常关注的属性。
(二)研究的方法:
⑴文献资料法:
利用图书馆以及互联网等方式查询相关的文献资料,梳理出相关的知识点,加以分析与研究。它是有目的、有计划、系统地收集有关研究对象的方法。
⑵调查法:
为了更好地了解食物推荐系统应用的发展以及真实现状,在同学、朋友、亲人以及路人等进行现场的询问,并做好记录,看观察对象对食物食材以及制作方面的喜好,根据现场调查,进行剖析,深入研究。
⑶分析归纳法:
研究分析查阅的文献资料,归纳总结其研究内容并合理分类。根据比较研究及案例分析的结果,总结归纳出食物推荐系统应用的发展中好的做法和经验。

4、核心代码


import scrapy
# from scrapy.downloadermiddlewares.retry import RetryMiddleware

keys = ['from_cat', 'from_link', 'cover_small', 'title', 'link', 'id', 'author', 'author_link', 'author_id', 'score', 'madeit',
        'components', 'author_avatar', 'cover_big', 'desc_html', 'categories', 'steps_text', 'ings', 'steps_html', 'tip']


class XiachufangSpider(scrapy.Spider):
    name = 'xiachufang'
    allowed_domains = []
    start_url = "https://www.xiachufang.com/category/"

    custom_settings = {
        "RETRY_HTTP_CODES": [429, 503],
        "RETRY_TIMES": 100,
    }

    def start_requests(self):
        yield scrapy.Request(self.start_url, callback=self.parse_categories)

    def parse_categories(self, response):
        for a in response.css('li[id^="cat"] > a'):
            cat = a.xpath("./text()").extract_first().strip()
            link = response.urljoin(a.xpath("./@href").extract_first())
            page = 1
            link_format = link+"?page={}"
            meta = dict(item=dict(from_cat=cat, from_link=link),
                        link=link_format, page=page)
            yield scrapy.Request(link, meta=meta, callback=self.parse_list)

    def parse_list(self, response):
        meta = response.meta

        for div in response.css("div.recipe"):
            item = dict(meta['item'])
            item['cover_small'] = div.xpath(
                ".//img/@data-src").extract_first() or div.xpath(".//img/@src").extract_first()
            item['title'] = div.xpath(
                './/p[@class="name"]/a/text()').extract_first().strip()
            item['link'] = response.urljoin(div.xpath(
                './/p[@class="name"]/a/@href').extract_first().strip())
            item['id'] = int(
                div.xpath('.//p[@class="name"]/a/@href').re_first("\d+"))
            item['author'] = div.xpath(
                './/p[@class="author"]/a/text()').extract_first().strip()
            item['author_link'] = response.urljoin(div.xpath(
                './/p[@class="author"]/a/@href').extract_first().strip())
            item['author_id'] = int(
                div.xpath('.//p[@class="author"]/a/@href').re_first("\d+"))
            item['score'] = float(div.xpath(
                './/span[@class="score bold green-font"]/text()').extract_first() or 0)
            item['madeit'] = int(div.xpath(
                './/span[@class="bold score"]/text()').extract_first() or 0)
            item['components'] = ';'.join(
                div.xpath('.//p[@class="ing ellipsis"]/*/text()').extract())
            meta['item'] = item
            yield scrapy.Request(item['link'], callback=self.parse_detail, meta=meta)

        # 翻页
        meta['page'] += 1
        url = meta['link'].format(meta['page'])
        yield scrapy.Request(url, meta=meta, callback=self.parse_list)

    def parse_detail(self, response):
        meta = response.meta
        item = dict(meta['item'])

        item['author_avatar'] = response.urljoin(
            response.css("div.author img::attr(src)").extract_first())
        item['cover_big'] = response.css(
            "div.cover.image > img::attr(src)").extract_first()
        item['desc_html'] = response.xpath(
            '//div[@class="desc mt30"]').extract_first()
        item['categories'] = ";".join(response.xpath(
            '//div[@class="recipe-cats"]/*/text()').extract())
        item['steps_text'] = response.xpath(
            '//meta[@name="description"]/@content').extract_first()
        item['ings'] = response.xpath(
            '//div[@class="ings"]').extract_first()
        item['steps_html'] = response.xpath(
            '//div[@class="steps"]').extract_first()
        item['tip'] = response.xpath(
            '//div[@class="tip"]').extract_first()
        yield item



5、项目获取

biyesheji0005  或  biyesheji0001   (绿色聊天软件)

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐