# python期末项目 **Repository Path**: chongqiao/python-final-project ## Basic Information - **Project Name**: python期末项目 - **Description**: No description available - **Primary Language**: Python - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-01-18 - **Last Updated**: 2022-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python期末项目 ## 项目名称:基于Python的Flask Web豆瓣top250电影数据分析平台 本项目借助Python Flask,[豆瓣top250](https://movie.douban.com/top250?start=)网站,分析了豆瓣top250电影的基本情况,以可视化图表的形式展现,方便用户从直观全面地了解豆瓣top250电影中的各个电影的基本信息,评分分布情况等等。 ## 框架结构图 ![框架](https://images.gitee.com/uploads/images/2021/0124/145919_0f7e895c_7543526.png "未命名文件 (1).png") ## 问题表述 本Python项目主要爬取了豆瓣top250网页中的电影信息,帮助用户直观地了解豆瓣top250上的电影的基本信息,包括各个电影的中英文名称,导演,排名等其他基本信息,并且将各个电影的评分情况和词频类型进行了可视化分析,分别柱状图和词云图的形式展示,用户可从图表中,清晰的了解人们对经典电影的理解。 ## 用户画像/价值主张画布 用户画像 ![画像](https://images.gitee.com/uploads/images/2021/0124/151748_0df28136_7543526.png "豆豆.PNG") 价值主张画布 ![huabu](https://images.gitee.com/uploads/images/2021/0124/153246_a70b5762_7543526.png "F3小组.png") ## 解决方案表述 ### 整体项目规划 在进行这次的python项目规划的时候,第一步需要对豆瓣top250网页进行爬取,爬取完毕后对数据进行分析,提取,储存,方便后期的调用。完成了前期的数据准备工作后,选取合适的css.html样式,架设flask框架,完成首页和电影页的制作。接下来利用echarts,完成可视化图表的柱状图和词云图部分,基本完成项目。最后将项目在pythonanywhere上进行部署。 ### 步骤呈现 | 步骤 | 具体操作 | python知识点 | |---|---|---| | 第一步 | 爬取豆瓣top250数据 | 爬取数据 | | 第二步 | 对数据进行分析,提取 | 正则提取 | | 第三步 | 保存数据到SQlite | 数据库 | | 第四步 | 架设flask框架,添加网页样式 | flask.html.css | | 第五步 | 定义函数,完成路由解析过程 | 函数的定义 | | 第六步 | 完成图表,实现数据可视化 | echarts | | 第七步 | 优化网站样式 | HTML、CSS | | 第八步 | Pythonanywhere部署 | Pythonanywhere | ## 编程功能的基本描述 ### 1.数据爬取: - 引入第三方模块 ``` from bs4 import BeautifulSoup #网页解析,获取数据 import re #正则表达式,进行文字匹配 import urllib.request, urllib.error #制定url,获取网页数据 import xlwt #进行Excel操纵 import sqlite3 #进行数据库操作 ``` - 爬取网页 ``` def main(): baseUrl="https://movie.douban.com/top250?start=" #爬取网页,start=表示爬取哪一页 datalist=getData(baseUrl) - 得到一个指定url的网页内容 ``` ``` def askURL(url): head={ "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Mobile Safari/537.36" #用户代理:告诉服务器我们使用何种浏览器进或机器行访问,能接收什么样的数据 } ``` - 注意,从页面复制过来的时候要注意User-Agent中间没有空格,注意大小写否则将导致伪装识别,爬取不成功。 - 以上完成一个页面的获取,但我们需要调用25次,因此引入for循环 ### 2.分析提取: for循环,循环调用页面信息 ``` def getData(baseUrl): datalist=[] for i in range(0,10):#调用获取页面信息的函数10次 url=baseUrl+str(i*25) html=askURL(url)#保存获取到的网页源码 ``` - 创建正则表达式对象,表示规则,找到所有链接 ``` findImgSrc = re.compile(r'(.*)')# 影片标题 findRating = re.compile(r'(.*)')# 影片评分 findJudge = re.compile(r'(\d*)人评价')# 评价人数 findInfo = re.compile(r'(.*)')# 找到概况 findBd =re.compile(r'

(.*?)

',re.S)# 找到影片的相关内容 ``` - for循环逐一解析数据,查找全部符合的信息 ``` soup=BeautifulSoup(html,"html.parser") for item in soup.find_all('div',class_="item"): #for循环查找符合要求的字符串形成列表 # print(item) ``` ### 3.保存数据到SQlite: 先保存到excel ``` def saveData(datalist,savePath): book=xlwt.Workbook(encoding='utf-8') sheet = book.add_sheet('豆瓣电影Top250') col=("影片链接","图片链接","影片中文名","影片外国名","影片评分","评价人数","找到概况","影片的相关内容") for i in range(0,8): sheet.write(0,i,col[i]) #列名 for i in range(0,250): print("第%d条"%(i+1)) data = datalist[i] #保存数据 for j in range(0,8): sheet.write(i+1,j,data[j]) #保存到xls文件中 book.save('豆瓣电影Top250.xls') ``` 成功后将生成该文件 ![douban](https://images.gitee.com/uploads/images/2021/0124/170853_089156a6_7543526.png "豆瓣.PNG") - 创建数据表 ``` conn = sqlite3.connect(dbPath) cursor = conn.cursor() cursor.execute(sql) conn.commit() cursor.close() conn.close() ``` 成功后将生成该文件   ![wenjian](https://images.gitee.com/uploads/images/2021/0124/171708_8b49e514_7543526.png "文件.PNG")      ### 4.架设flask框架,添加网页样式 借助了gitee,GitHub,bilibili等平台,最终选取了一个较为合适且美观的主题,该主题中包含css.html.js等格式的文件,在此基础上进行删改,去除不必要的部分,完成整个主题的初步样式。 ### 5.定义函数,完成路由解析过程 结合页面样式,对上述部分功能抽象成几个独立的函数,完成路由解析过程,使其能够展现在前端页面中。 ### 6.完成图表,实现数据可视化 对比发现,echarts相较pycharts的样式更丰富,并且可以直接在页面上进行修改,虽然是js语言,但首页都有注释,结合自己的需要修改后可以直接下载生成html文件,复制到自己的项目上,避免出错。将HTML用for循环创建列表,连接到数据库,实现数据可视化。 ``` @app.route('/score') def score(): score = [] # 评分 num = [] # 每个评分所统计出的电影数量 con = sqlite3.connect("movie.db") cur = con.cursor() sql = "select score,count(score) from movie250 group by score" data = cur.execute(sql) for item in data: score.append(str(item[0])) num.append(item[1]) cur.close() con.close() return render_template("score.html", score=score, num=num) ``` ### 7.优化网站样式 基本上完成所有功能后,对网站样式进行再一次优化,调整冲突和不合理的地方。 ### 8.Pythonanywhere部署 云端部署 项目第七步即是在云端部署网站,使网站可以通过网站的形式在不同的设备上方便使用,这里使用Pythonanywhere进行云端部署,完成Python网站项目。 | 要学习的 | 学习成本 | 项目占比 | |---|---|---| | flask框架 | 一个月 | 30% | | 数据爬取 | 三天 | 8% | | 数据存储 | 一周 | 12% | | CSS.HTML | 五天 | 10% | | 功能函数编写 | 两个月 | 20% | | Pythonanywhere部署 | 两天 | 10% | | 数据可视化 | 三天 | 10% | ## 云端项目部署的基本描述 ### 1.页面流程图 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0127/170715_134aa2af_7543526.png "未命名文件 (2).png") ### 2.使用Pythonanywhere部署 部署: http://suiqiao.pythonanywhere.com 首页:用户进入主页后自行选择想要了解的相关数据 首页:http://suiqiao.pythonanywhere.com/index 词云页面: 用户可点击查看人们对经典电影理解的词云图    词云页面:http://suiqiao.pythonanywhere.com/word 评分柱状图:用户可点击查看人们对top250电影评分情况柱状图 评分柱状图:http://suiqiao.pythonanywhere.com/score 团队页面: 用户可点击回到主页 团队页面:http://suiqiao.pythonanywhere.com/team top50基本信息图表:用户可以点击查看top250基本信息表格,包括电影名称,评价,内容等 top50基本信息图表:http://suiqiao.pythonanywhere.com/movie - 部分页面有时会面临500错误的情况,该问题目前还无法解决,因此我将部分界面截图放在这里,如果打不开,可以查看我的截图,麻烦你啦! ![输入图片说明](https://images.gitee.com/uploads/images/2021/0125/184129_18615e6f_7543526.png "mo.PNG") ![输入图片说明](https://images.gitee.com/uploads/images/2021/0124/182854_beb2779c_7543526.png "屏幕截图.png") ### 3.部署流程 - 上传文件 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0127/171112_2dd13561_7543526.png "file.PNG")    - 解压static和templates文件 - 然后回到Web页面,点击/var/www/suiqiao.pythonanywhere.com_wsgi.py修改文件名 - 最后来到Web页面,点击reload,查看部署是否成功 ### 4.部署心得 > 部署心得:刚开始部署时几次出现Internet serve error,出现错误不要慌,多看几个视频,上CSDN看看有没有别人也踩过坑。我个人失败原因时因为虚拟环境没有搭建好,还有记得要在wsgi.py内把flaskproject改成自己主函数的文件名。我自己是部署了大概三次成功的,但部分界面依然面临500的错误,尝试过多次后依然失败,经同学分享可能原因是由于pythonanywher服务器过载,目前该问题还无法解决。 ## 学习/实践心得总结及感谢 ### 实践心得 > 在没学习python之前一直觉得代码很难,经过一个学期的熏陶,在智超老师和许多网新同学的帮助下,勉强可以说算是入门了。但完成该项目对我来说仍然非常吃力,里面有很多我不熟悉,没有尝试过的知识点和功能,尽管是跟着b站上的教程一步一步跟着走,还是有很多错误和问题,还是有很多不理解的地方。经历了无数秃头和煎熬的夜晚,会有因为出现bug而焦虑,不知道怎么办的时候,也有成功运行开心激动的时候。从一开始的一有问题就寻找别人的帮助,问一些现在自己看来都很好笑的问题,到现在自己已经能慢慢参悟到一些,可以尝试着自己去解决一些问题,是这个学期最大的进步。 > 尽管我现在还不敢声称自己已经具备一定的代码思维逻辑,但我相信,经过这一学期的历练和未来的不断学习,我的代码思维和能力,一定会有所提升。总的来说,编程思维对我做这个项目提供了莫大的帮助,至少我在面对一个项目的时候,知道我应该具备哪些模块,应该从哪里入手,但同时,由于我的编程思维不够完备,我仍然无法利用他去解决一些项目过程中出现的bug,这也将是我需要不断学习培养的地方。 ### 特此鸣谢 [许智超老师的博客](https://www.cnblogs.com/xuzhichao/p/11707930.html) [可视化参考](https://pyecharts.org/#/zh-cn/basic_charts?id=pie%ef%bc%9a%e9%a5%bc%e5%9b%be) [豆瓣数据](https://movie.douban.com/top250?start=) [css样式参考](https://v3.bootcss.com/) [模板之家](http://www.cssmoban.com/) [SSM系统样式参考](https://www.bilibili.com/video/BV125411b7k2?p=16) [HTML实例](https://www.w3school.com.cn/example/html_examples.asp ) [HTML的小知识点](https://blog.csdn.net/qq_42408149/article/details/82454835) [processon](https://www.processon.com/) [echarts](https://echarts.apache.org/zh/index.html) [php中文网](https://www.php.cn/) [pyecharts的官方中文文档及常见图表整理](https://blog.csdn.net/weixin_44166997/article/details/104479863) [pythonanywhere](https://www.pythonanywhere.com/) [pythonanywhere部署](https://blog.csdn.net/qq_15260769/article/details/83182185) [b站李巍老师的课程](https://www.bilibili.com/video/BV12E411A7ZQ?t=1040&p=37) [word_cloud](https://amueller.github.io/word_cloud/) [word_cloud gitee](https://github.com/amueller/word_cloud) [word_cloud十五分钟入门](https://blog.csdn.net/fontthrone/article/details/72775865) [flask项目搭建](https://blog.csdn.net/asd529735325/article/details/103011940?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-10.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-10.control) [python可视化](https://gitee.com/godxia/python_map_visualization?_from=gitee_search) [报错解决](https://blog.csdn.net/veritasalice/article/details/88865026) [菜鸟教程](https://www.runoob.com/try/try.php?filename=trycss3_gradient-linear_ltr)