当前位置:   article > 正文

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

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 += '<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)
  • 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、爬虫、图表、推荐算法都能够熟练掌握。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/645968
推荐阅读
相关标签
  

闽ICP备14008679号