首先看一下示例图,按顺序以下页面称 首页,什么都有(乱取的),登录页,资源管理
开始。
bootstarp模板包下载地址https://codeload.github.com/twbs/bootstrap/zip/v3.4.1
前端页面确实是个难事,资源管理页面和首页,用的分别是layui的模板与bootstrap,我也只会对模板进行使用。首先来看首页代码,本界面使用的是carousel,方法:直接将html代码拷贝,然后用block块给head,body ,content,css,js等包起来,运行即可看到效果。注意:js,css文件要和代码同位置。
html代码,在相应的地方设置href的链接地址即可跳转。
{% extends "bootstrap/base.html" %}
{%- block head %}
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
<title>首页</title>
{%- block styles %}
<link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
<!-- Bootstrap core CSS -->
{# <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">#}
<link href="../static/css/bootstrap.min.css" rel="stylesheet">
<link href="../static/css/carousel.css" rel="stylesheet">
{%- endblock styles %}
{%- endblock head %}
{% block body -%}
{% block navbar %}
<!-- NAVBAR
================================================== -->
<body>
<div class="navbar-wrapper">
<div class="container">
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">ckq的首页</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">主页</a></li>
<li><a href="#">前端怎么做?</a></li>
<li><a href="#">联系</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li><a href="#">Separated link</a></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</div>
</div>
{%- endblock navbar %}
{% block content -%}
<!-- Carousel
================================================== -->
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide" src="../static/img3.jpg" alt="First slide">
<div class="container">
<div class="carousel-caption">
<h1>我不是我没有</h1>
<p>建议女孩子出门穿的多一点,穿的太漏容易被人跟踪,我今天就跟踪了一个</p>
<p><a class="btn btn-lg btn-primary" href="#" role="button">点了没用没加链接</a></p>
</div>
</div>
</div>
<div class="item">
<img class="second-slide" src="../static/img2.jpg" alt="Second slide">
<div class="container">
<div class="carousel-caption">
<h1>球球你了</h1>
<p>如果十年后,你的老公天天和你吵,孩子成绩也不好,你会不会后悔今天没有私聊我</p>
<p><a class="btn btn-lg btn-primary" href="#" role="button">点了没用没加链接</a></p>
</div>
</div>
</div>
<div class="item">
<img class="third-slide" src="../static/img1.jpg" alt="Third slide">
<div class="container">
<div class="carousel-caption">
<h1>想植发</h1>
<p>手机真会偷窥隐私啊,我上一秒用前置挤痘痘,下一秒就给我推整容医院是吧?</p>
<p><a class="btn btn-lg btn-primary" href="#" role="button">点了没用没加链接</a></p>
</div>
</div>
</div>
</div>
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div><!-- /.carousel -->
<!-- Marketing messaging and featurettes
================================================== -->
<!-- Wrap the rest of the page in another container to center all the content. -->
<div class="container marketing">
<!-- Three columns of text below the carousel -->
<div class="row">
<div class="col-lg-4">
<img class="img-circle" src="../static/bumiao.jpg" alt="Generic placeholder image" width="140" height="140">
<h2>资源管理</h2>
<p>女孩子要多做一点坏事,老天爷一生气说不定就给你发个小伙</p>
<p><a class="btn btn-default" href="/form2" role="button">开始管理服务器资源 »</a></p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="img-circle" src="../static/bumiao.jpg" alt="Generic placeholder image" width="140" height="140">
<h2>什么都有</h2>
<p>什么地方妖气最重?钢琴和邮箱,因为钢琴住了几个妖,邮箱住了几个魔</p>
<p><a class="btn btn-default" href="/smdy" role="button">说了都有就是都有!!! »</a></p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="img-circle" src="../static/bumiao.jpg" alt="Generic placeholder image" width="140" height="140">
<h2>不知道链接到哪</h2>
<p>我有权保持沉默,沉船说</p>
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
</div><!-- /.col-lg-4 -->
</div><!-- /.row -->
</div>
{%- endblock content %}
{% block scripts %}
<script src="{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
<script src="{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
{# <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>#}
<script src="../static/js/jquery-1.11.1.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
{# <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>#}
<script src="../static/js/bootstrap.min.js"></script>
{%- endblock scripts %}
{%- endblock body %}
python使用:
安装包flask_bootstrap ,然后导入from flask_bootstrap import Bootstrap
声明对象app = Flask(__name__) bootstrap=Bootstrap(app)
接下来是登录页(点击资源管理进入)
登录页的html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style type="text/css">
#login{
position: absolute;
top: 50%;
left:50%;
margin: -150px 0 0 -150px;
width: 300px;
height: 300px;
}
#form1{
position: absolute;
}
#yzm{
position: absolute;
left:100%;
top:53%
}
</style>
<body background="../static/bjt.jpg" style=" background-repeat:no-repeat ;background-size:100% 100%;
background-attachment: fixed;">
<div id="login">
<form method="post" id="form1" style="margin:0px;display:inline;">
{{form.csrf_token()}}
{{form.username.label}}{{form.username}}<br>
{{form.password.label}}{{form.password}}<br>
{{form.yzm1.label}}{{form.yzm1}}<input type="button" id="yzm" style="height:20px;width:120px;" value="点击发送验证码" onclick="sendCode(this)" /><br>
<script src="../static/js/jquery-1.11.1.min.js"></script>
<script type=text/javascript>
$(function() {
$('#yzm').bind('click', function() {
$.getJSON('/email_send',
function(data) {
//do nothing
});
return false;
});
});
</script>
<script type="text/javascript">
var clock = '';
var nums = 10;
var btn;
function sendCode(thisBtn)
{
btn = thisBtn;
btn.disabled = true; //将按钮置为不可点击
btn.value = nums+'秒后可重新获取';
clock = setInterval(doLoop, 1000); //一秒执行一次
}
function doLoop()
{
nums--;
if(nums > 0){
btn.value = nums+'秒后可重新获取';
}else{
clearInterval(clock); //清除js定时器
btn.disabled = false;
btn.value = '点击发送验证码';
nums = 10; //重置时间
}
}
</script>
{{form.submit}}<br>
{% for msg in get_flashed_messages() %}
{{ msg }}
{% endfor %}
</form>
</div>
</body>
</html>
然后是python代码,此处使用的wtforms来管理,首先下载包,然后导入,使用wtforms可以通过配置参数来设置必填字段DataRequired()
对于submit的css,可以通过自定义css传递进去
发送邮件使用的网易邮箱与flask_mail,网易邮箱需要先开启配置,MAIL_PASSWORD系写的是邮箱的授权密码
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo
from flask_wtf import FlaskForm
from flask_mail import Mail,Message
app.secret_key = 'ckq'
app.config["MAIL_SERVER"] = "smtp.163.com"
app.config["MAIL_PORT"] = 465
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = "chenkq1204@163.com"
app.config["MAIL_PASSWORD"] = "EZYHEUFHFFDSKOJU"
mail = Mail(app)
class LoginForm(FlaskForm):
username = StringField(u'用户名:',validators=[DataRequired()])
password = PasswordField(u'密码:',validators=[DataRequired()])
yzm1 = PasswordField(u'验证码:',validators=[DataRequired()])
submit = SubmitField(u'登录',render_kw=style)#传入css
code = ""
style ={
'class': 'ourClasses', 'style': 'width:50%;position:absolute; left:25%;bottom:-20%;right:50%;other_css_style;'
}
def sj_code():
global code
code = random.randint(10000,99999)#生成随机验证码
@app.route('/email_send',methods=['GET','POST'])
def email_send():
message = Message("标题", sender=app.config["MAIL_USERNAME"], recipients=["chenkq1204@163.com"])#发送邮件到recipients
sj_code()
message.body = "验证码为{0}".format(code)
with app.app_context():
mail.send(message)
print('test')
return 'test'
@app.route('/form2',methods=['GET','POST'])
def login():
login = LoginForm()
db = pymysql.connect(host="localhost", user="root", password="Asdfg12345", database="skt",charset="utf8")
cursor = db.cursor()
# SQL查找数据库中的账号信息,返回账号不存在,密码错误等
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
yzm1 = request.form.get('yzm1')
sql = "select * from user where user_name='{0}' and user_passwd='{1}'".format(username,password)
sql_passwd = "select * from user where user_passwd='{0}'".format(password)
sql_name = "select * from user where user_name='{0}' ".format(username)
print(sql)
try:
# 执行sql语句
cursor.execute(sql_name)
results = cursor.fetchall()
print(len(results))
if len(results) == 1:
cursor.execute(sql_passwd)
results = cursor.fetchall()
if len(results) == 1:
print(yzm1,code)
if str(yzm1) == str(code):
return redirect('/dashboard')
else:
flash('验证码错误')
return redirect('/form2')
else:
flash('密码错误')
return redirect('/form2')
else:
flash('账号不存在')
return redirect('/form2')
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
traceback.print_exc()
db.rollback()
# 关闭数据库连接
db.close()
return render_template('login.html',form=login)
sql创建的代码我也贴一下
CREATE TABLE user(
user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(40) NOT NULL,
user_passwd VARCHAR(40) NOT NULL,
PRIMARY KEY ( user_id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> INSERT INTO user (user_name, user_passwd) VALUES ("ckq", "Asdfg12345");
然后是dashboard页,该页面前端使用的layui。
参考文章
https://blog.csdn.net/weixin_33774615/article/details/88860240
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php echo $curTitle;?></title>
<link rel="stylesheet" href="../static/layui/css/layui.css">
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo">ckq的服务器管理</div>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
ckq的服务器资源
</li>
<li class="layui-nav-item"><a href="">安全退出</a></li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧垂直导航区域-->
<ul class="layui-nav layui-nav-tree" lay-filter="test">
<li class="layui-nav-item">
<a class="" href="javascript:;">资源</a>
<dl class="layui-nav-child">
<dd>
<a id="bar1" href="javascript:;" data-id="1" data-title="内存cpu" data-url="/te"
class="site-demo-active" data-type="tabAdd">内存cpu</a></dd>
<dd><a href="javascript:;" data-id="2" data-title="进程" data-url="/bfb"
class="site-demo-active" data-type="tabAdd">进程</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">日志管理</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;" data-id="3" data-title="日志查看" data-url="index.php?&a=adminList" class="site-demo-active" data-type="tabAdd">日志查看</a>
</dd>
<dd><a href="javascript:;">xxx</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">用户管理</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">权限设置</a></dd>
<dd><a href="javascript:;">公告设置</a></dd>
<dd><a href="javascript:;">控制台</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<!--tab标签-->
<div class="layui-tab" lay-filter="demo" lay-allowclose="true" style="margin-left: 200px;">
<ul class="layui-tab-title"></ul>
<!-- <div class="layui-tab-content">-->
<div class="layui-tab-content" >
<!-- <button type="button" οnclick="javascript:location.reload()">刷新</button>-->
</div>
<div class="layui-footer" style="text-align:center;">
<!-- 底部固定区域 -->
© ckq.tk ckq服务器
</div>
</div>
<script src="../static/layui/layui.js"></script>
<script>
layui.use(['element', 'layer', 'jquery'], function () {
var element = layui.element;
// var layer = layui.layer;
var $ = layui.$;
// 配置tab实践在下面无法获取到菜单元素
$('.site-demo-active').on('click', function () {
var dataid = $(this);
//这时会判断右侧.layui-tab-title属性下的有lay-id属性的li的数目,即已经打开的tab项数目
if ($(".layui-tab-title li[lay-id]").length <= 0) {
//如果比零小,则直接打开新的tab项
active.tabAdd(dataid.attr("data-url"), dataid.attr("data-id"), dataid.attr("data-title"));
} else {
//否则判断该tab项是否以及存在
var isData = false; //初始化一个标志,为false说明未打开该tab项 为true则说明已有
$.each($(".layui-tab-title li[lay-id]"), function () {
//如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到,则说明该tab项已经打开
if ($(this).attr("lay-id") == dataid.attr("data-id")) {
isData = true;
}
})
if (isData == false) {
//标志为false 新增一个tab项
active.tabAdd(dataid.attr("data-url"), dataid.attr("data-id"), dataid.attr("data-title"));
}
}
//最后不管是否新增tab,最后都转到要打开的选项页面上
active.tabChange(dataid.attr("data-id"));
});
var active = {
//在这里给active绑定几项事件,后面可通过active调用这些事件
tabAdd: function (url, id, name) {
//新增一个Tab项 传入三个参数,分别对应其标题,tab页面的地址,还有一个规定的id,是标签中data-id的属性值
//关于tabAdd的方法所传入的参数可看layui的开发文档中基础方法部分
element.tabAdd('demo', {
title: name,
content: '<iframe data-frameid="' + id + '" scrolling="auto" frameborder="0" src="' + url + '" style="width:100%;height:99%;"></iframe>',
id: id //规定好的id
})
FrameWH(); //计算ifram层的大小
},
tabChange: function (id) {
//切换到指定Tab项
element.tabChange('demo', id); //根据传入的id传入到指定的tab项
},
tabDelete: function (id) {
element.tabDelete("demo", id);//删除
}
};
function FrameWH() {
var h = $(window).height();
$("iframe").css("height",h+"px");
}
});
</script>
</div></body>
</html>
设置点击显示的柱状图方法,其实就是将一个新html网页放在入右侧。右侧地址为/te
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Awesome-pyecharts</title>
<script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
<script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
<button type="button" onclick="javascript:location.reload()">刷新</button>
<div id="bar" style="width:1000px; height:600px;"></div>
<script>
var chart = echarts.init(document.getElementById('bar'), 'light', {renderer: 'canvas'});
$(
function () {
fetchData(chart);
setInterval(fetchData, 20000);
}
);
function fetchData() {
$.ajax({
type: "GET",
url: "/barChart",
dataType: 'json',
success: function (result) {
chart.setOption(result);
}
});
}
</script>
</body>
</html>
如代码,需要使用pyecharts来绘制图表,/te会监听/barchat路由也就是图表,就是说我们需要新建个pyecharts图表的路由来给te
def bar_base() -> Bar:
mem = psutil.virtual_memory().percent
cpu = psutil.cpu_percent(interval=1)
c = (
Bar(
init_opts=opts.InitOpts(animation_opts=opts.AnimationOpts(
animation_delay=1000, animation_easing="elasticOut"
),theme="light")
)
.set_global_opts(
title_opts=opts.TitleOpts(title="内存cpu资源", subtitle="服务器"),
toolbox_opts=opts.ToolboxOpts(
# 是否显示该工具
is_show=True,
),
)
.add_xaxis(["本机"])
.add_yaxis("mem", [mem])
.add_yaxis("cpu", [cpu])
.set_series_opts(markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值"),
]
), # 局部配置,这里设置凸显出值
)
)
return c
@app.route("/barChart")
def get_bar_chart():
c = bar_base()
return c.dump_options_with_quotes()
接下来是服务器使用内存占比前几的进程
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<div class="row">
<div class="col-md-6 col-sm-12 col-xs-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3>使用内存前几的进程</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<button type="button" onclick="javascript:location.reload()">刷新</button>
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
{% for i in labels %}
<td>{{ i }}</td>
{% endfor %}
</tr>
</thead>
<tbody>
{% for i in content %}
<tr>
{% for j in i.split() %}
<td>{{ j }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
crossorigin="anonymous"></script>
</body>
</html>
@app.route('/bfb')
def bfb():
m = os.popen('ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head ')
labels = ['USER','PID','%CPU','%MEM','VSZ','RSS', 'TTY','STAT','START','TIME','COMMAND']
#content = open('bfb.txt').readlines()
return render_template('bfb.html', labels=labels, content=m)
最后是什么都有。。。页面
上代码,灵感来源 b站视频搜索《flask疫情可视化》,参考了布局设置
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>疫情监控</title>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="../static/js/jquery-1.11.1.min.js"></script>
<script src="../static/js/echarts.min.js"></script>
<script src="../static/js/china.js"></script>
<!-- <script src="../static/js/echarts-wordcloud.min.js"></script>-->
<link rel="stylesheet" href="../static/css/main.css">
</head>
<body>
<video id="v1" autoplay loop muted>
<source src="../static/video2.mp4" type="video/mp4" />
</video>
<div id="title">什么都有</div>
<div id="tim" class="time"><font color="white"></font></div>
<div id="l1"></div>
<div id="l2"></div>
<div id="c1" >
<h2><font color="white">微博热搜榜</font> </h2>
<ul class="list_a">
{% for i in data %}
<li>
<a href="{{ i.url }}">
<i class="icon icon_pinned"></i>
<span>{{i.title}}<em>{{i.hotness}}</em></span>
<i class="icon icon_hot"></i>
</a>
</li>
{% endfor %}
</ul>
</div>
<div id="c2" ></div>
<div id="r1">右二</div>
<div id="r2">
<center>
<input type="file" id="inputfile" name="fileContent">
<svg width="600" height="400"></svg>
<script src="../static/js/config.js"></script>
<script src="../static/js/imgs.js"></script>
<script src="../static/js/color_ranges.js"></script>
<script src="../static/js/colors.js"></script>
<script src="../static/js/visual.js"></script>
<link rel="../static/stylesheet" href="stylesheet.css">
</center>
<!-- 右二-->
<!--<div class="content" id="content">-->
<!-- <span class="change left" id="pre">-->
<!-- <-->
<!-- </span>-->
<!-- <span class="change right" id="next">-->
<!-- >-->
<!-- </span>-->
<!-- <ul class="contentList" id="contentList">-->
<!-- <li><img src="../static/img1.jpg" /></li>-->
<!-- <li><img src="../static/img2.jpg" /></li>-->
<!-- <li><img src="../static/img3.jpg" /></li>-->
<!-- <li><img src="../static/img4.jpg" /></li>-->
<!-- </ul>-->
<!-- <div class="shade">-->
<!-- <ul class="contentRount" id="contentRount">-->
<!-- <li></li>-->
<!-- <li></li>-->
<!-- <li></li>-->
<!-- <li></li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type="text/javascript" src="js/carous.js">-->
<!-- </script>-->
</div>
<script src="../static/js/ec_center.js"></script>
<!-- <script src="../static/js/ec_left1.js"></script>-->
<!-- <script src="../static/js/ec_left2.js"></script>-->
<!-- <script src="../static/js/ec_right1.js"></script>-->
<!-- <script src="../static/js/ec_right2.js"></script>-->
<!-- <script src="../static/js/controller.js"></script>-->
<script src="../static/js/controller.js"></script>
<script src="../static/js/ec_left1.js"></script>
<script src="../static/js/ec_left2.js"></script>
<script src="../static/js/ec_right1.js"></script>
</body>
</html>
import requests
from bs4 import BeautifulSoup
def wbpq():
news = []
# 新建数组存放热搜榜
hot_url = 'https://s.weibo.com/top/summary/'
# 热搜榜链接
r = requests.get(hot_url)
# 向链接发送get请求获得页面
soup = BeautifulSoup(r.text, 'lxml')
# 解析页面
urls_titles = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > a')
hotness = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > span')
for i in range(11):
hot_news = {}
# 将信息保存到字典中
hot_news['title'] = urls_titles[i].get_text()
# get_text()获得a标签的文本
hot_news['url'] = "https://s.weibo.com" + urls_titles[i]['href']
# ['href']获得a标签的链接,并补全前缀
hot_news['hotness'] = hotness[i].get_text()
# 获得热度文本
news.append(hot_news)
# 字典追加到数组中
return news
@app.route('/smdy')
def smdy():
return render_template('smdy.html',data=wbspider.wbpq())
这个页面关于js以及css的代码挺多的,就不一一放了