代码拉取完成,页面将自动刷新
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()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。