计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 python 爬虫与协同过滤的新闻推荐系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题背景

由于网络信息科技的不断进步和数据量的快速增长每天会产生巨大的信息量,使得互联网上的数据信息越来越庞大、系统变得越来越臃肿,这些庞大的海量信息给用户寻找自己感兴趣的内容带来了极大的困难,往往会导致用户迷失在信息迷宫中,从而无法找到自己真正感兴趣的内容。因此,高效快速的进行新闻推荐变得极其重要。
本项目使用前后端分离,前端是基于Vue设计的界面,后端基于python Django框架建立。

2 实现效果

整体软件结构
在这里插入图片描述

2.1 用户端

在这里插入图片描述

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

2.2 管理端

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

3 Django

简介
Django是一个基于Web的应用框架,由python编写。Web开发的基础是B/S架构,它通过前后端配合,将后台服务器的数据在浏览器上展现给前台用户的应用。Django本身是基于MVC模型,即Model(模型)+View(视图)+
Controller(控制器)设计模式,View模块和Template模块组成了它的视图部分,这种结构使动态的逻辑是剥离于静态页面处理的。
Django框架的Model层本质上是一套ORM系统,封装了大量的数据库操作API,开发人员不需要知道底层的数据库实现就可以对数据库进行增删改查等操作。Django强大的QuerySet设计能够实现非常复杂的数据库查询操作,且性能接
在这里插入图片描述
安装


​ pip install django

使用

#!/usr/bin/env python'''Django's command-line utility for administrative tasks.'''import os
​    import sys​    
​    def main():'''Run administrative tasks.'''
​        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'newsServer.settings')try:from django.core.management import execute_from_command_line
​        except ImportError as exc:raise ImportError("Couldn't import Django. Are you sure it's installed and ""available on your PYTHONPATH environment variable? Did you ""forget to activate a virtual environment?") from exc
​        execute_from_command_line(sys.argv)​    
​    if __name__ == '__main__':
​        main()

4 爬虫

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫对某一站点访问,如果可以访问就下载其中的网页内容,并且通过爬虫解析模块解析得到的网页链接,把这些链接作为之后的抓取目标,并且在整个过程中完全不依赖用户,自动运行。若不能访问则根据爬虫预先设定的策略进行下一个
URL的访问。在整个过程中爬虫会自动进行异步处理数据请求,返回网页的抓取数据。在整个的爬虫运行之前,用户都可以自定义的添加代理,伪 装
请求头以便更好地获取网页数据。爬虫流程图如下:
在这里插入图片描述
相关代码

    def getnewsdetail(url):# 获取页面上的详情内容并将详细的内容汇集在news集合中
​        result = requests.get(url)
​        result.encoding = 'utf-8'
​        soup = BeautifulSoup(result.content, features="html.parser")
​        title = getnewstitle(soup)if title == None:return None
​        date = getnewsdate(soup)
​        mainpage, orimainpage = getmainpage(soup)if mainpage == None:return None
​        pic_url = getnewspic_url(soup)
​        videourl = getvideourl(url)
​        news = {'mainpage': mainpage,'pic_url': pic_url,'title': title,'date': date,'videourl': videourl,'origin': orimainpage,}return news​    
​    def getmainpage(soup):'''
​            @Description:获取正文部分的p标签内容,网易对正文部分的内容通过文本前部的空白进行标识\u3000
​            @:param None
​        '''if soup.find('div', id='article') != None:
​            soup = soup.find('div', id='article')
​            p = soup.find_all('p')for numbers in range(len(p)):
​                p[numbers] = p[numbers].get_text().replace("\u3000", "").replace("\xa0", "").replace("新浪", "新闻")
​            text_all = ""for each in p:
​                text_all += each
​            logger.info("mainpage:{}".format(text_all))return text_all, p
​        elif soup.find('div', id='artibody') != None:
​            soup = soup.find('div', id='artibody')
​            p = soup.find_all('p')for numbers in range(len(p)):
​                p[numbers] = p[numbers].get_text().replace("\u3000", "").replace("\xa0", "").replace("新浪", "新闻")
​            text_all = ""for each in p:
​                text_all += each
​            logger.info("mainpage:{}" + text_all)return text_all, p
​        else:return None, None​    
​    def getnewspic_url(soup):'''
​            @Description:获取正文部分的pic内容,网易对正文部分的图片内容通过div中class属性为“img_wrapper”
​            @:param None
​        '''
​        pic = soup.find_all('div', class_='img_wrapper')
​        pic_url = re.findall('src="(.*?)"', str(pic))for numbers in range(len(pic_url)):
​            pic_url[numbers] = pic_url[numbers].replace("//", 'https://')
​        logging.info("pic_url:{}".format(pic_url))return pic_url

5 Vue

简介
Vue是一套用于构建用户界面的渐进式框架。其核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。Vue框架主要有以下三个特点:

  • 遵循MVVM模式
    MVVM是Model-View-ViewModel的简写,它本质上是MVC的改进版。MVVM的主要目的是分离视图(View)和模型(Model)。如图所示。
    在这里插入图片描述

  • 组件化
    组件系统允许我们使用小型、独立和通常可复用的组件构建大型应用。几乎任意类型的应用界面都可以抽象为一个组件树,如图所示。
    在这里插入图片描述

  • 虚拟DOM
    频繁操作操作真实DOM会出现页面卡顿,影响用户体验。Vue的虚拟DOM不会立即操作DOM,而是将多次操作保存起来,进行合并计算,减少真实DOM的渲染计算次数,提升用户体验。

6 推荐算法(Recommendation)

基于协同过滤的推荐算法(Collaborative Filtering Recommendations)
协同过滤(Collaborative Filtering)推荐算法是最经典、最常用的推荐算法。
所谓协同过滤, 基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向,
并预测用户可能喜好的产品进行推荐),一般是仅仅基于用户的行为数据(评价、购买、下载等),
而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。目前应用比较广泛的协同过滤算法是基于邻域的方法,
而这种方法主要有下面两种算法:

  • 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品
  • 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品

代码实现

 def itemcf_sim(df):"""文章与文章之间的相似性矩阵计算:param df: 数据表:item_created_time_dict:  文章创建时间的字典return : 文章与文章的相似性矩阵思路: 基于物品的协同过滤(详细请参考上一期推荐系统基础的组队学习), 在多路召回部分会加上关联规则的召回策略"""


user_item_time_dict = get_user_item_time(df)

    # 计算物品相似度i2i_sim = {}item_cnt = defaultdict(int)for user, item_time_list in tqdm(user_item_time_dict.items()):# 在基于商品的协同过滤优化的时候可以考虑时间因素for i, i_click_time in item_time_list:item_cnt[i] += 1i2i_sim.setdefault(i, {})for j, j_click_time in item_time_list:if(i == j):continuei2i_sim[i].setdefault(j, 0)i2i_sim[i][j] += 1 / math.log(len(item_time_list) + 1)i2i_sim_ = i2i_sim.copy()for i, related_items in i2i_sim.items():for j, wij in related_items.items():i2i_sim_[i][j] = wij / math.sqrt(item_cnt[i] * item_cnt[j])# 将得到的相似性矩阵保存到本地pickle.dump(i2i_sim_, open(save_path + 'itemcf_i2i_sim.pkl', 'wb'))return i2i_sim_

7 APScheduler框架

简介
Advanced Python Scheduler (APScheduler) 是一个 Python 库,可让您安排 Python
代码稍后执行,可以只执行一次,也可以定期执行。您可以随意添加新工作或删除旧工作。如果您将任务存储在数据库中,它们也将在调度器重新启动后幸存下来并保持其状态。当调度器重新启动时,它将运行它在离线时应该运行的所有任务。

除此之外,APScheduler 可以用作跨平台、特定于应用程序的平台特定调度器的替代品,例如 cron 守护程序或 Windows
任务调度器。但是请注意,APScheduler
本身不是守护程序或服务,也不附带任何命令行工具。它主要用于在现有应用程序中运行。也就是说,APScheduler
确实为您提供了一些构建块来构建调度器服务或运行专用调度器进程。

安装

pip安装:


​ pip install apscheduler

本项目相关使用:

from apscheduler.schedulers.blocking import BlockingScheduler
​    from Recommend.NewsRecommendByCity import beginrecommendbycity
​    from Recommend.NewsRecommendByHotValue import beginrecommendbyhotvalue
​    from Recommend.NewsRecommendByTags import beginNewsRecommendByTags
​    from Recommend.NewsKeyWordsSelect import beginSelectKeyWord
​    from Recommend.NewsHotValueCal import beginCalHotValue
​    from Recommend.NewsCorrelationCalculation import beginCorrelation
​    from Recommend.HotWordLibrary import beginHotWordLibrary
​    sched = BlockingScheduler()sched2 = BlockingScheduler()​    
​    def beginRecommendSystem(time):'''
​            @Description:推荐系统启动管理器(基于城市推荐、基于热度推荐、基于新闻标签推荐)
​            @:param time --> 时间间隔
​        '''
​        sched.add_job(func=beginrecommendbycity, trigger='interval', max_instances=1, seconds=int(time),id='NewsRecommendByCity',
​                      kwargs={})
​        sched.add_job(beginrecommendbyhotvalue, 'interval', max_instances=1, seconds=int(time),id='NewsRecommendByHotValue',
​                      kwargs={})
​        sched.add_job(beginNewsRecommendByTags, 'interval', max_instances=1, seconds=int(time), id='NewsRecommendByTags',
​                      kwargs={})
​        sched.start()​    
​    def stopRecommendSystem():'''
​            @Description:推荐系统关闭管理器
​            @:param None
​        '''
​        sched.remove_job('NewsRecommendByCity')
​        sched.remove_job('NewsRecommendByHotValue')
​        sched.remove_job('NewsRecommendByTags')​    
​    def beginAnalysisSystem(time):'''
​            @Description:数据分析系统启动管理器(关键词分析、热词分析、新闻相似度分析、热词统计)
​            @:param time --> 时间间隔
​        '''
​        sched2.add_job(beginSelectKeyWord, trigger='interval', max_instances=1, seconds=int(time),id='beginSelectKeyWord',
​                      kwargs={"_type": 2})
​        sched2.add_job(beginCalHotValue, 'interval', max_instances=1, seconds=int(time),id='beginCalHotValue',
​                      kwargs={})
​        sched2.add_job(beginCorrelation, 'interval', max_instances=1, seconds=int(time), id='beginCorrelation',
​                      kwargs={})
​        sched2.add_job(beginHotWordLibrary, 'interval', max_instances=1, seconds=int(time), id='beginHotWordLibrary',
​                      kwargs={})
​        sched2.start()def stopAnalysisSystem():'''@Description:数据分析系统关闭管理器@:param None'''sched2.remove_job('beginSelectKeyWord')sched2.remove_job('beginCalHotValue')sched2.remove_job('beginCorrelation')sched2.remove_job('beginHotWordLibrary')sched2.shutdown()

7 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/93560.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AUTOSAR NvM协议栈集成方法

一、涉及的模块 Bsw:NvM、MemIf、Fee、Crc Mcal:Fls 其中一些芯片厂商的MCAL也会提供Fee模块,本文选择使用ETAS提供的Fee模块,好处是Fee的Block不需要手动配,在NvM中配好了Block之后,生成Bsw代码的同时会…

山东布谷科技直播软件源码Nginx服务器横向扩展:搭建更稳定的平台服务

在直播软件源码平台中,服务器扮演着重要的角色,关系着视频传输、数据处理、用户管理等工作的顺利完成。随着互联网的迅猛发展,直播行业也随之崛起,全世界的人们都加入到了直播软件源码平台中,用户流量的增加让服务器的…

设计模式之构建器(Builder)C++实现

1、构建器提出 在软件功能开发中,有时面临“一个复杂对象”的创建工作,该对象的每个功能接口由于需求的变化,会使每个功能接口发生变化,但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定…

爬虫逆向实战(八)--猿人学第十五题

一、数据接口分析 主页地址:猿人学第十五题 1、抓包 通过抓包可以发现数据接口是api/match/15 2、判断是否有加密参数 请求参数是否加密? 查看“载荷”模块可以发现有一个m加密参数 请求头是否加密? 无响应是否加密? 无cook…

[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 string的拷贝构造3.4 string的赋值构造 4、完整代码 1、string类的出现 1.1 C语言中的字符串 C语言中&…

【数据分析入门】Numpy进阶

目录 一、数据重塑1.1 透视1.2 透视表1.3 堆栈/反堆栈1.3 融合 二、迭代三、高级索引3.1 基础选择3.2 通过isin选择3.3 通过Where选择3.4 通过Query选择3.5 设置/取消索引3.6 重置索引3.6.1 前向填充3.6.2 后向填充 3.7 多重索引 四、重复数据五、数据分组5.1 聚合5.2 转换 六、…

搭建Web服务器并用cpolar发布至公网访问

本地电脑搭建Web服务器并用cpolar发布至公网访问 文章目录 本地电脑搭建Web服务器并用cpolar发布至公网访问前言1. 首先在电脑安装PHPStudy、WordPress、cpolar2. 安装cpolar,进入Web-UI界面3. 安装wordpress4. 进入wordpress网页安装程序5. 利用cpolar建立的内网穿…

FL Studio 21最新for Windows-21.1.0.3267中文解锁版安装激活教程及更新日志

FL Studio 21最新版本for Windows 21.1.0.3267中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境(IDE)来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发…

OpenAI全球招外包大军,手把手训练ChatGPT取代码农 ; 码农:我自己「杀」自己

目录 前言 OpenAI招了一千多名外包人员,训练AI学会像人类一样一步步思考。如果ChatGPT「学成归来」,码农恐怕真的危了? 码农真的危了! 当时OpenAI也说,ChatGPT最合适的定位,应该是编码辅助工具。 用Cha…

设计模式之原型模式详解

前言 在设计模式的系列文章中,我们前面已经写了工厂模式、单列模式、建造者模式,在针对创建型模式中,今天想跟大家分享的是原型模式,我觉的这种模式叫克隆模式会更佳恰当。原型模式的目的就是通过复制一个现有的对象来生成一个新…

【Linux】生产者消费者模型

目录 什么是生产消费者模型 为什么要使用生产消费者模型 基于阻塞队列的生产消费者模型 什么是生产消费者模型 生产者消费者模型是一种常见的并发编程模型,用于解决生产者和消费者之间数据交换和同步的问题。在这个模型中,生产者会生成数据并将其放入…

Spring之AOP的特性

一. AOP简介 AOP是Aspect-Oriented Programming的缩写,即面向切面编程。利用oop思想,可以很好的处理业务流程,但是不能把系统中某些特定的重复性行为封装到模块中。例如,在很多业务中都需要记录操作日志,结果我们不得…

HTML5 游戏开发实战 | 五子棋

01、五子棋游戏设计的思路 在下棋过程中,为了保存下过的棋子的信息,使用数组 chessData。chessData[x][y]存储棋盘(x,y)处棋子信息,1 代表黑子,2 代表白子,0…

【100天精通python】Day38:GUI界面编程_PyQT从入门到实战(中)

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…

高效数据传输:轻松上手将Kafka实时数据接入CnosDB

本篇我们将主要介绍如何在 Ubuntu 22.04.2 LTS 环境下,实现一个KafkaTelegrafCnosDB 同步实时获取流数据并存储的方案。在本次操作中,CnosDB 版本是2.3.0,Kafka 版本是2.5.1,Telegraf 版本是1.27.1 随着越来越多的应用程序架构转…

Linux驱动开发之点亮三盏小灯

头文件 #ifndef __HEAD_H__ #define __HEAD_H__//LED1和LED3的硬件地址 #define PHY_LED1_MODER 0x50006000 #define PHY_LED1_ODR 0x50006014 #define PHY_LED1_RCC 0x50000A28 //LED2的硬件地址 #define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014 #define…

TiDB基础介绍、应用场景及架构

1. 什么是newsql NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性。 NewSQL是指这样一类新式的关系型数据库管理系统,针对OLTP(读-写&…

移动通信系统的LMS自适应波束成形技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... idxx0; while idxx&…

docker 基础知识

目录 1. 加载docker镜像 2. 显示所有的镜像 3. 执行镜像,生成容器, 每执行一次,便生成一个容器 4. 显示出container名称 5. 进入容器 6. 如何将文件传入容器内 首先要确保已经安装了docker。注意:服务器上若没有管理员权限&am…

(贪心) 剑指 Offer 14- II. 剪绳子 II ——【Leetcode每日一题】

❓剑指 Offer 14- II. 剪绳子 II 难度:中等 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n 都是整数,n > 1 并且 m>1 ),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*.…