1 Star 0 Fork 0

yu20/news_spider

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
app.py 6.12 KB
一键复制 编辑 原始数据 按行查看 历史
yu 提交于 2022-04-12 12:50 . 修改新闻页面按id倒序显示
import os
#render_template渲染模板
from flask import Flask,render_template,request
#数据库
import sqlite3
#分页插件
from flask_pagination import Pagination
#绘图词云
from matplotlib import pyplot as plt #绘图
from wordcloud import WordCloud #词云
from collections import Counter #两个字典取并集,重点在于对相同key的value相加。获得词频字典
#SQLAlchemy ,Python工具包是一个强大的ORM Mapper
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) #models中含有,只能使用一个
##############分页###############################
base_dir = os.path.abspath(os.path.dirname(__file__)) # 获取文件的绝对路径
#用于连接的数据库 URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(base_dir, 'news.db') # 配置数据库的绝对路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 配置相关设置
db = SQLAlchemy(app) # SQLAlchemy()为了下面的类继承db.Model
class News(db.Model):
__tablename__ = "newsInfo" # 注意表单的名称
id = db.Column(db.Integer, primary_key=True, nullable=False) # 编号
type = db.Column(db.String(100)) #unique如果设为 True,这列不允许出现重复的值
url = db.Column(db.String(100))
title = db.Column(db.String(100))
day = db.Column(db.String(100))
views = db.Column(db.Integer)
keywords = db.Column(db.String(100))
#############################################
@app.route('/')
def index():
data = [] # 存放总新闻数和总浏览量
conn = sqlite3.connect("news.db")
cur = conn.cursor()
sql = "select count(id),sum(views) from newsInfo"
item = cur.execute(sql)
for i in item:
data.append(i[0])
data.append(i[1])
#print(data)
return render_template("index.html", data=data)
'''
Paginator分页,可接受的分页对象必须是orm的查询集或者list、tuple。
当需要使用原生sql查询数据,分页就无法使用Paginator。
'''
@app.route('/new')
def new():
datalist = [] # 存放数据
conn = sqlite3.connect("news.db")
cur = conn.cursor()
sql = "select id,type,url,title,day,views from newsInfo"
data = cur.execute(sql)
for item in data:
datalist.append(item)
cur.close()
conn.close()
page = int(request.args.get('page', 1)) #默认值为1
# page = 1
#paginate = News.query.paginate(page=int(page), per_page=10) #每页10条
paginate = News.query.order_by(News.id.desc()).paginate(page=int(page), per_page=10) # 每页10条
news = paginate.items
return render_template("new.html", news=news, pagination=paginate)
@app.route('/type')
def type():
type = [] #六个类型
num = [] #每个类型的总数量
conn = sqlite3.connect("news.db")
cur = conn.cursor()
sql = "select type,count(type) from newsInfo group by type"
data = cur.execute(sql)
#['llxx', 'mtjj', 'wmcj', 'xxyw', 'zhxw', 'ztwz']
for item in data:
if item[0] == 'xxyw':
type.append('学校要闻')
elif item[0] == 'zhxw':
type.append('综合新闻')
elif item[0] == 'llxx':
type.append('理论学习')
elif item[0] == 'mtjj':
type.append('媒体聚焦')
elif item[0] == 'wmcj':
type.append('文明创建')
else:
type.append('专题网站')
#添加数量
num.append(item[1])
cur.close()
conn.close()
#print(type)
return render_template("type.html", type=type, num=num)
#词云
# 根据词频生成词云
def create_word_cloud(): #取并集有点慢慢慢
# 1 获取词语
datas = ""
conn = sqlite3.connect("news.db") # 表示上一级目录下面的文件
cur = conn.cursor()
sql = "select keywords from newsInfo"
dat = cur.execute(sql)
for item in dat:
if (item[0] != ""): #关键词可能为空
datas = ''.join([datas, item[0]]) #不断的在字符串后面追加
#2 得到词频数组
#首先以空格分隔成为字符串数组,
#然后由于最后一个为空['学校:9', ''],故用split去掉最后一个字符串
datas = datas.strip(" ").split(" ")
cur.close()
conn.close()
#3 生成词频字典
frequencies = {}
for data in datas:
arr = data.split(":") # bug:最后一个为空
frequency = {} # 只存放一个,每次归零
frequency[arr[0]] = int(arr[1])
#取并集(相同关键字,可能出现多次)
X, Y = Counter(frequency), Counter(frequencies)
frequencies = dict(X + Y)
#print(frequencies)
wc = WordCloud(
background_color="white",
font_path=r"../static/font/msyh.ttc",
max_words=100, #指定词云显示的最大单词数量
width=2000,
height=1200,
)
# 根据词出现的频率生成词云
word_cloud = wc.generate_from_frequencies(frequencies)
# 显示词云文件
plt.imshow(word_cloud)
plt.axis("off")
#plt.show() #不能与savefig()同时执行
# 写词云图片,保存成图片
#plt.savefig(r'.\static\assets\img\wordcloud.jpg', dpi=500)
word_cloud.to_file(r'.\static\assets\img\wordcloud.jpg')
print("词云图保存成功!")
# 根据词频生成词云#############################################
#create_word_cloud()
@app.route('/word')
def word():
return render_template("word.html")
#获取十条热搜新闻,返回列表
def getHot():
newlist = []
conn = sqlite3.connect("news.db") # 表示上一级目录下面的文件
cur = conn.cursor()
#浏览量最高的十条新闻
sql = "select url,title,views from newsInfo order by views desc limit 10"
new = cur.execute(sql)
flag = 1
for item in new:
data = []
data.append(flag)
flag+=1
data.append(item[0])
data.append(item[1])
data.append(item[2])
#\u200b是不可见字符,trim()无法去掉,要用replace
newlist.append(data)
#print(newlist)
return newlist
#热搜
@app.route('/hot')
def hot():
newlist = getHot()
return render_template("hot.html", newlist=newlist)
if __name__ == '__main__':
app.run()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/yu20/news_spider.git
[email protected]:yu20/news_spider.git
yu20
news_spider
news_spider
master

搜索帮助