基于Django开发的推荐系统与数据分析系统

news2025/1/14 19:54:18

基于Django开发的推荐系统与数据分析系统

一、简介

已开发的的推荐系统:图书管理系统、电影推荐系统、在线选修课程推荐系统、健身推荐系统、资讯推荐系统;

已开发的数据分析系统:大众点评店铺数据分析系统

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

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

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

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

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

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

基于大众点评的店铺数据分析系统:可视化大屏,柱状图,饼状图,折线图,词云等。

二、Demo

1、图书管理系统

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

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

2、电影推荐系统

可参考网站,点我跳转

在这里插入图片描述

3、课程推荐系统

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

4、健身课程推荐系统

在这里插入图片描述

5、健康资讯推荐系统

在这里插入图片描述

6、大众点评店铺数据分析系统

在这里插入图片描述

三、实现流程

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/1127552.html

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

相关文章

rockchip 3588 HDMI avmute

概述 HDMI (High-Definition Multimedia Interface) 是一种数字接口标准&#xff0c;用于传输高清视频和多通道音频信号。AVMUTE 是 HDMI 规范中的一个术语&#xff0c;表示"Audio-Video Mute"&#xff08;音视频静音&#xff09;。AVMUTE 通常与 HDMI 设备的音频和…

提高Java程序性能!了解可达性分析算法、强软弱虚引用和三色标记GC的过程,避免不可达对象阻碍程序性能!

文章目录 &#x1f34a; 可达性分析算法&#x1f34a; 强软弱虚引用&#x1f389; 强引用&#x1f389; 软引用&#x1f389; 弱引用&#x1f389; 虚引用 &#x1f34a; 不可达对象GC的过程&#x1f389; GC中不可达对象的回收过程&#x1f4dd; 1. 标记阶段&#x1f4dd; 2. …

远程IO模块物联网应用提高工业自动化生产效率

远程IO模块是一款常用于工业自动化领域的通讯设备&#xff0c;它可以实现远程监测&#xff0c;帮助企业更加有效地掌控生产状态&#xff0c;提高生产效率。远程IO模块的作用是将分散的输入输出信号集中管理&#xff0c;实现实时数据采集、传输与控制。 远程IO模块通过安装在设…

Windows / Ubuntu 连wifi,网线连接旭日X3派以共享网络

首先&#xff0c;PC电脑连好wifi Windows 找到【控制面板->网络和Internet->网络和共享中心->查看网络状态和任务->更改适配器设置】 找到WLAN&#xff0c;右键【属性->共享】勾上允许&#xff0c;然后【确定】。 Ubuntu 打开设置&#xff0c;找到有线设置…

2024SCI经验心得分享---如何在零基础、导师基本放养的情况下---发表自己的第一篇SCI(三区)经验分享篇

本期的经验分享&#xff0c;采访到了我的一位非常非常非常优秀的师妹&#xff0c;师妹于今年6月份投稿&#xff0c;10月份录用&#xff0c;历时四个月录用了自己的第一篇SCI&#xff08;三区&#xff09;的文章图像处理类的&#xff0c;同时师妹也取得了很多其他优秀的荣誉。 众…

Python数据结构(栈)

Python数据结构&#xff08;栈&#xff09; 栈(stack)&#xff0c;有些地方称为堆栈&#xff0c;是一种容器&#xff0c;可存入数据元素、访问元素、删除元素&#xff0c;它的特点在于只能允许在容器的一端(称为栈顶端指标&#xff0c;英语: top)进行加入数据(英语: push)和输…

手撕Vue-实现计算属性

前言 经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方&#xff0c;这个我们已经撕完了。接下来要实现的是计算属性&#xff0c;计算属性的实现原理是通过 Object.defineProperty() 来实现的&#xff0c;我们先来看看计算属性的使用。 看之前先来改造一下我们的代码基础…

DevExpress WinForms地图组件 - 轻松集成地图功能到应用程序

DevExpress WinForms地图控件允许您在WinForms应用程序中合并地图服务&#xff0c;您可以选择现有的地图资源&#xff0c;如如Bing或OpenStreetMap&#xff0c;或者在公司网络中创建自己的地图数据服务器。DevExpress WinForms地图控件完全支持矢量和笛卡尔坐标地图。 DevExpr…

Plex踩坑——移动缓存目录

plex在生成缩略图、刮削视频的时候会生成大量的缓存文件&#xff0c;占用磁盘空间。 plex默认缓存存储位置为C:\Users\xxx\AppData\Local\Plex Media Server&#xff0c;并且这个路径在plex设置中无法更改。 可以通过修改注册表的方式修改该路径。 首先推出plex账号&#xff…

学习视觉CV Transformer (1)--Transformer介绍

先放Transformer的经典文章 Attention Is All You Need 论文代码&#xff1a;https://paperswithcode.com/paper/attention-is-all-you-need Transformer结构是google在17年的Attention Is All You Need论文中提出&#xff0c;首先主要是在自然语言处理NLP方面应用&#xff0c…

万物“邮”爱,百余志愿者参与邮票艺术共创助力生物多样性

邮票作为生动形象的文化载体&#xff0c;传承着中华文化的历史和文明。自邮票问世以来&#xff0c;就以其精美的设计和图案&#xff0c;成为人们珍藏文化遗产和学习历史文化的窗口。野生动物保护一直是人们所关注的热门话题&#xff0c;相关部门也为宣传、拯救、保护珍贵濒危野…

[量化投资-学习笔记001]Python+TDengine从零开始搭建量化分析平台-数据存储

目录 0. 简介1. 获取交易数据2. 数据库搭建2.1. 数据库安装2.2. 创建数据库2.3. 创建超级表2.4. 创建子表 3.数据导入4. Grafana 安装4.1. 安装Grafana4.2. 安装TDengine插件 附件数据导入脚本历史交易数据-1分钟K线 0. 简介 Python&#xff1a;最常用的量化分析语言&#xff0…

【超参数研究02】使用随机搜索优化超参数

一、说明 在神经网络训练中&#xff0c;超参数也是需要优化的&#xff0c;然而在超参数较多&#xff08;大于3个&#xff09;后&#xff0c;如果用穷举的&#xff0c;或是通过经验约摸实现就显得费时费力&#xff0c;无论如何&#xff0c;这是需要研究、规范、整合的要点&#…

【自用】知识点梳理 自动控制第Z章 离散s

目录标题 离散XXXQ1 离散化的表达式和传递函数怎么匹配上&#xff1f; 离散系统的分析与校正Q ZOH有什么作用K ZOH的Z变换✨K Z变换表格模拟化矫正ZOH的等效Q 为什么离散化之后幅值会变化&#xff1f;Q 模拟化校正中ZOH环节为什么需要等效成惯性环节&#xff1f; 离散化的方法Q…

Android dumpsys介绍

文章目录 一、需求二、环境三、相关概念3.1 dumpsys3.2 Binder3.3 管道 四、dumpsys指令的使用4.1 dumpsys使用4.2 dumpsys指令语法 五、详细设计5.1 dumpsys流程图5.2 dumpsys查看电池信息5.2.1 dumpsys battery指令5.2.2 service->dump打印函数 5.3 dumpsys源码分析5.3.1 …

[support2022@cock.li].faust、[tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复

引言&#xff1a; 威胁网络安全的恶意软件不断涌现&#xff0c;而[support2022cock.li].faust勒索病毒则是其中的一员。这个网络黑暗角落的新星&#xff0c;以其数据绑架的方式&#xff0c;一度成为数据安全的威胁焦点。本文将探究[support2022cock.li].faust勒索病毒的运作方…

Cypress的安装与启动

目录 一&#xff1a;Cypress介绍 二&#xff1a;安装与使用 1、下载node.js 2、安装Cypress 3、启动Cypress 3、解决异常 三&#xff1a;总结 一&#xff1a;Cypress介绍 Cypress 是为现代网络而构建的下一代前端测试工具&#xff0c;用于解决开发者和 QA 工程师在测试现…

【Hydro】水文模型比较框架MARRMoT - 包含47个概念水文模型的Matlab代码

目录 说明源代码运行实例workflow_example_1.mworkflow_example_2.mworkflow_example_3.mworkflow_example_4.m 测试1、 结构体兼容性问题2、append的兼容性问题3、修改后的MARRMoT_model.m 说明 MARRMoT是一个新的水文模型比较框架&#xff0c;允许不同概念水文模型结构之间的…

BandZip 免费纯净快速的文件压缩/解压缩软件

BandZip 功能齐全、性能优异的免费文件压缩和解压缩工具。版本 7.x 及以上有广告&#xff0c;安装 7.x 以下版本即可。 功能以及特性 支持多种常见的压缩格式&#xff0c;包括 ZIP、RAR、7Z、TAR 等&#xff1b;高效的压缩算法&#xff0c;能够将文件压缩到较小的体积&#…

【网络安全 --- 任意文件下载漏洞(1)】任意文件下载漏洞

一&#xff0c;环境&#xff0c;工具准备 1-1 VMVare 16 虚拟机及下载安装&#xff08;资源&#xff09; 请参考以下博客安装&#xff08;特详细&#xff09;&#xff1a;【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安…