目 录
摘 要 I
Abstract II
第1章 绪论 1
1.1 选题背景及意义 1
1.1.1 选题背景 1
1.1.2 选题意义 1
1.2国内外研究现状及发展趋势 2
1.2.1 国内研究现状 2
1.2.2 国外研究现状 2
1.2.3 发展趋势 3
1.3研究主要内容及预期结果 3
1.3.1研究主要内容 3
1.3.2 预期结果 4
第2章 技术与原理 5
2.1 技术选型 5
2.1.1 Python语言介绍 5
2.1.2 Scrapy框架介绍 5
2.1.3 Django框架介绍 5
2.1.4 bootstrap 6
2.1.5 node koa2 6
2.1.6 MongoDB数据库介绍 6
2.2相关原理介绍 7
2.2.1 网络爬虫介绍 7
2.2.2 关键词提取技术 7
2.2.3 智能分类技术 7
第3章 系统分析 9
3.1 用户推荐系统用例析取 9
3.2 用户推荐系统用例规约 9
3.2.1 新闻推荐 9
3.2.2 新闻分类 10
第4章 系统设计 12
4.1系统架构及原理 12
4.2 系统模块设计 13
4.2.1爬虫采集模块设计 13
4.2.2 爬虫去重模块设计 14
4.2.3 防反爬虫模块设计 14
4.2.4 爬虫存储模块设计 15
4.2.5 消息分类模块设计 15
4.2.6 消息推荐与展示模块设计 15
4.3 数据库设计 16
第5章 系统实现 17
5.1 项目架构及运行 17
5.1.1 项目架构 17
5.1.2 运行 17
5.2 功能划分 17
5.2.1 新闻爬取模块 17
5.2.2 新闻列表加载模块 17
5.2.3 新闻内容加载模块 18
5.2.4 用户管理模块 18
5.2.5 服务器路由模块 18
5.2.6 数据库交互模块 18
5.2.7 新闻推荐模块 18
5.2.8 Android客户端模块 19
5.3 功能模块设计 19
5.3.1 新闻主页 19
5.3.2 新闻页面 21
5.3.3 用户注册 22
5.3.4 用户登录 23
5.3.5 用户修改信息 24
5.3.6 用户个人主页 25
5.3.7 新闻个性推荐 26
5.3.8 移动端新闻推送 27
第6章 系统部署 29
6.1 部署机器概述 29
6.2 配置环境 29
6.3 系统运行 29
第7章 总结与展望 30
7.1 总结 30
7.2 展望 30
致 谢 31
参考文献 32
附录:代码架构及实现 33
1工程代码架构 33
2新闻爬取模块 33
1)相应主题对应新闻页面链接的爬取 33
2)新闻页面内容的爬取(主要是凤凰新闻网) 35
3)python连接mongodb数据库 38
3导航栏实现 38
4 新闻列表的加载 41
5 新闻内容页面的显示 49
6 用户注册 54
7 用户登录 58
8 新闻推荐模块 61
1.3研究主要内容及预期结果
1.3.1研究主要内容
本研究的主要内容是基于新闻数据的情感分析与用户推荐系统的设计与实现。具体包括以下几个方面:
新闻数据采集与处理:利用Python的Scrapy框架搭建网络爬虫,定时定向地采集新闻网站的数据。采集到的数据经过清洗、去重、分类等操作后,存入数据库。
新闻情感分析:对采集到的新闻文本进行情感分析,提取新闻的情感倾向(正面、负面、中性)。情感分析可以采用基于规则的方法、基于机器学习的方法或深度学习的方法。
用户推荐系统:根据用户的浏览历史、点赞、评论等数据,构建用户画像,实现个性化新闻推荐。推荐算法可以采用协同过滤、基于内容的推荐或混合推荐策略。
数据可视化:将新闻数据、情感分析结果、推荐结果等以图表、趋势图等形式进行可视化展示,帮助用户直观地了解新闻数据和情感倾向。
系统设计与实现:结合实际需求,设计并实现一个功能完善的新闻推荐系统,包括前端界面、后端逻辑和数据库设计等。
系统测试与优化:对实现的系统进行测试,确保系统的稳定性和可靠性;根据测试结果和用户反馈,对系统进行优化和改进。
通过以上研究内容的实施,旨在实现一个能够为用户提供个性化新闻推荐服务,并辅助用户理解新闻情感倾向的系统。这不仅可以提高用户获取新闻的效率和质量,还可以为新闻传媒行业提供一种新的服务模式和思路。
1.3.2 预期结果
本文描述了基于新闻数据的情感分析用户推荐系统的设计与实现的过程,主要工作如下:
- 定时到各主流新闻门户网站抓取信息;
- 用户访问网站时能看到推荐的信息内容;
- 实现用户注册、登录功能,用户注册时需要填写必要的信息并验证,如用户名、密码要求在6字节以上,email 的格式验证,并保证用户名和 email 在系统中唯一;
- 用户登录后可以设置感兴趣的新闻资讯栏目,用户访问网站的展示页面会根据用户设置做出相应的调整;
- 实现一个 Android 或 iphone 客户端软件,功能同网站,但展示界面根据屏幕大小做 UI 的自适应调整,并能实现热点新闻分类;
- 具体一定的学习能力,能根据用户的使用习惯调整展现的内容。
from PhoenixNews import theme_spider
from PhoenixNews import page_spider
from PhoenixNews import mongodb_driver
theme_url_list = [
{'name':'即时', 'href':"http://news.ifeng.com/listpage/11502/0/1/rtlist.shtml",'judge':"http://news.ifeng.com/a/\d+"},#18
{'name':'大陆', 'href':"http://news.ifeng.com/mainland/", 'judge':"http://news.ifeng.com/a/\d+" },#0
{'name':'国际', 'href':"http://news.ifeng.com/world/", 'judge':"http://news.ifeng.com/a/\d+"},#1
{'name':'台湾', 'href':"http://news.ifeng.com/taiwan/", 'judge':"http://news.ifeng.com/a/\d+"},#2
{'name':'社会', 'href':"http://news.ifeng.com/society/", 'judge':"http://news.ifeng.com/a/\d+"},#3
{'name':'军事', 'href':"http://news.ifeng.com/mil/index.shtml", 'judge':"http://news.ifeng.com/a/\d+"},#4
{'name':'港澳', 'href':"http://news.ifeng.com/hongkong/index.shtml",'judge':"http://news.ifeng.com/a/\d+"},#5
{'name':'历史', 'href':"http://news.ifeng.com/history/", 'judge':"http://news.ifeng.com/a/\d+"},#6
{'name':'财经', 'href':'http://finance.ifeng.com/', 'judge':"http://finance.ifeng.com/a/"},#7
{'name':'娱乐', 'href':'http://ent.ifeng.com/', 'judge':"http://ent.ifeng.com/a/"},#8
{'name':'体育', 'href':'http://sports.ifeng.com/', 'judge':"http://sports.ifeng.com/a/"},#9
{'name':'时尚', 'href':'http://fashion.ifeng.com/', 'judge':"http://fashion.ifeng.com/a/"},#10
{'name': '科技', 'href': 'http://tech.ifeng.com/', 'judge': "http://tech.ifeng.com/a/"},#11
{'name': '读书', 'href': 'http://book.ifeng.com/', 'judge': "http://book.ifeng.com/a/"},#12
{'name': '游戏', 'href': 'http://games.ifeng.com/', 'judge': "http://games.ifeng.com/a/"},#13
{'name': '文化', 'href': 'http://culture.ifeng.com/', 'judge': "http://culture.ifeng.com/a/"},#14
{'name': '公益', 'href': 'http://gongyi.ifeng.com/', 'judge': "http://gongyi.ifeng.com/a/"},#15
{'name': '旅游', 'href': 'http://travel.ifeng.com/', 'judge': "http://travel.ifeng.com/a/"},#16
{'name': '健康', 'href': 'http://fashion.ifeng.com/health/', 'judge': "http://fashion.ifeng.com/a/"},#17
#{'name': '博客', 'href': 'http://blog.ifeng.com/', 'judge': "http://blog.ifeng.com/article/"},#18
#{'name':'汽车', 'href':'http://auto.ifeng.com/', 'judge':"http://auto.ifeng.com/[0-9a-zA-Z\_/]*/\d+.shtml"},#19
]
# for theme in theme_url_list:
# t_spider = theme_spider.ThemeSpider(theme['href'],theme['judge'])
# linkList = t_spider.getLinkList()
# i = 0
# for link in linkList:
# i += 1
# print(i)
# print("%s %s" % (link['title'] , link['href']))
# page_s = page_spider.PageSpider(link['href'])
# page_s.getContent()
#
# print("%d lines" % len(linkList))
# t_spider = theme_spider.ThemeSpider(theme_url_list[18]['href'],theme_url_list[18]['judge'])
# linkList = t_spider.getLinkList()
# i = 0
# for link in linkList:
# i += 1
# print(i)
# print("%s %s" % (link['title'], link['href']))
# page_s = page_spider.PageSpider(link['href'])
# data = page_s.getContent()
# print('title: ' + data['title'])
# print('datetime: ' + data['datetime'])
# for c in data['content']:
# print("%s %s" % (c[0], c[1]))
# page_s = page_spider.PageSpider("http://fashion.ifeng.com/a/20170519/40246533_0.shtml")
# data = page_s.getContent()
mongodb = mongodb_driver.ConnectDatabase()
for theme in theme_url_list:
t_spider = theme_spider.ThemeSpider(theme['href'],theme['judge'])
linkList = t_spider.getLinkList()
i = 0
for link in linkList:
page_s = page_spider.PageSpider(link['href'])
newsData = page_s.getContent()
if newsData is not None:
i += 1
print("%d %s %s" % (i,theme['name'] , link['href']))
mongodb.insertToDatabase(theme['name'],link['href'],newsData)