开发公司爬虫保姆级教程3:利用python-Flask框架搭建本地数据可视化网站

成果展示:

(1)网站首页:

(2)电影页

(3) 开发公司电影评分页

(4) 开发公司词频统计页

(5)团队页面

开发公司接下来让我们看看上述开发公司网站是如何完成的:
开发公司首先简单介绍一下框架:

Flask开发公司主要功能有两个:

(1)Werkzeug——路由转换

(2)jinja2——框架渲染 

1、环境搭建:

下载python-Flask扩展包

pip install flask

将Flask开发公司模块导入程序中:

from flask import Flask

2、用Flask开发公司搭建第一个网络服务器程序——输出Hello,World!

代码:

  1. from flask import Flask
  2. app = Flask(__name__)
  3. #路由解析:开发公司通过用户访问的路径,开发公司匹配相应函数
  4. @app.route('/')
  5. def h():
  6. return 'hello world'
  7. if __name__ == '__main__':
  8. app.run()

输出:

 

开发公司复制输出结果中的网址,开发公司然后在浏览器中打开,开发公司页面显示如下:

 

 成功输出“Hello World”

3、开启Debug模式

开发公司因为在制作网页中,开发公司我们要一边观察网页情开发公司况一边调试程序,开发公司所以每次都去点击打开开发公司和关闭程序按钮非常麻烦,开发公司所以为了方便debug,开发公司我们在程序中更改以下代码。

 app.run(debug=True)

完整:

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def h():
  5. return 'hello 1'
  6. if __name__ == '__main__':
  7. app.run(debug=True)

开发公司这样就能实时修改代码和网页了。

 4、开发公司向网页中传递参数:

(1)string型

路由传参,在网址路径中用<>将参数括起来,然后在访问函数中存入参数,并用占位符的方式显示参数。

  1. from flask import Flask
  2. app = Flask(__name__)
  3. #通过访问路径获取字符串参数
  4. @app.route("/test/<name>")
  5. def welcom(name):
  6. return "hello,%s"%name
  7. if __name__ == '__main__':
  8. app.run(debug=True)

输出: (*注意网址路径)

 

(2)int型

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/test/<int:id>")
  4. def welcom2(id):
  5. return "hello,%d的会员"%id
  6. if __name__ == '__main__':
  7. app.run(debug=True)

输出:

 

 

(3)float型

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/test/<float:v>")
  4. def welcom3(v):
  5. return "一共找您%.2f元钱"%v
  6. if __name__ == '__main__':
  7. app.run(debug=True)

输出:

也可以将以上例子中的函数放在一起,路由解析会自动判别你在网址传入的参数类型,并自动跳转到相应参数类型所在的函数网页。

5、访问一个.HTML文件

(1)导入模块:

        render_template

(2)创建文件夹:

        项目文件夹 ——> templates(新建)——> test.html

(3)编写程序

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def index2():
  5. return render_template("test.html")
  6. if __name__ == '__main__':
  7. app.run(debug=True)

输出:

6、向HTML网页中传递参数

(1)传入普通变量

        主程序(.py)

        在网页中显示日期。

        在html文件中,主程序传入的变量要用{{ xxx }}扣起来才能使用。

        脚本文件也是如此,但可能需要单独定义一个变量去赋值。var name = {{}}

  1. from flask import Flask,render_template
  2. import datetime
  3. app = Flask(__name__)
  4. @app.route("/time")
  5. def index():
  6. times = datetime.date.today()#普通变量
  7. return render_template("test2.html",var = times)
  8. if __name__ == '__main__':
  9. app.run(debug=True)

        HTML文件(.html)

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. 今天的时间是{{var}},Hello,HTML!
  9. </body>
  10. </html>

      输出:

(2)传入列表变量

主程序:

  1. from flask import Flask,render_template
  2. import datetime
  3. app=Flask(__name__)
  4. @app.route("/time")
  5. def index():
  6. time = datetime.date.today()#普通变量
  7. name = ["小王","小刘","小赵"]#列表类型
  8. return render_template("test3.html",var = time,list=name)
  9. if __name__ == '__main__':
  10. app.run(debug=True)

html文件:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. 今天的时间是{{var}},Hello HTML!<br />
  9. 今天值班的有:<br />
  10. {% for data in list %}<!--用大括号括起来的是控制结构,还有if-->
  11. <li> {{data}} </li><!--打印列表-->
  12. {% endfor %}
  13. </body>
  14. </html>

输出:

(3)输出表格

 html文件

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. 今天的时间是{{var}},Hello HTML!<br />
  9. 今天值班的有:<br />
  10. {% for data in list %}<!--用大括号括起来的是控制结构,还有if-->
  11. <li> {{data}} </li><!--打印列表-->
  12. {% endfor %}
  13. 任务:<br/><!--在页面打印表格与迭代-->
  14. <table border="1">
  15. <tr>
  16. <!--一行-->
  17. <td>第一列</td><!--一列-->
  18. <td>第二列</td><!--二列-->
  19. </tr>
  20. <tr>
  21. <!--一行-->
  22. <td>第一列</td><!--一列-->
  23. <td>第二列</td><!--二列-->
  24. </tr>
  25. <tr>
  26. <!--一行-->
  27. <td>第一列</td><!--一列-->
  28. <td>第二列</td><!--二列-->
  29. </tr>
  30. </table>
  31. </body>
  32. </html>

输出:

 

(4)传入字典变量

 主程序:

  1. from flask import Flask,render_template
  2. import datetime
  3. app=Flask(__name__)
  4. @app.route("/time")
  5. def index():
  6. time = datetime.date.today()#普通变量
  7. name = ["小王","小刘","小赵"]#列表类型
  8. task = {"任务":"打扫卫生","时间":"三个小时"}#字典类型
  9. return render_template("test3.html",var = time,list=name,task=task)
  10. if __name__ == '__main__':
  11. app.run(debug=True)

html:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. 今天的时间是{{var}},Hello HTML!<br />
  9. 今天值班的有:<br />
  10. {% for data in list %}<!--用大括号括起来的是控制结构,还有if-->
  11. <li> {{data}} </li><!--打印列表-->
  12. {% endfor %}
  13. 任务:<br/><!--在页面打印表格与迭代-->
  14. <table border="1">
  15. {% for key,value in task.items() %}<!--[(key,value),(key,value),(key,value)]-->
  16. <tr>
  17. <td>{{key}}</td>
  18. <td>{{value}}</td>
  19. </tr>
  20. {% endfor %}
  21. </table>
  22. </body>
  23. </html>

输出:

 7、网页请求与响应

在项目文件夹中新建文件夹test,在test中新建register.html和result.html两个HTML文件。

主程序:

  1. from flask import Flask,render_template
  2. import datetime
  3. app=Flask(__name__)
  4. #表单提交
  5. @app.route('/test/register')#网址
  6. def register():
  7. return render_template("test/register.html")#文件夹路径
  8. #接收到表单提交的路由,需要指定methods为post
  9. @app.route('/result',methods=['POST','GET'])
  10. def result():
  11. return render_template("test/result.html")
  12. if __name__ == '__main__':
  13. app.run(debug=True)

register.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. <form action="http://127.0.0.1:5000/result" method="post">
  9. <p>姓名:<input type="text" name="姓名"></p><!--{"姓名":"text"}-->
  10. <p>年龄:<input type="text" name="年龄"></p>
  11. <p>性别:<input type="text" name="性别"></p>
  12. <p>住址:<input type="text" name="住址"></p>
  13. <p><input type="submit" value="提交"></p>
  14. </form>
  15. </body>
  16. </html>

result.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. result
  9. </body>
  10. </html>

输出:

点击提交后:

 

将result页面改为数据表单:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. </head>
  7. <body>
  8. <table border="1">
  9. {% for key,value in result.items() %}
  10. <tr>
  11. <th>{{key}}</th>
  12. <td>{{value}}</td>
  13. </tr>
  14. {% endfor %}
  15. </table>
  16. </body>
  17. </html>

输出结果:

注意:

  在上面的register.html代码中,网址响应部分是我们固定写好的,如果我们想让他自己去填写路径应该这么做:

动态访问页面:

url_for("访问路由名字")

返回的是'/result'

 <form action="{{url_for('result')}}" method="post">

8、制作网站

(1)准备模板

模板网站:

示例模板:

(淘宝1毛钱一个)

下载完的网站文件夹:

 1、把assets和index.html复制到我们的项目文件夹。

2、将html文件放入项目中的templates文件夹。(最好copy一份做备份。)

3、新建一个static文件夹用来存放资源文件。(将asset放入static文件中。)

准备工作做好了,接下来开始制作网页!

提供一个图标网站(以后可能会用到):

矢量图的使用方法:

(2)制作首页

index.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>豆瓣Top250数据可视化分析</title>
  7. <meta content="" name="descriptison">
  8. <meta content="" name="keywords">
  9. <!-- Favicons -->
  10. <link href="static/assets/img/favicon.png" rel="icon">
  11. <link href="static/assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  12. <!-- Google Fonts -->
  13. <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,600,600i,700,700i,900" rel="stylesheet">
  14. <!-- Vendor CSS Files -->
  15. <link href="static/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="static/assets/vendor/icofont/icofont.min.css" rel="stylesheet">
  17. <link href="static/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  18. <link href="static/assets/vendor/animate.css/animate.min.css" rel="stylesheet">
  19. <link href="static/assets/vendor/venobox/venobox.css" rel="stylesheet">
  20. <link href="static/assets/vendor/aos/aos.css" rel="stylesheet">
  21. <!-- Template Main CSS File -->
  22. <link href="static/assets/css/style.css" rel="stylesheet">
  23. </head>
  24. <body>
  25. <!-- ======= Header ======= -->
  26. <header id="header">
  27. <div class="container">
  28. <div class="logo float-left">
  29. <h1 class="text-light"><a href="/index"><span>DouBan</span></a></h1>
  30. <!-- Uncomment below if you prefer to use an image logo -->
  31. <!-- <a href="index.html"><img src="static/assets/img/logo.png" alt="" class="img-fluid"></a>-->
  32. </div>
  33. <nav class="nav-menu float-right d-none d-lg-block">
  34. <ul>
  35. <li class="active"><a href="/index">首页 <i class="la la-angle-down"></i></a></li>
  36. <li><a href="/movie">电影</a></li>
  37. <li><a href="/score">评分</a></li>
  38. <li><a href="/word">词云</a></li>
  39. <li><a href="/team">团队</a></li>
  40. </ul>
  41. </nav><!-- .nav-menu -->
  42. </div>
  43. </header><!-- End Header -->
  44. <!-- ======= Our Team Section ======= -->
  45. <section id="team" class="team">
  46. <div class="container">
  47. <div class="section-title">
  48. <h2>豆瓣Top250数据可视化分析</h2>
  49. <p>应用python爬虫、Flask框架、Echarts、WordCloud等技术实现</p>
  50. </div>
  51. <!-- ======= Counts Section ======= -->
  52. <section class="counts section-bg">
  53. <div class="container">
  54. <div class="row">
  55. <div class="col-lg-3 col-md-6 text-center" data-aos="fade-up">
  56. <a href="/movie">
  57. <div class="count-box">
  58. <i class="icofont-simple-smile" style="color: #20b38e;"></i>
  59. <span data-toggle="counter-up">250</span>
  60. <p>经典电影</p>
  61. </div>
  62. </a>
  63. </div>
  64. <div class="col-lg-3 col-md-6 text-center" data-aos="fade-up" data-aos-delay="200">
  65. <a href="/score">
  66. <div class="count-box">
  67. <i class="icofont-document-folder" style="color: #c042ff;"></i>
  68. <span data-toggle="counter-up">521</span>
  69. <p>评分报告</p>
  70. </div>
  71. </a>
  72. </div>
  73. <div class="col-lg-3 col-md-6 text-center" data-aos="fade-up" data-aos-delay="400">
  74. <a href="/word">
  75. <div class="count-box">
  76. <i class="icofont-live-support" style="color: #46d1ff;"></i>
  77. <span data-toggle="counter-up">1,463</span>
  78. <p>词频统计</p>
  79. </div>
  80. </a>
  81. </div>
  82. <div class="col-lg-3 col-md-6 text-center" data-aos="fade-up" data-aos-delay="600">
  83. <a href="/team">
  84. <div class="count-box">
  85. <i class="icofont-users-alt-5" style="color: #ffb459;"></i>
  86. <span data-toggle="counter-up">15</span>
  87. <p>团队成员</p>
  88. </div>
  89. </a>
  90. </div>
  91. </div>
  92. </div>
  93. </section><!-- End Counts Section -->
  94. </div>
  95. </section><!-- End Our Team Section -->
  96. <!-- ======= Footer ======= -->
  97. <footer id="footer">
  98. <div class="container">
  99. <div class="copyright">
  100. &copy; python爬虫可视化分析实验
  101. </div>
  102. <div class="credits">
  103. Douban Movie Top <a href="https://movie.douban.com/top250" target="_blank" title="豆瓣Top250">豆瓣Top250</a> - Douban Movie <a href="https://movie.douban.com/" title="豆瓣电影" target="_blank">豆瓣电影</a>
  104. </div>
  105. </div>
  106. </footer><!-- End Footer -->
  107. <a href="#" class="back-to-top"><i class="icofont-simple-up"></i></a>
  108. <!-- Vendor JS Files -->
  109. <script src="static/assets/vendor/jquery/jquery.min.js"></script>
  110. <script src="static/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  111. <script src="static/assets/vendor/jquery.easing/jquery.easing.min.js"></script>
  112. <script src="static/assets/vendor/php-email-form/validate.js"></script>
  113. <script src="static/assets/vendor/jquery-sticky/jquery.sticky.js"></script>
  114. <script src="static/assets/vendor/venobox/venobox.min.js"></script>
  115. <script src="static/assets/vendor/waypoints/jquery.waypoints.min.js"></script>
  116. <script src="static/assets/vendor/counterup/counterup.min.js"></script>
  117. <script src="static/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
  118. <script src="static/assets/vendor/aos/aos.js"></script>
  119. <!-- Template Main JS File -->
  120. <script src="static/assets/js/main.js"></script>
  121. <style>
  122. .copyrights {
  123. text-indent: -9999px;
  124. height: 0;
  125. line-height: 0;
  126. font-size: 0;
  127. overflow: hidden;
  128. }
  129. </style>
  130. <div class="copyrights" id="links20210126">
  131. Collect from <a href="http://www.cssmoban.com/" title="网站模板">模板之家</a>
  132. <a href="https://www.chazidian.com/" title="查字典">查字典</a>
  133. </div>
  134. </body>
  135. </html>

主程序:

  1. from flask import Flask,render_template
  2. import sqlite3
  3. app = Flask(__name__)
  4. #路由解析:通过用户访问的路径,匹配相应函数
  5. @app.route('/')
  6. def index():
  7. return render_template("index.html")
  8. #返回首页
  9. @app.route('/index')
  10. def home():
  11. return render_template("index.html")
  12. #返回电影页面
  13. @app.route('/movie')
  14. def movie():
  15. datalist = []
  16. con = sqlite3.connect("moveTop.db")#打开数据库
  17. cur = con.cursor()#获取游标
  18. sql = "select * from movieTop250"#sql查询语句
  19. data = cur.execute(sql)#获取数据
  20. for item in data:#将数据保存在列表中
  21. datalist.append(item)
  22. cur.close()#关闭游标
  23. con.close()#关闭连接
  24. return render_template("movie.html",movies = datalist)
  25. #返回评分界面
  26. @app.route('/score')
  27. def score():
  28. return render_template("score.html")
  29. #返回词云界面
  30. @app.route('/word')
  31. def word():
  32. return render_template("word.html")
  33. #返回团队界面
  34. @app.route('/team')
  35. def team():
  36. return render_template("team.html")
  37. if __name__ == '__main__':
  38. app.run(debug=True)

页面展示: 

 

 

 

(3)制作电影表单

        数据库相关操作看上一个教程:

  1. #引入数据库
  2. import sqlite3

 movie函数:

  1. #返回电影页面
  2. @app.route('/movie')
  3. def movie():
  4. datalist = []
  5. con = sqlite3.connect("moveTop.db")#打开数据库
  6. cur = con.cursor()#获取游标
  7. sql = "select * from movieTop250"#sql查询语句
  8. data = cur.execute(sql)#获取数据
  9. for item in data:#将数据保存在列表中
  10. datalist.append(item)
  11. cur.close()#关闭游标
  12. con.close()#关闭连接
  13. return render_template("movie.html",movies = datalist)

 movie.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>豆瓣Top250数据可视化分析</title>
  7. <meta content="" name="descriptison">
  8. <meta content="" name="keywords">
  9. <!-- Favicons -->
  10. <link href="static/assets/img/favicon.png" rel="icon">
  11. <link href="static/assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  12. <!-- Google Fonts -->
  13. <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,600,600i,700,700i,900" rel="stylesheet">
  14. <!-- Vendor CSS Files -->
  15. <link href="static/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="static/assets/vendor/icofont/icofont.min.css" rel="stylesheet">
  17. <link href="static/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  18. <link href="static/assets/vendor/animate.css/animate.min.css" rel="stylesheet">
  19. <link href="static/assets/vendor/venobox/venobox.css" rel="stylesheet">
  20. <link href="static/assets/vendor/aos/aos.css" rel="stylesheet">
  21. <!-- Template Main CSS File -->
  22. <link href="static/assets/css/style.css" rel="stylesheet">
  23. </head>
  24. <body>
  25. <!-- ======= Header ======= -->
  26. <header id="header">
  27. <div class="container">
  28. <div class="logo float-left">
  29. <h1 class="text-light"><a href="/index"><span>DouBan</span></a></h1>
  30. <!-- Uncomment below if you prefer to use an image logo -->
  31. <!-- <a href="index.html"><img src="static/assets/img/logo.png" alt="" class="img-fluid"></a>-->
  32. </div>
  33. <nav class="nav-menu float-right d-none d-lg-block">
  34. <ul>
  35. <li class="active"><a href="/index">首页 <i class="la la-angle-down"></i></a></li>
  36. <li><a href="/movie">电影</a></li>
  37. <li><a href="/score">评分</a></li>
  38. <li><a href="/word">词云</a></li>
  39. <li><a href="/team">团队</a></li>
  40. </ul>
  41. </nav><!-- .nav-menu -->
  42. </div>
  43. </header><!-- End Header -->
  44. <!-- ======= Our Team Section ======= -->
  45. <section id="team" class="team">
  46. <div class="container">
  47. <div class="section-title">
  48. <h2>豆瓣Top250电影</h2>
  49. </div>
  50. <!-- ======= Counts Section ======= -->
  51. <section class="counts section-bg">
  52. <div class="container">
  53. <table class="table table-striped">
  54. <tr>
  55. <td>电影排名</td>
  56. <td>中文名称</td>
  57. <td>外国名称</td>
  58. <td>电影评分</td>
  59. <td>评价人数</td>
  60. <td>电影概述</td>
  61. <td>其他信息</td>
  62. </tr>
  63. {% for movie in movies %}
  64. <tr>
  65. <td>{{ movie[0] }}</td>
  66. <td>
  67. <a href="{{ movie[1] }}">
  68. {{ movie[3] }}
  69. </a>
  70. </td>
  71. <td>{{ movie[4] }}</td>
  72. <td>{{ movie[5] }}</td>
  73. <td>{{ movie[6] }}</td>
  74. <td>{{ movie[7] }}</td>
  75. <td>{{ movie[8] }}</td>
  76. </tr>
  77. {% endfor %}
  78. </table>
  79. </div>
  80. </section><!-- End Counts Section -->
  81. </div>
  82. </section><!-- End Our Team Section -->
  83. <!-- ======= Footer ======= -->
  84. <footer id="footer">
  85. <div class="container">
  86. <div class="copyright">
  87. &copy; python爬虫可视化分析实验
  88. </div>
  89. <div class="credits">
  90. Douban Movie Top <a href="https://movie.douban.com/top250" target="_blank" title="豆瓣Top250">豆瓣Top250</a> - Douban Movie <a href="https://movie.douban.com/" title="豆瓣电影" target="_blank">豆瓣电影</a>
  91. </div>
  92. </div>
  93. </footer><!-- End Footer -->
  94. <a href="#" class="back-to-top"><i class="icofont-simple-up"></i></a>
  95. <!-- Vendor JS Files -->
  96. <script src="static/assets/vendor/jquery/jquery.min.js"></script>
  97. <script src="static/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  98. <script src="static/assets/vendor/jquery.easing/jquery.easing.min.js"></script>
  99. <script src="static/assets/vendor/php-email-form/validate.js"></script>
  100. <script src="static/assets/vendor/jquery-sticky/jquery.sticky.js"></script>
  101. <script src="static/assets/vendor/venobox/venobox.min.js"></script>
  102. <script src="static/assets/vendor/waypoints/jquery.waypoints.min.js"></script>
  103. <script src="static/assets/vendor/counterup/counterup.min.js"></script>
  104. <script src="static/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
  105. <script src="static/assets/vendor/aos/aos.js"></script>
  106. <!-- Template Main JS File -->
  107. <script src="static/assets/js/main.js"></script>
  108. <style>
  109. .copyrights {
  110. text-indent: -9999px;
  111. height: 0;
  112. line-height: 0;
  113. font-size: 0;
  114. overflow: hidden;
  115. }
  116. </style>
  117. <div class="copyrights" id="links20210126">
  118. Collect from <a href="http://www.cssmoban.com/" title="网站模板">模板之家</a>
  119. <a href="https://www.chazidian.com/" title="查字典">查字典</a>
  120. </div>
  121. </body>
  122. </html>

页面展示:

 

 

(4)制作评分页面

Echarts官方网站:

(官网很多图表示例,推荐大家去学习。)

下载配置echarts

Echarts扩展包:

链接:https://pan.baidu.com/s/1z07VwLkkjJW1ZYdCVOhKNw 
提取码:pc15

网站模板素材:

链接:https://pan.baidu.com/s/1D_PEc5c32qM8O1MEcRVLww 
提取码:gwxs

放入位置:static-->assets-->js 

 

score.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>豆瓣Top250数据可视化分析</title>
  7. <meta content="" name="descriptison">
  8. <meta content="" name="keywords">
  9. <!-- Favicons -->
  10. <link href="static/assets/img/favicon.png" rel="icon">
  11. <link href="static/assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  12. <!-- Google Fonts -->
  13. <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,600,600i,700,700i,900" rel="stylesheet">
  14. <!-- Vendor CSS Files -->
  15. <link href="static/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="static/assets/vendor/icofont/icofont.min.css" rel="stylesheet">
  17. <link href="static/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  18. <link href="static/assets/vendor/animate.css/animate.min.css" rel="stylesheet">
  19. <link href="static/assets/vendor/venobox/venobox.css" rel="stylesheet">
  20. <link href="static/assets/vendor/aos/aos.css" rel="stylesheet">
  21. <!-- Template Main CSS File -->
  22. <link href="static/assets/css/style.css" rel="stylesheet">
  23. </head>
  24. <body>
  25. <!-- ======= Header ======= -->
  26. <header id="header">
  27. <div class="container">
  28. <div class="logo float-left">
  29. <h1 class="text-light"><a href="/index"><span>DouBan</span></a></h1>
  30. <!-- Uncomment below if you prefer to use an image logo -->
  31. <!-- <a href="index.html"><img src="static/assets/img/logo.png" alt="" class="img-fluid"></a>-->
  32. </div>
  33. <nav class="nav-menu float-right d-none d-lg-block">
  34. <ul>
  35. <li class="active"><a href="/index">首页 <i class="la la-angle-down"></i></a></li>
  36. <li><a href="/movie">电影</a></li>
  37. <li><a href="/score">评分</a></li>
  38. <li><a href="/word">词云</a></li>
  39. <li><a href="/team">团队</a></li>
  40. </ul>
  41. </nav><!-- .nav-menu -->
  42. </div>
  43. </header><!-- End Header -->
  44. <!-- ======= Our Team Section ======= -->
  45. <section id="team" class="team">
  46. <div class="container">
  47. <div class="section-title">
  48. <h2>豆瓣Top250评分分布图</h2>
  49. </div>
  50. <!-- ======= Counts Section ======= -->
  51. <section class="counts section-bg">
  52. <div class="container">
  53. <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
  54. <div id="main" style="width: 100%;height:400px;"></div>
  55. </div>
  56. </section><!-- End Counts Section -->
  57. </div>
  58. </section><!-- End Our Team Section -->
  59. <!-- ======= Footer ======= -->
  60. <footer id="footer">
  61. <div class="container">
  62. <div class="copyright">
  63. &copy; python爬虫可视化分析实验
  64. </div>
  65. <div class="credits">
  66. Douban Movie Top <a href="https://movie.douban.com/top250" target="_blank" title="豆瓣Top250">豆瓣Top250</a> - Douban Movie <a href="https://movie.douban.com/" title="豆瓣电影" target="_blank">豆瓣电影</a>
  67. </div>
  68. </div>
  69. </footer><!-- End Footer -->
  70. <a href="#" class="back-to-top"><i class="icofont-simple-up"></i></a>
  71. <!-- Vendor JS Files -->
  72. <script src="static/assets/vendor/jquery/jquery.min.js"></script>
  73. <script src="static/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  74. <script src="static/assets/vendor/jquery.easing/jquery.easing.min.js"></script>
  75. <script src="static/assets/vendor/jquery-sticky/jquery.sticky.js"></script>
  76. <script src="static/assets/vendor/venobox/venobox.min.js"></script>
  77. <script src="static/assets/vendor/waypoints/jquery.waypoints.min.js"></script>
  78. <script src="static/assets/vendor/counterup/counterup.min.js"></script>
  79. <script src="static/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
  80. <script src="static/assets/vendor/aos/aos.js"></script>
  81. <script src="static/assets/js/echarts.min.js"></script>
  82. <!-- 引入刚刚下载的 ECharts 文件 -->
  83. <script type="text/javascript">
  84. var dom = document.getElementById("main");
  85. var myChart = echarts.init(dom);
  86. var app = {};
  87. var option;
  88. var datascore = [];
  89. datascore = {{ score }};
  90. var datanum = [];
  91. datanum = {{ num }};
  92. option = {
  93. title: {
  94. text: '电影评分表',
  95. subtext: 'Film rating sheet'
  96. },
  97. color: ['#3398DB'],
  98. tooltip: {
  99. trigger: 'axis',
  100. axisPointer: {
  101. type: 'shadow'
  102. }
  103. },
  104. xAxis: {
  105. type: 'category',
  106. data: datascore
  107. },
  108. yAxis: {
  109. type: 'value'
  110. },
  111. series: [
  112. {
  113. data: datanum,
  114. type: 'bar',
  115. barWidth: '60%',
  116. }
  117. ]
  118. };
  119. if (option && typeof option === 'object') {
  120. myChart.setOption(option);
  121. }
  122. </script>
  123. <!-- Template Main JS File -->
  124. <script src="static/assets/js/main.js"></script>
  125. <style>
  126. .copyrights {
  127. text-indent: -9999px;
  128. height: 0;
  129. line-height: 0;
  130. font-size: 0;
  131. overflow: hidden;
  132. }
  133. </style>
  134. <div class="copyrights" id="links20210126">
  135. Collect from <a href="http://www.cssmoban.com/" title="网站模板">模板之家</a>
  136. <a href="https://www.chazidian.com/" title="查字典">查字典</a>
  137. </div>
  138. </body>
  139. </html>

主程序:

  1. #返回评分界面
  2. @app.route('/score')
  3. def score():
  4. score=[]
  5. num=[]
  6. con = sqlite3.connect("moveTop.db")#打开数据库
  7. cur = con.cursor()#获取游标
  8. sql = "select score,count(score) from movieTop250 group by score"#sql查询语句
  9. data = cur.execute(sql)#获取数据
  10. for item in data:#将数据保存在列表中
  11. score.append(item[0])
  12. num.append(item[1])
  13. cur.close()#关闭游标
  14. con.close()#关闭连接
  15. return render_template("score.html",score = score,num = num)

 页面展示:

 

(5)制作词频页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>豆瓣Top250数据可视化分析</title>
  7. <meta content="" name="descriptison">
  8. <meta content="" name="keywords">
  9. <!-- Favicons -->
  10. <link href="static/assets/img/favicon.png" rel="icon">
  11. <link href="static/assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  12. <!-- Google Fonts -->
  13. <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,600,600i,700,700i,900" rel="stylesheet">
  14. <!-- Vendor CSS Files -->
  15. <link href="static/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="static/assets/vendor/icofont/icofont.min.css" rel="stylesheet">
  17. <link href="static/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  18. <link href="static/assets/vendor/animate.css/animate.min.css" rel="stylesheet">
  19. <link href="static/assets/vendor/venobox/venobox.css" rel="stylesheet">
  20. <link href="static/assets/vendor/aos/aos.css" rel="stylesheet">
  21. <!-- Template Main CSS File -->
  22. <link href="static/assets/css/style.css" rel="stylesheet">
  23. </head>
  24. <body>
  25. <!-- ======= Header ======= -->
  26. <header id="header">
  27. <div class="container">
  28. <div class="logo float-left">
  29. <h1 class="text-light"><a href="/index"><span>DouBan</span></a></h1>
  30. <!-- Uncomment below if you prefer to use an image logo -->
  31. <!-- <a href="index.html"><img src="static/assets/img/logo.png" alt="" class="img-fluid"></a>-->
  32. </div>
  33. <nav class="nav-menu float-right d-none d-lg-block">
  34. <ul>
  35. <li class="active"><a href="/index">首页 <i class="la la-angle-down"></i></a></li>
  36. <li><a href="/movie">电影</a></li>
  37. <li><a href="/score">评分</a></li>
  38. <li><a href="/word">词云</a></li>
  39. <li><a href="/team">团队</a></li>
  40. </ul>
  41. </nav><!-- .nav-menu -->
  42. </div>
  43. </header><!-- End Header -->
  44. <!-- ======= About Us Section ======= -->
  45. <section id="about" class="about">
  46. <div class="container">
  47. <div class="row no-gutters">
  48. <div class="col-lg-6 video-box">
  49. <img src="static/assets/img/about.jpg" class="img-fluid" alt="">
  50. </div>
  51. <div class="col-lg-6 d-flex flex-column justify-content-center about-content">
  52. <div class="section-title">
  53. <h2>词频统计</h2>
  54. <p>根据250部电影的一句话描述,提炼出词云树,可以让我们更加清晰的了解人们对经典电影的理解。</p>
  55. </div>
  56. <div class="icon-box" data-aos="fade-up" data-aos-delay="100">
  57. <div class="icon"><i class="bx bx-fingerprint"></i></div>
  58. <h4 class="title"><a href="">关于电影</a></h4>
  59. <p class="description">你有什么样的感悟?</p>
  60. </div>
  61. </div>
  62. </div>
  63. </div>
  64. </section><!-- End About Us Section -->
  65. <!-- ======= Footer ======= -->
  66. <footer id="footer">
  67. <div class="container">
  68. <div class="copyright">
  69. &copy; python爬虫可视化分析实验
  70. </div>
  71. <div class="credits">
  72. Douban Movie Top <a href="https://movie.douban.com/top250" target="_blank" title="豆瓣Top250">豆瓣Top250</a> - Douban Movie <a href="https://movie.douban.com/" title="豆瓣电影" target="_blank">豆瓣电影</a>
  73. </div>
  74. </div>
  75. </footer><!-- End Footer -->
  76. <a href="#" class="back-to-top"><i class="icofont-simple-up"></i></a>
  77. <!-- Vendor JS Files -->
  78. <script src="static/assets/vendor/jquery/jquery.min.js"></script>
  79. <script src="static/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  80. <script src="static/assets/vendor/jquery.easing/jquery.easing.min.js"></script>
  81. <script src="static/assets/vendor/php-email-form/validate.js"></script>
  82. <script src="static/assets/vendor/jquery-sticky/jquery.sticky.js"></script>
  83. <script src="static/assets/vendor/venobox/venobox.min.js"></script>
  84. <script src="static/assets/vendor/waypoints/jquery.waypoints.min.js"></script>
  85. <script src="static/assets/vendor/counterup/counterup.min.js"></script>
  86. <script src="static/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
  87. <script src="static/assets/vendor/aos/aos.js"></script>
  88. <!-- Template Main JS File -->
  89. <script src="static/assets/js/main.js"></script>
  90. <style>
  91. .copyrights {
  92. text-indent: -9999px;
  93. height: 0;
  94. line-height: 0;
  95. font-size: 0;
  96. overflow: hidden;
  97. }
  98. </style>
  99. <div class="copyrights" id="links20210126">
  100. Collect from <a href="http://www.cssmoban.com/" title="网站模板">模板之家</a>
  101. <a href="https://www.chazidian.com/" title="查字典">查字典</a>
  102. </div>
  103. </body>
  104. </html>

页面展示:

 

 

(6)制作团队页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>豆瓣Top250数据可视化分析</title>
  7. <meta content="" name="descriptison">
  8. <meta content="" name="keywords">
  9. <!-- Favicons -->
  10. <link href="static/assets/img/favicon.png" rel="icon">
  11. <link href="static/assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  12. <!-- Google Fonts -->
  13. <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,600,600i,700,700i,900" rel="stylesheet">
  14. <!-- Vendor CSS Files -->
  15. <link href="static/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  16. <link href="static/assets/vendor/icofont/icofont.min.css" rel="stylesheet">
  17. <link href="static/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  18. <link href="static/assets/vendor/animate.css/animate.min.css" rel="stylesheet">
  19. <link href="static/assets/vendor/venobox/venobox.css" rel="stylesheet">
  20. <link href="static/assets/vendor/aos/aos.css" rel="stylesheet">
  21. <!-- Template Main CSS File -->
  22. <link href="static/assets/css/style.css" rel="stylesheet">
  23. </head>
  24. <body>
  25. <!-- ======= Header ======= -->
  26. <header id="header">
  27. <div class="container">
  28. <div class="logo float-left">
  29. <h1 class="text-light"><a href="/index"><span>DouBan</span></a></h1>
  30. <!-- Uncomment below if you prefer to use an image logo -->
  31. <!-- <a href="index.html"><img src="static/assets/img/logo.png" alt="" class="img-fluid"></a>-->
  32. </div>
  33. <nav class="nav-menu float-right d-none d-lg-block">
  34. <ul>
  35. <li class="active"><a href="/index">首页 <i class="la la-angle-down"></i></a></li>
  36. <li><a href="/movie">电影</a></li>
  37. <li><a href="/score">评分</a></li>
  38. <li><a href="/word">词云</a></li>
  39. <li><a href="/team">团队</a></li>
  40. </ul>
  41. </nav><!-- .nav-menu -->
  42. </div>
  43. </header><!-- End Header -->
  44. <!-- ======= Our Team Section ======= -->
  45. <section id="team" class="team">
  46. <div class="container">
  47. <div class="section-title">
  48. <h2>我们的团队</h2>
  49. </div>
  50. <div class="row">
  51. <div class="col-xl-3 col-lg-4 col-md-6" data-aos="fade-up">
  52. <div class="member">
  53. <div class="pic">
  54. <a href="https://blog.csdn.net/qq_51701007?spm=1000.2115.3001.5343">
  55. <img src="static/assets/img/team/team-1.jpg" class="img-fluid" alt="">
  56. </a>
  57. </div>
  58. <div class="member-info">
  59. <h4>代码骑士</h4>
  60. <span>QQ:1696297834</span>
  61. </div>
  62. </div>
  63. </div>
  64. <div class="col-xl-3 col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="100">
  65. <div class="member">
  66. <div class="pic">
  67. <a href="https://blog.csdn.net/qq_51701007?spm=1000.2115.3001.5343">
  68. <img src="static/assets/img/team/team-2.jpg" class="img-fluid" alt="">
  69. </a>
  70. </div>
  71. <div class="member-info">
  72. <h4>代码骑士</h4>
  73. <span>QQ:1696297834</span>
  74. </div>
  75. </div>
  76. </div>
  77. <div class="col-xl-3 col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="200">
  78. <div class="member">
  79. <div class="pic">
  80. <a href="https://blog.csdn.net/qq_51701007?spm=1000.2115.3001.5343">
  81. <img src="static/assets/img/team/team-3.jpg" class="img-fluid" alt="">
  82. </a>
  83. </div>
  84. <div class="member-info">
  85. <h4>代码骑士</h4>
  86. <span>QQ:1696297834</span>
  87. </div>
  88. </div>
  89. </div>
  90. <div class="col-xl-3 col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="300">
  91. <div class="member">
  92. <div class="pic">
  93. <a href="https://blog.csdn.net/qq_51701007?spm=1000.2115.3001.5343">
  94. <img src="static/assets/img/team/team-4.jpg" class="img-fluid" alt="">
  95. </a>
  96. </div>
  97. <div class="member-info">
  98. <h4>代码骑士</h4>
  99. <span>QQ:1696297834</span>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. </section><!-- End Our Team Section -->
  106. <!-- ======= Footer ======= -->
  107. <footer id="footer">
  108. <div class="container">
  109. <div class="copyright">
  110. &copy; python爬虫可视化分析实验
  111. </div>
  112. <div class="credits">
  113. Douban Movie Top <a href="https://movie.douban.com/top250" target="_blank" title="豆瓣Top250">豆瓣Top250</a> - Douban Movie <a href="https://movie.douban.com/" title="豆瓣电影" target="_blank">豆瓣电影</a>
  114. </div>
  115. </div>
  116. </footer><!-- End Footer -->
  117. <a href="#" class="back-to-top"><i class="icofont-simple-up"></i></a>
  118. <!-- Vendor JS Files -->
  119. <script src="static/assets/vendor/jquery/jquery.min.js"></script>
  120. <script src="static/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  121. <script src="static/assets/vendor/jquery.easing/jquery.easing.min.js"></script>
  122. <script src="static/assets/vendor/jquery-sticky/jquery.sticky.js"></script>
  123. <script src="static/assets/vendor/venobox/venobox.min.js"></script>
  124. <script src="static/assets/vendor/waypoints/jquery.waypoints.min.js"></script>
  125. <script src="static/assets/vendor/counterup/counterup.min.js"></script>
  126. <script src="static/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
  127. <script src="static/assets/vendor/aos/aos.js"></script>
  128. <!-- Template Main JS File -->
  129. <script src="static/assets/js/main.js"></script>
  130. <style>
  131. .copyrights {
  132. text-indent: -9999px;
  133. height: 0;
  134. line-height: 0;
  135. font-size: 0;
  136. overflow: hidden;
  137. }
  138. </style>
  139. <div class="copyrights" id="links20210126">
  140. Collect from <a href="http://www.cssmoban.com/" title="网站模板">模板之家</a>
  141. <a href="https://www.chazidian.com/" title="查字典">查字典</a>
  142. </div>
  143. </body>
  144. </html>

 页面展示:

大功告成啦! 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发