基于Python的新闻聚合网站设计与实现

摘 要:本论文研究内容是基于Python的爬虫网络设计,利用Python的Scrapy的框架搭建爬虫网络,并设计一个全新的新闻网站,网站实现对新闻数据的分类,以及用户对新闻的分享、评论等,且本论题设计网页实现对新闻数据的可视化,让人们在面对海量新闻数据时不再花费更多的时间来获取有效的有价值的新闻信息。本系统利用网络爬虫我们可以做到对网络上的新闻网站进行定时定向的分析和采集,然后把采集到的数据进行去重,分类等操作后存入数据库,最后提供聚合的新闻聚合服务。考虑了如何应对网站的反爬虫策略,避免被网站封锁爬虫。具体实现新闻聚合网站技术,前端采用bootstrap,后端采用node koa2,数据库使用monogodb, 并可以通过浏览器或者android APP打开该网页。
关键词:Python;爬虫;聚合新闻;新闻爬虫;可视化
Design and implementation of the news aggregation website based on Python
Abstract: This paper research content is based on Python crawler network design, using the framework of Python Scrapy to build crawler network, and design a new news website, website to realize the classification of news data, and users to share news, comment, and this topic design web page to realize the visualization of news data, so that people in the face of massive news data no longer spend more time to obtain effective valuable news information.This system uses the network crawler. We can do regularly targeted analysis and collection of news websites on the network, and then replay the collected data, classify and other operations into the database, and finally provide personalized news subscription service.Consider how to deal with the website’s anti-crawler strategy to avoid being blocked by the website crawler.Specifically, the news aggregation website technology adopts bootstrap at the front end, the back end uses node koa2, the database uses monogodb, and the web page can be opened through the browser or android APP.
Key words: Python; crawler; aggregated news; news crawler; visualization
目 录
摘 要 I
Abstract II
1 引言 1
1.1 选题背景及意义 1
1.2 研究开发现状分析 1
1.2.1 聚合新闻服务现状 1
1.2.2 网络爬虫研究现状 2
1.2.3 预期结果 2
1.3 论文结构简介 2
2 技术与原理 4
2.1 技术选型 4
2.1.1 Python语言介绍 4
2.1.2 Scrapy框架介绍 4
2.1.3 Django框架介绍 4
2.1.4 bootstrap 5
2.1.5 node koa2 5
2.1.6 MongoDB数据库介绍 6
2.2相关原理介绍 6
2.2.1 网络爬虫介绍 6
2.2.2 关键词提取技术 6
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 防反爬虫模块设计 15
4.2.4 爬虫存储模块设计 15
4.2.5 消息分类模块设计 16
4.2.6 消息聚合与展示模块设计 16
4.3 数据库设计 16
5 新闻聚合网站的实现 18
5.1 项目架构及运行 18
5.1.1 项目架构 18
5.1.2 运行 18
5.2 功能划分 18
5.2.1 新闻爬取模块 18
5.2.2 新闻列表加载模块 19
5.2.3 新闻内容加载模块 19
5.2.4 用户管理模块 19
5.2.5 服务器路由模块 19
5.2.6 数据库交互模块 19
5.2.7 新闻推荐模块 20
5.2.8 Android客户端模块 20
5.3 功能模块设计 20
5.3.1 新闻主页 20
5.3.2 新闻页面 22
5.3.3 用户注册 23
5.3.4 用户登录 25
5.3.5 用户修改信息 26
5.3.6 用户个人主页 27
5.3.7 新闻个性推荐 28
5.3.8 移动端新闻推送 29
6 系统部署 30
6.1 部署机器概述 30
6.2 配置环境 30
6.3 系统运行 30
7 结论 31
参考文献 32
致 谢 34
附录:代码架构及实现 35
1工程代码架构 35
2新闻爬取模块 35
1)相应主题对应新闻页面链接的爬取 35
2)新闻页面内容的爬取(主要是凤凰新闻网) 37
3)python连接mongodb数据库 40
3导航栏实现 41
4 新闻列表的加载 43
5 新闻内容页面的显示 52
6 用户注册 57
7 用户登录 61
8 新闻推荐模块 63
5 新闻聚合网站的实现
5.1 项目架构及运行
5.1.1 项目架构

  • 前端框架 : bootstrap
  • 服务器框架 : node.js koa2
  • 数据库 : mongodb
    5.1.2 运行
    首先安装node.js和mongodb
    网页端:进入NewsAggregationWebsiteKoa2工程目录,在cmd运行npm install命令安装项目运行需要的模块。
    在运行项目之前需要先运行新闻的爬取项目将新闻爬取到数据库中,新闻爬取的项目在PhoenixNews目录下,每次运行服务器需要在NewsAggregationWebsiteKoa2目录下运行npm start命令打开服务器。
    随后在浏览器加载页面:localhost:3000/ 即可访问相应网站。
    android端:android工程在NewsAggregrationApp下。
    由于网页端设置为了响应式,并且支持移动端设备,所以APP直接调用了一个webview显该网页在运行前需要修改MainActivity.java中的打开网页的ip地址的路径,设置为相应的ip地址即可。
    5.2 功能划分
    5.2.1 新闻爬取模块
    新闻爬取模块由python实现。首先从各个新闻网站抓取新闻,并在抓取的过程中实现了对新闻的分类,例如:国际,军事,财经,文化,公益等。不同类别的新闻储存在数据库不同的类别中。
    在爬取新闻内容时会爬取新闻的标题,新闻发布的时间,以及记录下新闻原网站的网址。新闻的内容会分为三类:p代表不同段落,strong代表加粗的字体和段落,img代表图片。如果是图片,则保存下该图片的链接。
    5.2.2 新闻列表加载模块
    通过向服务器发送相应新闻的类别,从服务器获取到该新闻类别下所有新闻的列表。然后将该新闻类别下所有新闻的预览通过js动态加载到网页中。并在加载的过程中实现了分页的功能。
    用户可以在新闻列表中选中或者取消喜欢的新闻,选中或者取消选中喜欢的新闻通过向服务器发送添加或删除喜欢新闻的请求实现。
    5.2.3 新闻内容加载模块
    通过向服务器发送该新闻的id,从服务器获取该新闻的详细内容及信息,并加载到网页端。
    用户在进入该网页时,会向服务器发送增加用户浏览记录的请求。服务器收到请求后会在用户相应的浏览记录中增加该新闻的记录。
    用户同样可以在该页面选中或者取消选中喜欢的新闻。
    5.2.4 用户管理模块
    用户可以通过注册模块向系统中注册,需要输入用户名,邮箱和密码,邮箱是唯一属性,用户注册时会检测该邮箱用户是否已经存在。邮箱需要是正确的邮箱的格式,密码需要保证两次密码输入完全相同。
    用户登录输入邮箱和密码即可,向服务器发送请求后,服务器端会检测用户邮箱是否存在、邮箱和密码是否匹配等。
    访问新闻页面时会检测此时用户是否登录,如果用户已经登录,则会记录用户的浏览新闻记录和同步用户关注或取消关注新闻的操作,统计出的数据用户用户新闻的个性推荐的分析。
    5.2.5 服务器路由模块
    node.js下的routes根据前端请求的路径对请求进行分类,然后调用不同的模块对不同的请求进行处理,进而返回不同的数据。
    5.2.6 数据库交互模块
    通过不同的接口直接与数据库进行交互并返回结果。与mongodb的交互通过mongoose模块实现。
    5.2.7 新闻推荐模块
    新闻推荐模块通过分析用户浏览新闻和关注新闻话题的个数得到用户比较喜爱的新闻的话题。在这些话题中的每个话题中提取一定数量的新闻(不包含用户浏览过的和关注过的新闻),得到新闻列表后返回给前端页面。
    每次得到的新闻列表都会根据用户的浏览记录和关注新闻的记录动态生成。
    5.2.8 Android客户端模块
    由于前端在实现界面时实现了响应式的页面,故在android客户端只需调用一个webView将相应的网址加载出来即可以实现APP同样的功能。
    新闻的推送通过APP定时向服务器发送获取推送的请求,服务器向Android客户端返回相应的推送的内容。客户端在获取推送内容后将推送内容推送至Andorid手机的状态栏,提醒用户观看相关新闻。
    服务器推送的内容即为推荐新闻栏目的第一条新闻。
    本文转载自:http://www.biyezuopin.vip/onews.asp?id=16490
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)


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

  • 2
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

biyezuopinvip

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值