92-基于Django的豆瓣图书推荐系统的设计与实现

基于Django的豆瓣图书推荐系统设计与实现

📋 目录


🎯 项目概述

本项目是一个基于Django框架开发的豆瓣图书推荐系统,集成了数据爬取、用户管理、图书推荐、数据可视化等功能。系统采用协同过滤算法为用户提供个性化图书推荐,并通过丰富的图表展示图书数据的多维度分析。

主要特性

  • 🔍 智能推荐:基于矩阵分解的协同过滤算法
  • 📊 数据可视化:丰富的图表和词云展示
  • 🕷️ 数据采集:自动化爬取豆瓣图书信息
  • 👥 用户管理:完整的用户注册登录系统
  • 📱 响应式设计:适配多种设备屏幕

项目获取

码界筑梦坊 各大平台同名 文章底部含联系方式卡片

项目展示

项目视频演示见

基于Python的图书数据分析推荐系统







🛠️ 技术栈介绍

后端技术

  • Django 3.1.14 - 核心Web框架
  • Python 3.x - 主要开发语言
  • MySQL - 数据库存储
  • PyMySQL - 数据库连接器

数据采集与处理

  • Requests 2.31.0 - HTTP请求库
  • LXML 4.9.3 - HTML解析
  • Pandas 1.4.3 - 数据处理
  • NumPy 1.23.1 - 数值计算

机器学习与推荐

  • 矩阵分解算法 - 协同过滤推荐
  • 随机梯度下降 - 模型优化
  • jieba 0.42.1 - 中文分词

数据可视化

  • Matplotlib 3.5.2 - 图表生成
  • WordCloud 1.8.2.2 - 词云制作
  • ECharts - 前端图表库

前端技术

  • HTML5/CSS3 - 页面结构
  • JavaScript/jQuery - 交互逻辑
  • Bootstrap - UI框架
  • SimpleUI - 后台管理美化

🏗️ 系统架构设计

项目结构

复制代码
book/
├── djangoProject/          # Django项目根目录
│   ├── djangoProject/     # 项目配置
│   │   ├── settings.py   # 项目设置
│   │   ├── urls.py       # URL路由
│   │   └── wsgi.py       # WSGI配置
│   ├── myApp/            # 主应用
│   │   ├── models.py     # 数据模型
│   │   ├── views.py      # 视图函数
│   │   ├── urls.py       # 应用路由
│   │   └── templates/    # 模板文件
│   ├── spider/           # 数据爬虫
│   │   └── spiderMain.py # 爬虫主程序
│   ├── model/            # 推荐算法
│   │   └── index.py      # 矩阵分解算法
│   ├── utils/            # 工具函数
│   │   ├── getChartData.py    # 图表数据
│   │   └── getPublicData.py   # 公共数据
│   ├── static/           # 静态资源
│   │   ├── css/         # 样式文件
│   │   ├── js/          # JavaScript文件
│   │   └── cloudImg/    # 词云图片
│   └── requirements.txt  # 依赖包

架构模式

系统采用Django的MVT(Model-View-Template)架构模式:

  • Model(模型):定义数据结构和数据库操作
  • View(视图):处理业务逻辑和用户请求
  • Template(模板):负责页面展示和用户交互

🗄️ 数据库设计

核心数据模型

1. 图书信息表(BookList)
python 复制代码
class BookList(models.Model):
    id = models.AutoField("id", primary_key=True)
    bookId = models.CharField("书籍编号", max_length=255, default='')
    tag = models.CharField("类型", max_length=255, default='')
    title = models.CharField("书名", max_length=255, default='')
    cover = models.CharField("封面", max_length=2555, default='')
    author = models.CharField("作者", max_length=255, default='')
    press = models.CharField("出版社", max_length=255, default='')
    year = models.CharField("出版年份", max_length=255, default='')
    pageNum = models.CharField("页码", max_length=255, default='')
    price = models.CharField("价格", max_length=255, default='')
    rate = models.CharField("评分", max_length=255, default='')
    startList = models.CharField("星级列表", max_length=255, default='')
    summary = models.TextField("描述", default='')
    detailLink = models.CharField("详情链接", max_length=2555, default='')
    createTime = models.CharField("创建时间", max_length=2555, default='')
    comment_len = models.CharField("评论数量", max_length=255, default='')
    commentList = models.TextField("评论列表", default='')
2. 用户表(User)
python 复制代码
class User(models.Model):
    id = models.AutoField("id", primary_key=True)
    username = models.CharField("用户名", max_length=255, default='')
    password = models.CharField("密码", max_length=255, default='')
    creatTime = models.DateField("创建时间", auto_now_add=True)
3. 用户评分表(UserBookRating)
python 复制代码
class UserBookRating(models.Model):
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    book = models.ForeignKey('BookList', on_delete=models.CASCADE)
    rating = models.FloatField("评分")
    created_at = models.DateTimeField("评分时间", auto_now_add=True)

数据库配置

python 复制代码
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "design_douban_book",
        "USER": "root",
        "PASSWORD": "123456",
        "HOST": "localhost",
        "PORT": "3306"
    }
}

🔧 核心功能实现

1. 数据爬取模块

爬虫核心代码
python 复制代码
class spider(object):
    def __init__(self, tag, page):
        self.tag = tag
        self.page = page
        self.spiderUrl = 'https://book.douban.com/tag/%s?start=%s'
        self.headers = {
            'HOST': 'book.douban.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Referer': 'https://book.douban.com/tag/',
            'Cookie': '...'
        }
    
    def main(self):
        # 获取图书列表页面
        resq = requests.get(self.spiderUrl % (self.tag, self.page * 20), headers=self.headers)
        respXpath = etree.HTML(resq.text)
        li_list = respXpath.xpath('//ul[@class = "subject-list"]/li/div[2]/h2/a')
        detailLinks = [x.xpath('@href')[0] for x in li_list]
        
        # 遍历获取每本书的详细信息
        for detail_link in detailLinks:
            self.get_book_detail(detail_link)
数据提取逻辑
python 复制代码
def get_book_detail(self, detail_link):
    respDetail = requests.get(detail_link, headers=self.headers)
    respDetailXpath = etree.HTML(respDetail.text)
    
    # 提取图书基本信息
    title = respDetailXpath.xpath('//span[@property = "v:itemreviewed"]/text()')[0]
    cover = respDetailXpath.xpath('//img[@rel = "v:photo"]/@src')[0]
    author = respDetailXpath.xpath('//div[@id = "info"]/span[1]/a/text()')[0]
    rate = respDetailXpath.xpath('//strong[@property="v:average"]/text()')[0].strip()
    
    # 提取评论信息
    comment_list = []
    for comment in respDetailXpath.xpath('//ul/li[@class="comment-item"]'):
        comment_data = self.extract_comment_data(comment)
        comment_list.append(comment_data)

2. 用户管理模块

用户注册
python 复制代码
def register(request):
    if request.method == "GET":
        return render(request, 'register.html', {})
    else:
        uname = request.POST.get('username')
        pwd = request.POST.get('password')
        rePwd = request.POST.get('checkPassword')
        
        # 验证用户名唯一性
        try:
            User.objects.get(username=uname)
            messages.error(request, '账号已存在')
            return HttpResponseRedirect('/myApp/register/')
        except:
            # 验证密码一致性
            if pwd != rePwd:
                messages.error(request, '两次密码不一致')
                return HttpResponseRedirect('/myApp/register/')
            else:
                User.objects.create(username=uname, password=pwd)
        return render(request, 'login.html', {})
用户登录
python 复制代码
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html', {})
    else:
        uname = request.POST.get('username')
        pwd = request.POST.get('password')
        try:
            user = User.objects.get(username=uname, password=pwd)
            request.session['username'] = uname
            return redirect('/myApp/home/')
        except:
            messages.error(request, '登录失败,请输入正确用户名与密码')
            return HttpResponseRedirect('/myApp/login/')

3. 数据可视化模块

图表数据生成
python 复制代码
def getBookPriceData(defaultType):
    typeBook = []
    for i in bookList:
        if defaultType == i.tag:
            typeBook.append(i)

    xData = ['50元', '100元', '150元', '200元', '300元', '300元以上']
    yData = [x for x in range(len(xData))]
    
    for i in typeBook:
        if int(i.price) < 50:
            yData[0] += 1
        elif int(i.price) < 100:
            yData[1] += 1
        # ... 其他价格区间
    
    return xData, yData
词云生成
python 复制代码
def get_img(field, targetImageSrc, resImageSrc):
    # 连接数据库获取文本数据
    conn = connect(host="localhost", user="root", passwd="123456", 
                   database="design_douban_book", charset="utf8mb4")
    cursor = conn.cursor()
    
    sql = f"SELECT {field} FROM booklist"
    cursor.execute(sql)
    data = cursor.fetchall()
    
    # 合并文本数据
    text = ''
    for i in data:
        if i[0] != '':
            text += i[0]
    
    # 中文分词
    data_cut = jieba.cut(text, cut_all=False)
    string = ' '.join(data_cut)
    
    # 生成词云
    img = Image.open(targetImageSrc)
    ima_arr = np.array(img)
    
    wc = WordCloud(
        background_color='#fff',
        font_path='STHUPO.TTF',
        mask=ima_arr
    )
    
    wc.generate_from_text(string)
    plt.savefig(resImageSrc, dpi=800, bbox_inches='tight', pad_inches=-0.1)

🧠 推荐算法详解

矩阵分解算法实现

核心算法类
python 复制代码
class MF:
    def __init__(self, R, k=2, alpha=0.1, beta=0.8, iterations=10):
        """
        初始化矩阵分解模型
        R: 用户-物品评分矩阵
        k: 隐藏因子的数量
        alpha: 学习率
        beta: 正则化参数
        iterations: 训练迭代次数
        """
        self.R = R
        self.k = k
        self.alpha = alpha
        self.beta = beta
        self.iterations = iterations
        self.num_users, self.num_items = R.shape
        
        # 随机初始化用户矩阵P和物品矩阵Q
        self.P = np.random.rand(self.num_users, self.k)
        self.Q = np.random.rand(self.num_items, self.k)
        
        # 偏置项
        self.b_u = np.zeros(self.num_users)
        self.b_i = np.zeros(self.num_items)
        self.b = np.mean(R[R > 0])
训练过程
python 复制代码
def train(self):
    """使用随机梯度下降训练模型"""
    for _ in range(self.iterations):
        for i in range(self.num_users):
            for j in range(self.num_items):
                if self.R[i][j] > 0:  # 只考虑用户评分过的物品
                    # 计算预测误差
                    eij = self.R[i][j] - self.full_matrix()[i][j]
                    
                    # 更新隐因子
                    for f in range(self.k):
                        self.P[i][f] += self.alpha * (2 * eij * self.Q[j][f] - self.beta * self.P[i][f])
                        self.Q[j][f] += self.alpha * (2 * eij * self.P[i][f] - self.beta * self.Q[j][f])
                    
                    # 更新偏置项
                    self.b_u[i] += self.alpha * (eij - self.beta * self.b_u[i])
                    self.b_i[j] += self.alpha * (eij - self.beta * self.b_i[j])
推荐生成
python 复制代码
def modelFn(each_user):
    """为指定用户生成推荐"""
    startList = getAllData()
    obs_dataset = [(user_id, item_id, rating) for user_id, item_id, rating in startList]
    R = getUIMat(obs_dataset)
    
    # 创建并训练模型
    mf = MF(R, k=10, alpha=0.05, beta=0.02, iterations=50)
    mf.train()
    
    # 获取用户预测评分
    user_ratings = mf.full_matrix()[each_user].tolist()
    
    # 生成推荐列表
    topN = [(i, user_ratings[i]) for i in range(len(user_ratings)) if R[each_user][i] == 0]
    topN = sorted(topN, key=lambda x: x[1], reverse=True)
    topN = [i[0] for i in topN[:12]]
    
    return topN

算法优势

  1. 处理稀疏数据:矩阵分解能有效处理用户-物品评分矩阵的稀疏性问题
  2. 隐因子学习:自动学习用户和物品的隐特征
  3. 可扩展性:算法复杂度相对较低,适合大规模数据
  4. 个性化推荐:为每个用户生成个性化的推荐列表

📊 数据可视化

1. 首页统计面板

  • 用户总数统计
  • 图书类型数量
  • 最高价图书信息
  • 最高评分图书
  • 最大页数图书
  • 评分分布图表
  • 用户注册趋势
  • 最新评论展示

2. 图书类型分析

  • 饼图展示各类型图书分布
  • 柱状图展示各类型评分情况
  • 支持交互式图表切换

3. 价格与页数分析

  • 按类型统计价格区间分布
  • 按类型统计页数区间分布
  • 支持类型切换进行对比分析

4. 评论分析

  • 评论数量分布统计
  • 不同星级评论内容长度分析
  • 评论情感分析可视化

5. 词云展示

  • 基于图书标题的词云
  • 基于图书简介的词云
  • 直观展示高频词汇

6. 年份分析

  • 出版年份分布统计
  • 各年份图书评分分析
  • 时间趋势可视化

🚀 项目部署

环境要求

  • Python 3.7+
  • MySQL 5.7+
  • Django 3.1.14

安装步骤

1. 克隆项目
bash 复制代码
git clone [项目地址]
cd book/djangoProject
2. 安装依赖
bash 复制代码
pip install -r requirements.txt
3. 数据库配置
sql 复制代码
CREATE DATABASE design_douban_book CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4. 数据库迁移
bash 复制代码
python manage.py makemigrations
python manage.py migrate
5. 启动服务
bash 复制代码
python manage.py runserver

配置说明

python 复制代码
# settings.py 关键配置
DEBUG = True
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = "zh-hans"
TIME_ZONE = "Asia/Shanghai"

# 静态文件配置
STATIC_URL = "/static/"
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

📈 系统功能展示

用户功能

  • ✅ 用户注册与登录
  • ✅ 个人信息管理
  • ✅ 密码修改

图书管理

  • ✅ 图书信息浏览
  • ✅ 图书搜索筛选
  • ✅ 图书详情查看

推荐系统

  • ✅ 个性化图书推荐
  • ✅ 基于协同过滤算法
  • ✅ 推荐结果展示

数据分析

  • ✅ 图书类型分布分析
  • ✅ 价格与页数统计
  • ✅ 评论数量与星级分析
  • ✅ 出版年份趋势分析
  • ✅ 词云可视化

数据采集

  • ✅ 自动化爬取豆瓣图书
  • ✅ 数据清洗与存储
  • ✅ 评论信息提取

🎯 项目特色

1. 完整的推荐系统

  • 实现了基于矩阵分解的协同过滤算法
  • 支持个性化推荐和冷启动处理
  • 推荐结果准确性和多样性并重

2. 丰富的数据可视化

  • 多种图表类型支持
  • 交互式数据展示
  • 词云等创新可视化方式

3. 自动化数据采集

  • 智能爬虫系统
  • 数据清洗和验证
  • 增量更新支持

4. 用户友好的界面

  • 响应式设计
  • 直观的操作流程
  • 美观的UI设计

5. 可扩展的架构

  • 模块化设计
  • 易于维护和扩展
  • 支持功能定制

🔮 总结与展望

项目成果

本项目成功实现了一个功能完整的豆瓣图书推荐系统,集成了数据采集、用户管理、推荐算法、数据可视化等多个模块。系统采用现代化的技术栈,具有良好的用户体验和扩展性。

技术亮点

  1. 算法创新:实现了基于矩阵分解的协同过滤算法
  2. 数据驱动:通过爬虫获取真实数据,保证推荐质量
  3. 可视化丰富:多种图表和词云展示,提升用户体验
  4. 架构合理:采用Django MVT架构,代码结构清晰

未来改进方向

  1. 算法优化:引入深度学习模型,提升推荐准确性
  2. 实时推荐:实现实时推荐系统,响应用户行为变化
  3. 多源数据:整合更多图书数据源,丰富推荐内容
  4. 移动端适配:开发移动端应用,提升用户体验
  5. 性能优化:优化数据库查询和缓存策略,提升系统性能

学习价值

本项目涵盖了Web开发、数据爬取、机器学习、数据可视化等多个技术领域,是学习全栈开发的优秀案例。通过本项目的学习,可以掌握:

  • Django框架的完整开发流程
  • 推荐算法的实现原理
  • 数据可视化的多种方式
  • 爬虫技术的实际应用
  • 前后端分离的开发模式

📚 参考资料


本文档详细介绍了基于Django的豆瓣图书推荐系统的设计与实现,涵盖了技术栈、架构设计、核心功能、推荐算法等多个方面,为类似项目的开发提供了参考。

相关推荐
中等生1 小时前
Python的隐形枷锁:GIL如何"绑架"了你的多线程梦想
后端·python
电商数据girl1 小时前
关于私域电商网站,接入电商API数据接口示例
运维·开发语言·网络·python·json·php
Ly2020Wj2 小时前
pytorch入门3:使用pytorch进行多输出手写数据集模型预测
人工智能·pytorch·python
码界筑梦坊2 小时前
90-基于Flask的中国博物馆数据可视化分析系统
python·信息可视化·flask
七七软件开发2 小时前
无人共享 app 系统架构分析
java·python·小程序·系统架构·php
WaterRun2 小时前
一个极简极易用, "即读即用"的Python存储库介绍: SimpSave
python
WaterRun2 小时前
使用Python合并B站缓存视频(至.MP4): 库biliffm4s介绍
python
gonghw4032 小时前
Python中变量之间赋值的理解
python
疯狂的Alex2 小时前
未来20年哪几种编程语言会保持优势?哪几种编程语言会得到更广泛的应用?
java·开发语言·c++·python·c#