基于Django开发的图书管理推荐、电影推荐、课程推荐系统、大众点评店铺推荐系统、健身课程管理系统

news2024/12/25 9:05:57

基于Django开发的图书管理推荐、电影推荐、课程推荐系统、大众点评店铺推荐系统、健身课程管理系统、资讯推荐系统

一、简介

推荐系统的目的是信息过载所采用的措施,面对海量的数据,从中快速推荐出用户可能喜欢的物品。

推荐系统的方法有以下几种:

1、基于物品协同过滤,即利用物品与用户的特征信息,给用户推荐那些具有用户喜欢的特征的物品(基于用户行为数据,例如点击、浏览、收藏、购买、评论等);

2、基于用户协同过滤,即利用和用户相似的其他用户,给用户推荐那些和他们兴趣爱好相似的其他用户喜欢的物品(基于用户信息例如:个人信息,喜好标签,上下文信息);

3、基于机器学习协同过滤,即把用户注册时选择的类型分成不同的聚类,然后新用户注册时根据选择的类型归类,再把该类型的典型物品推荐给新用户。

简单概括:知你所想,物以类聚,人以群分。

二、Demo

1、图书管理系统

可参考网站,点我跳转
在这里插入图片描述

2、电影推荐系统

可参考网站,点我跳转

在这里插入图片描述

3、课程推荐系统

可参考网站,点我跳转
在这里插入图片描述

三、实现流程

1、搭建开发环境

这个环节包括创建虚拟环境、创建Django项目、创建数据库、设计表模型、爬取数据、UI界面功能。

2、创建虚拟环境

python解释器使用3.7,MySQL使用5.7,Django使用3版本以上,前端采用Django后端渲染,后台管理使用xadmin版本3。

常用命令:

python -m venv book_manager
django-admin startproject book_manager
python manage.py startapp book
python manage.py makemigrations
python manage.py migrate
python manage.py createcachetable
python manage.py collectstatic
python manage.py createsuperuser
python manage.py runserver

创建数据库使用图形化工具Navicat,字符集使用utf8mb4
在这里插入图片描述

3、表(模型)设计

常用的表有:用户表、图书表、标签表、用户选择类型表、借阅表、购物车、评分表、收藏表、点赞表、评论表、评论点赞表、搜索关键字表。
在这里插入图片描述

4、获取数据

获取数据可以通过爬虫实现,比如图书管理系统,先到网上找一个图书网站,分析每个页面的特征,然后编程把图书爬下来,

1)基础页面

2)获取各类别url

3)获取总页数

4)获取具体数据

5)保存图片、保存数据

代码示例:

import json
import time
import urllib.request, urllib.error  # 制定url,获取网页数据
from bs4 import BeautifulSoup  # 网页解析,获取数据
from fake_useragent import UserAgent  # 随机请求头


# URL的网页内容
def ask_url(url):  # 模拟浏览器头部信息,向服务器发送消息
    count = 0
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"
    }  # 用户代理:表示告诉目标服务器,我们是什么类型的机器;浏览器:本质上告诉服务器,我们能够接收什么水平的内容
    while count < 10:
        request = urllib.request.Request(url, headers=head)
        try:
            response = urllib.request.urlopen(request, timeout=20)  # 传递封装好的request对象,包含所访问的网址和头部信息
            html = response.read().decode("utf-8")
            return html
        except Exception as e:
            print('第{}次请求报错'.format(count), e)
            head = {"User-Agent": UserAgent().random}
            count += 1
    return


def save_img(url, name):
    # 保存图片
    filename = 'media/book_cover/{}.jpg'.format(name)
    count = 0
    head = {
        "Content-type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36",
    }
    while count < 10:
        try:
            request = urllib.request.Request(url, headers=head)
            response = urllib.request.urlopen(request, timeout=10)
            with open(filename, 'wb') as f:
                f.write(response.read())
            return True
        except Exception as e:
            print('第{}次爬取【{}】图片出错'.format(count, name), e)
            head = {"User-Agent": UserAgent().random}
            count += 1
    return False


def save_txt(data):
    # 保存为txt文件
    with open('book.txt', 'a') as f:
        f.write(json.dumps(data))
        f.write('\r\n')


def read_txt():
    # 读取txt文件
    data_list = []
    with open('book.txt', 'r') as f:
        for data in f.readlines():
            if data != '\n' and data not in data_list:
                data_list.append(json.loads(data))
    return data_list


def get_data(url):
    # 获取数据
    # print('url',url)
    html = ask_url(url)
    if not html:
        return
    soup = BeautifulSoup(html, "html.parser")
    d_dict = {}
    div = soup.find('div', id='book_info')
    if not div:
        return {}
    d_dict['标题'] = div.find('h2').text
    content = div.find('div', class_='intro')
    text = ''
    ps = content.find_all('p')
    for p in ps:
        text += '<p>'
        text += p.text
        text += '</p>'

    d_dict['内容'] = text.replace('\xa0', '')
    # 获取作者、翻译、标签
    infos = div.find_all('h4')
    author = ''
    for info in infos:
        key = info.text.split(':')[0]

        values = []
        for a in info.find_all('a'):
            if key == '标签' and a.text == author:
                continue
            values.append(a.text)

        if key == '作者' and values:
            author = values[0]
        d_dict[key] = values

    time.sleep(0.5)
    return d_dict


def get_pages(url):
    # 获取总页数
    html = ask_url(url)
    if not html:
        return
    soup = BeautifulSoup(html, "html.parser")
    # 获取总页数
    for a in soup.find_all('a', class_='other'):
        if a.text == '尾页':
            pages = int(a.attrs['href'].split('page=')[1])
            print('总页数', pages)
            return pages
    return 1


def get_page_urls(url):
    # 获取每一页中各图书的url
    html = ask_url(url)
    if not html:
        return
    soup = BeautifulSoup(html, "html.parser")

    urls = []
    ul = soup.find('ul', id='list_box').find_all('li')
    if not ul:
        return []
    for li in ul:
        url = li.find('a', class_='Aimg').attrs['href']
        img = 'http:{}'.format(li.find('img').attrs['src'])
        code = url.split('book')[1].replace('/', '').replace('index.htm', '')
        save_img(img, code)  # 保存图片
        urls.append([url, code])
        time.sleep(0.4)
    return urls


def get_type_urls(url):
    # 获取各类别url
    html = ask_url(url)  # 获取页面
    if not html:
        return
    soup = BeautifulSoup(html, "html.parser")
    ul = soup.find('ul', class_='type_box').find_all('li')  # 查找类元素为type_box的ul标签
    urls = {}
    for li in ul:
        # 通过正则匹配获取所有li标签中的href值
        urls[li.text.replace('\n', '').replace('\t', '')] = li.a.attrs['href']
    time.sleep(0.5)
    return urls


def get_all_data(baseurl):
    # 获取页面图书url
    d_list = []
    # 获取各类别的url
    urls = get_type_urls(baseurl)
    if not urls:
        return
    time.sleep(1)
    count = 1
    for name, url in urls.items():
        print('爬取 {} 的数据'.format(name))
        time.sleep(0.5)
        pages = get_pages(url) + 1
        if not pages:
            continue

        for page in range(1, pages):
            time.sleep(0.5)
            page_url = '{}&page={}'.format(url, page)
            book_urls = get_page_urls(page_url)  # 获取类别下的图书url
            if not book_urls:
                continue

            for pu in book_urls:
                time.sleep(0.2)
                d_dict = get_data(pu[0])
                if not d_dict:
                    continue
                d_dict['code'] = pu[1]
                save_txt(d_dict)  # 保存数据
                print('第{}本'.format(count), d_dict)
                count += 1
                d_list.append(d_dict)
                time.sleep(0.5)

    return d_list


def main(baseurl):
    '''
    :param baseurl:
    :return:
    '''
    get_all_data(baseurl)


if __name__ == '__main__':
    # 爬取的页面地址
    baseurl = '基础页面'
    main(baseurl)
5、UI界面功能

登录:
在这里插入图片描述

人脸识别登录:
在这里插入图片描述

注册:
在这里插入图片描述

首页、新书速递、热门书籍、图书分类、猜你喜欢:
在这里插入图片描述

购物车:
在这里插入图片描述

个人中心:

在这里插入图片描述

数据分析:
在这里插入图片描述

协同算法图像对比:
在这里插入图片描述

6、后台管理

使用xadmin库对数据进行后台管理,界面如下:
在这里插入图片描述

四、后记

总体上,一个推荐系统就开发出来了,整个开发过程中收获还是很多的,使用到的知识点也是很多,对django、爬虫、图表、推荐算法都能够熟练掌握。

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

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

相关文章

顺序栈的实现----数据结构

栈的概念 对于栈&#xff08;Stack&#xff09;&#xff0c;后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;&#xff0c;栈也是一种线性表&#xff0c;只不过是一种操作受限的线性表&#xff0c;只能在一端操作&#xff0c;也就是不允许在中间进行查找、…

javaEE -4(11000字详解多线程)

一&#xff1a;常见的锁策略 1.1 乐观锁 vs 悲观锁 乐观锁和悲观锁是并发控制的两种不同策略&#xff0c;用于处理多个线程同时访问共享资源的情况。它们的主要区别在于对并发冲突的处理方式。 悲观锁是一种较保守的并发控制策略&#xff0c;它假设在整个事务过程中会发生冲…

什么是云迁移?迁移到云的基本指南

企业可以执行多种类型的云迁移。一种常见的模型是将数据和应用从本地数据中心传输到公共云。然而&#xff0c;云迁移还可能需要将数据和应用从一个云平台或提供商迁移到另一个云平台或提供商;这种模式称为云到云(C2C)迁移。第三种类型的迁移是反向云迁移、云遣返或云退出&#…

如何提高webpack的构建速度?

一、背景 随着我们的项目涉及到页面越来越多&#xff0c;功能和业务代码也会随着越多&#xff0c;相应的 webpack 的构建时间也会越来越久 构建时间与我们日常开发效率密切相关&#xff0c;当我们本地开发启动 devServer 或者 build 的时候&#xff0c;如果时间过长&#xff…

Linux下的IMX6ULL——环境搭建与软件安装(一)

前言&#xff1a; 从今天开始我们就要用到IMX6ULL这块开发板进行linux的学习了&#xff0c;对于初学者&#xff0c;下载好资料、搭建好开发环境后&#xff0c;按照下面顺序学习即可&#xff1a; 先应用&#xff0c;再驱动&#xff0c;最后做项目。应用、驱动、项目这三个慢慢走…

酷开科技丨大屏购物买买买,酷开系统助力网购模式再升级

随着技术的发展和家庭场景智能化的趋势&#xff0c;消费者对品质和体验的需求不断提高。在这一背景下&#xff0c;OTT大屏营销生态得到了快速发展&#xff0c;大屏的购物功能进一步被释放&#xff0c;已经具备更强的“转化”能力。电视的智能化、交互简单化、账号同步化等特性使…

如何利用验证链技术减少大型语言模型中的幻觉

一、前言 随着大型语言模型在自然语言处理领域取得了惊人的进步。相信深度使用过大模型产品的朋友都会发现一个问题&#xff0c;就是有时候在上下文内容比较多&#xff0c;对话比较长&#xff0c;或者是模型本身知识不了解的情况下与GPT模型对话&#xff0c;模型反馈出来的结果…

Linux基础指令(二)

目录 前言 1. which 2. alias 3. cat 3.1 echo指令 3.2 输出重定向 3.3 cat指令 3.4 * cat其他用法 4. more指令 5. less指令 6.head指令 7. tail 指令 8. 时间相关的指令 9. cal指令 总结 前言 Linux环境下的指令本质是一组可执行的命令&#xff0c;它们被编写成可…

商家在哪里可以制作小程序抽奖活动

在当今数字化时代&#xff0c;小程序已经成为一种普及且高效的营销工具。对于商家而言&#xff0c;利用小程序开展抽奖活动是一种极具吸引力的营销策略。本文将详细介绍商家如何创建小程序抽奖活动&#xff0c;并阐述其带来的营销效果。 一、明确活动目的与方案 在开始制作小程…

图纸管理制度《一》

在不断进步的时代&#xff0c;我们都跟制度有着直接或间接的联系&#xff0c;制度一般指要求大家共同遵守的办事规程或行动准则&#xff0c;也指在一定历史条件下形成的法令、礼俗等规范或一定的规格。那么什么样的制度才是有效的呢? 彩虹图纸管理软件_图纸管理系统_图纸文档管…

浅析 C# Console 控制台为什么也会卡死

一&#xff1a;背景 1. 讲故事 在分析旅程中&#xff0c;总会有几例控制台的意外卡死导致的生产事故&#xff0c;有经验的朋友都知道&#xff0c;控制台卡死一般是动了 快速编辑窗口 的缘故&#xff0c;截图如下&#xff1a; 虽然知道缘由&#xff0c;但一直没有时间探究底层…

【C++】不是用new生成的对象调用析构函数

2023年10月23日&#xff0c;周一上午 #include <iostream>class Book{ private:int price; public:~Book(){std::cout<<"调用析构函数"<<std::endl; } };int main(){Book b1;b1.~Book(); } 从运行结果可以看出&#xff1a; 手动调用b1.~Book()时&…

众和策略:题材股什么意思?

题材股是股票商场上的一个术语&#xff0c;许多刚接触股票出资的人可能对它不太熟悉。那么&#xff0c;题材股什么意思呢&#xff1f;在本文中&#xff0c;咱们将从多个角度剖析这个问题&#xff0c;帮忙读者更好地了解。 一、什么是题材股 题材股是指某个工作或主题的股票集结…

redis缓存基本使用和缓存问题解决

一、缓存 1、缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而 db 承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; &#xff08;1&#xff09;即时性、数据一致性要求不高的 &#xff08;2&#xff09;访问量大且更…

面试官:说说Loader和Plugin的区别?

一、区别 前面两节我们有提到Loader与Plugin对应的概念&#xff0c;先来回顾下 loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的…

抛硬币有连续x次正面的期望

首先来看期望的基本公式 其中x是抛x次&#xff0c;p是在抛第x次后出现连续正面的概率 先来看出现1次正面的期望 按照公式来算是 抛1次 1/2的概率 抛2次 1/4的概率 抛3次 1/8的概率... 我们可以写一个程序试一下 signed main() {ios_base::sync_with_stdio(0); cin.tie(0…

企业需要拓展出海业务?CRM为您保驾护航(下)

2022年企业似乎格外艰难&#xff1a;线上流量看似见顶&#xff0c;线下受疫情影响严重&#xff0c;展会推迟&#xff0c;出差受阻&#xff0c;增长乏力沦为常态。为了寻求增长&#xff0c;一批又一批企业将目光看向海外&#xff0c;那里尚有流量红利和增长空间等待挖掘。CRM客户…

解码Java的垃圾回收:掌握GC机制,提升代码的稳定性与可伸缩性

1. GC是什么 JVM垃圾收集(Java Garbage Collection ) GC采用分代收集算法&#xff1a; 次数上频繁收集Young区次数上较少收集Old区基本不动Perm区 2. GC 算法总体概述 JVM在进行GC时&#xff0c;并非每次都对上面三个内存区域一起回收的&#xff0c;大部分时候回收的都是指…

【milkv】internal codec -- mic

文章目录 一、硬件二、dts三、配置引脚board_initpin 四、makefile五、config六、添加tinyalsa七、测试结果7.1 查看录制device信息7.2 录制音频7.3 pc端获取录制好的设备7.4 使用audacity查看波形 一、硬件 i2s0 —— adc i2s1 —— pdm i2s3 —— dace spk_en存疑 i2s2 ——…

Git常用的命令有哪些?

一、前言 git 的操作可以通过命令的形式如执行&#xff0c;日常使用就如下图6个命令即可 实际上&#xff0c;如果想要熟练使用&#xff0c;超过60多个命令需要了解&#xff0c;下面则介绍下常见的的git 命令 二、有哪些 配置 Git 自带一个 git config 的工具来帮助设置控制…