基于Python+协同过滤的新闻推荐平台设计与实现

89 阅读10分钟

基于Python+协同过滤的新闻推荐平台设计与实现

在信息爆炸的互联网时代,用户每天面临海量新闻内容,却难以快速找到感兴趣的信息——这既是新闻平台的痛点,也是用户体验的瓶颈。为此,我设计并实现了一套融合Python网络爬虫与协同过滤算法的新闻推荐平台,通过自动采集新闻数据、分析用户行为、生成个性化推荐,让新闻传递更高效,用户阅读更便捷。

一、为什么要做这个新闻推荐平台?

1.1 背景:信息过载下的需求缺口

随着互联网技术的普及,新闻传播已从“被动接收”转向“主动获取”,但新的问题随之而来:

  • 用户端:传统新闻平台按“时间排序”或“类别划分”呈现内容,用户需在海量信息中手动筛选,耗时且体验差;
  • 平台端:缺乏对用户兴趣的深度理解,优质内容难以触达目标用户,导致用户留存率低;
  • 行业端:人工采集新闻效率低,且推荐策略单一,无法满足“千人千面”的个性化需求。

基于此,搭建一个能自动爬取新闻、智能推荐内容的平台,成为解决这些问题的关键。

1.2 核心价值:不止于“推荐”,更是“高效匹配”

这个平台的核心价值体现在三个方面:

  • 对用户:无需手动筛选,系统根据历史行为(点击、浏览、评论)推荐感兴趣的新闻,节省阅读时间;
  • 对平台:通过爬虫自动更新新闻库,减少人工维护成本;同时通过推荐提升用户活跃度与留存率;
  • 对技术:验证Python爬虫+协同过滤算法在垂直领域的实用性,为类似推荐系统提供参考。

二、平台用了哪些关键技术?

整个平台围绕“数据采集-存储-分析-推荐-展示”全流程设计,技术栈选择成熟、高效且易维护的方案,具体如下:

技术模块具体选择作用说明
后端开发Python 3.x + Django框架Python负责爬虫与算法实现,Django提供Web服务(如用户管理、接口开发),遵循MTV架构,代码可维护性高
数据采集Requests + BeautifulSoupRequests模拟浏览器请求爬取新闻数据,BeautifulSoup解析HTML页面,提取标题、内容、分类等信息
推荐算法协同过滤(用户/物品基)基于用户行为构建“用户-新闻关联矩阵”,通过相似用户喜好或相似新闻特征生成推荐,引入隐式反馈提升准确性
数据库MySQL 5.7+存储用户信息、新闻数据、行为记录等,支持高效查询与事务处理
前端展示Vue + BootstrapVue实现动态交互(如个性化推荐页),Bootstrap保证界面响应式,适配不同设备
开发工具PyCharm + NavicatPyCharm用于Python代码开发与调试,Navicat用于MySQL数据库管理

关键技术拆解:协同过滤算法

推荐算法是平台的“大脑”,我选择了协同过滤算法,原因是它无需依赖新闻内容特征,仅通过用户行为就能挖掘潜在兴趣,适合新闻这类“高频更新”的场景。具体实现逻辑如下:

  1. 数据准备:收集用户行为数据(如“浏览新闻A”“评论新闻B”),为每类行为赋予权重(例如:评论权重>点击权重);
  2. 构建关联矩阵:以“用户ID”为行、“新闻ID”为列,权重为值,构建“用户-新闻关联矩阵”;
  3. 计算相似度
    • 基于用户:计算目标用户与其他用户的行为相似度,找到“兴趣相似的用户群”;
    • 基于物品:计算新闻之间的相似度(如共同被多少用户浏览),找到“相似新闻”;
  4. 生成推荐:结合两种相似度结果,为用户推荐“相似用户喜欢的新闻”或“相似新闻”,同时引入“隐式反馈”(如用户停留时长)优化结果。

三、平台能做什么?功能设计与架构

3.1 核心功能:分角色设计

平台分为管理员普通用户两种角色,功能各有侧重,确保权限清晰、操作高效:

(1)管理员功能:把控平台运行与数据质量
  • 概况监控:查看系统整体数据(用户数、新闻数、爬虫状态),实时掌握平台运行情况;
  • 爬虫管理:配置爬虫任务(如爬取频率、目标新闻源)、监控爬取状态、处理爬取异常(如反爬拦截);
  • 推荐管理:调整推荐算法参数(如相似度计算阈值)、查看推荐效果(如用户点击率);
  • 内容管理:审核爬取的新闻(删除违规内容)、分类标签管理(如“时政”“科技”);
  • 用户管理:查看用户列表、处理用户反馈、禁用违规账号。
(2)普通用户功能:个性化新闻体验
  • 账号体系:注册/登录账号,系统记录个人行为,实现“一人一推荐”;
  • 首页浏览:展示最新新闻、热点新闻(按热度排序);
  • 个性化推荐页:基于历史行为,展示“为你推荐”的新闻列表;
  • 兴趣标签:手动设置兴趣标签(如“体育”“财经”),辅助算法优化推荐;
  • 新闻互动:查看新闻详情、发表评论、收藏感兴趣的内容;
  • 热词库:查看当前热门新闻关键词,快速定位热点话题。

3.2 系统架构:B/S架构,分层设计

为了便于后期维护与扩展,平台采用B/S(浏览器/服务器)架构,分为三层设计:

  1. 表现层:用户通过浏览器访问,包括前台(用户端)和后台(管理员端)界面,负责“展示数据”和“接收用户操作”;
  2. 业务逻辑层:Django框架的核心,处理前后台请求(如爬虫任务调度、推荐算法调用、用户权限验证),是“数据流转的桥梁”;
  3. 数据层:MySQL数据库,存储所有业务数据(用户信息、新闻数据、行为记录),提供高效的数据读写支持。

架构图如下(简化版):

用户/管理员 → 浏览器(表现层) → Django业务逻辑层(爬虫/推荐/接口) → MySQL数据层

3.3 数据库设计:核心表结构

数据库是平台的“数据仓库”,我设计了7张核心表,确保数据存储规范、关联清晰。关键表如下:

表名核心字段作用说明
管理员表id(主键)、username、password存储管理员账号信息,用于后台登录
用户表userid(主键)、username、password、tags(兴趣标签)存储用户基本信息与兴趣偏好
新闻表news_id(主键)、title、content、category(分类)、readnum(阅读量)存储爬取的新闻核心数据
行为记录表id(主键)、userid、newsid、action(行为类型)、weight(权重)存储用户行为,用于推荐算法
推荐结果表id(主键)、userid、newsid、cor(相似度)存储推荐算法生成的结果,提升查询效率
评论表id(主键)、userid、newsid、comments(评论内容)存储用户对新闻的评论
热词表id(主键)、hotword(热词)、num(出现次数)存储热门关键词,用于热点展示

四、平台长什么样?关键界面与实现

4.1 核心界面展示

(1)管理员后台:爬虫管理界面

管理员可在这里配置爬虫任务,比如设置“每天9点爬取某新闻网站的科技板块”,界面会显示当前爬取状态(“运行中”/“已完成”),若遇到反爬拦截,会提示“更换User-Agent”:

(2)用户端:个性化推荐页

用户登录后,推荐页会展示“为你推荐”的新闻列表,每条新闻标注“推荐理由”(如“你喜欢的‘科技’类新闻”),点击新闻可进入详情页,界面下方会显示“相似新闻”:

(3)用户端:兴趣标签设置界面

用户可手动添加/删除兴趣标签(如勾选“体育”“财经”),系统会根据标签调整推荐方向,标签旁会显示“该标签下已推荐12条新闻”,帮助用户感知标签作用:

4.2 关键功能实现:爬虫模块代码片段

爬虫是平台的“数据来源”,我以“爬取某新闻网站科技板块”为例,展示核心代码逻辑(已简化,实际需处理反爬与异常):

# 导入所需库
import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime

# 1. 配置爬虫参数
target_url = "https://example.com/tech"  # 目标新闻源URL
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/118.0.0.0 Safari/537.36"
}  # 模拟浏览器请求,避免反爬

# 2. 发送请求,解析页面
response = requests.get(target_url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# 3. 提取新闻数据(标题、URL、发布时间)
news_list = soup.find_all("div", class_="news-item")  # 找到新闻列表容器
for news in news_list:
    # 提取标题
    title = news.find("h3", class_="news-title").get_text().strip()
    # 提取详情页URL
    detail_url = news.find("a")["href"]
    # 提取发布时间
    publish_time = news.find("span", class_="publish-time").get_text().strip()
    # 提取新闻分类(此处为“科技”)
    category = "科技"

    # 4. 连接MySQL,插入数据
    db = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",  # 替换为你的数据库密码
        database="news_recommend"  # 替换为你的数据库名
    )
    cursor = db.cursor()
    # 插入SQL语句
    sql = """
        INSERT INTO news (title, url, publish_time, category, create_time)
        VALUES (%s, %s, %s, %s, %s)
    """
    try:
        cursor.execute(sql, (title, detail_url, publish_time, category, datetime.now()))
        db.commit()
        print(f"成功爬取:{title}")
    except Exception as e:
        db.rollback()
        print(f"爬取失败:{e}")
    finally:
        db.close()

五、平台好用吗?测试与优化

为了确保平台稳定可用,我做了功能测试兼容性测试,重点验证核心流程是否通顺、数据是否准确:

5.1 关键测试用例

测试功能测试步骤预期结果实际结果
管理员登录输入正确账号密码 → 点击登录成功进入后台首页,显示系统概况符合预期
爬虫任务执行配置爬取目标 → 启动爬虫3分钟内爬取10条新闻,存入数据库符合预期,仅1条因页面结构变化爬取失败,已修复
个性化推荐用户连续浏览3条“科技”新闻 → 查看推荐页推荐页前5条为“科技”类新闻符合预期,推荐准确率约80%
用户评论登录 → 进入新闻详情页 → 发表评论评论成功显示,同时更新新闻“评论数”符合预期

5.2 遇到的问题与解决

开发过程中,最棘手的问题是爬虫反爬拦截——目标网站会通过“User-Agent验证”“IP限制”阻止爬虫。我采用了两个解决办法:

  1. 动态User-Agent:维护一个User-Agent列表,每次请求随机选择一个,模拟不同浏览器;
  2. IP代理池:使用免费IP代理(如西刺代理),当某IP被限制时,自动切换到新IP。

另一个问题是推荐准确率不足,初期推荐的新闻与用户兴趣匹配度低。我通过“增加行为权重维度”(如用户停留时长超过30秒,权重翻倍)优化关联矩阵,推荐准确率从65%提升到80%。

六、总结与未来计划

6.1 项目成果

这个新闻推荐平台实现了最初的设计目标:

  • 自动化:爬虫每天定时更新新闻,无需人工干预,日均爬取新闻50+条;
  • 个性化:基于协同过滤算法,为用户提供定制化推荐,用户点击推荐新闻的比例达45%;
  • 易用性:界面简洁,操作流程清晰,普通用户5分钟内即可上手。

七、运行截图

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

八、资料获取

论文全文档(含目录、参考文献、致谢,可直接用于毕设答辩); 核心源码 系统运行教程(环境搭建步骤:如 MySQL 配置、Tomcat 部署)。 如果本文对你的毕设或开发有帮助,欢迎点赞 + 收藏 + 关注,后续会持续分享教育类系统开发技巧!