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


    基于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    创建数据库使用图形化工具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 += '

    ' text += p.text text += '

    '
    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)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    5、UI界面功能

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

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

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

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

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

    个人中心:

    在这里插入图片描述

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

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

    6、后台管理

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

    四、后记

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

  • 相关阅读:
    GCN笔记:Graph Convolution Neural Network,ChebNet
    做了五年功能测试麻木了,现在想进阶自动化测试该从哪里开始?
    用Pycharm开发Flask框架设置debug模式、port 端口和 host 主机无效的解决办法
    Elasticsearch:LDAP 用户鉴权
    Win11怎么调亮度?Win11调屏幕亮度的四种方法
    网络基础-RIP协议
    【MATLAB源码-第66期】基于麻雀搜索算法(SSA)的栅格路径规划,输出做短路径图和适应度曲线。
    华为OD 完全二叉树非叶子部分后序遍历(200分)【java】A卷+B卷
    Linux Cgroup 系列:CentOS 7 Systemd Cgroup 层级
    Mybatis的XML配置文件
  • 原文地址:https://blog.csdn.net/lm_is_dc/article/details/133985335