diff --git a/.idea/misc.xml b/.idea/misc.xml index 505bab1..84f6f00 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 2c2d842..3453f8f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 3dc3e68..dc414db 100644 Binary files a/__pycache__/app.cpython-312.pyc and b/__pycache__/app.cpython-312.pyc differ diff --git a/app.py b/app.py index c924cbb..13a5f06 100644 --- a/app.py +++ b/app.py @@ -4,7 +4,6 @@ import lxml app = Flask(__name__) - def getDB(): '''连接数据库''' db = pymysql.connect(host='localhost',user='root',password='shengji.',database='douban',) @@ -12,12 +11,15 @@ def getDB(): - - +#跳转主页 @app.route('/') def home(): # put application's code here return render_template('index.html') +@app.route('/index') +def index(): # put application's code here + return render_template('index.html') + @app.route('/movies') @app.route('/movies/') @@ -42,5 +44,56 @@ def movies(page = 1):# put application's code here + +@app.route('/tj') +def tj():# put application's code here + db = getDB() + cursor = db.cursor() + #电影评分分布图 + rating = [] #评分 + num = [] #每个电影评分统计出的电影数量 + sql = "select rating_num,count(*) from movies GROUP BY rating_num" + cursor.execute(sql) + data = cursor.fetchall() + for item in data: + rating.append(float(item[0])) + num.append(item[1]) + + #电影类型分布图 + filmtypes_list = [] #类型列表 + filmtypes_num = [] #类型数量 + sql1 = "select filmtype,count(filmtype) from movietype GROUP BY filmtype" + cursor.execute(sql1) + data1 = cursor.fetchall() + for item1 in data1: + filmtypes_list.append(item1[0]) + filmtypes_num.append(item1[1]) + + #20年内电影上映数量统计图 + years = [] #年 + years_num = [] #每年的电影数量 + sql2 = "select YEAR(STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d')) as years,count(*) from movies WHERE STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d')>DATE_SUB(CURRENT_DATE,INTERVAL 20 YEAR)GROUP BY YEAR(STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d'))ORDER BY YEAR(STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d'))" + cursor.execute(sql2) + data2 = cursor.fetchall() + for item2 in data2: + years.append(item2[0]) + years_num.append(item2[1]) + + + #电影数量最多的top10年份 + top10 = [] #电影数量最多的top10年份的列表 + top10_num = [] #电影数量最多的top10年份的电影数量 + sql3 = "select YEAR(STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d')) as years,count(*) from movies GROUP BY YEAR(STR_TO_DATE(initialrReleaseDate,'%Y-%m-%d'))ORDER BY count(*) desc limit 10 " + cursor.execute(sql3) + data3 = cursor.fetchall() + for item3 in data3: + top10.append(item3[0]) + top10_num.append(item3[1]) + + return render_template('tj.html',rating=rating,num=num,filmtypes_list=filmtypes_list,filmtypes_num=filmtypes_num, + years=years,years_num=years_num,top10=top10,top10_num=top10_num) + + + if __name__ == '__main__': app.run() diff --git a/getData.py b/getData.py index 7d096cb..db4e686 100644 --- a/getData.py +++ b/getData.py @@ -62,6 +62,22 @@ def get_url_info(film_url,film_name_en,id): actor = soup.find(attrs={'id':"info"}).text.split('\n')[3].split(':')[1].strip() # 类型 filmtype = soup.find(attrs={'id': "info"}).text.split('\n')[4].split(':')[1].strip() + types = filmtype.split("/") + if soup.find(attrs={'id': "info"}).text.split('\n')[5].split(':')[0] =='官方网站': + # 制片国家/地区 + area = soup.find(attrs={'id': "info"}).text.split('\n')[6].split(':')[1].strip() + # 语言 + language = soup.find(attrs={'id': "info"}).text.split('\n')[7].split(':')[1].strip() + # 上映日期 + initialrReleaseDate = soup.find(attrs={'id': "info"}).text.split('\n')[8].split(':')[1].split('(')[0].strip() + else: + # 制片国家/地区 + area = soup.find(attrs={'id': "info"}).text.split('\n')[5].split(':')[1].strip() + # 语言 + language = soup.find(attrs={'id': "info"}).text.split('\n')[6].split(':')[1].strip() + # 上映日期 + initialrReleaseDate = soup.find(attrs={'id': "info"}).text.split('\n')[7].split(':')[1].split('(')[0].strip() + # 片长 runtime = soup.find(attrs={'property': "v:runtime"}).text # 评分(平均分) @@ -70,19 +86,19 @@ def get_url_info(film_url,film_name_en,id): stars5_rating_per = soup.find(attrs={'class': "rating_per"}).text # 评价人数 rating_people = soup.find(attrs={'property': "v:votes"}).text - # 剧情简介 + #剧情简介 summary = soup.find(attrs={'property': "v:summary"}).text summary = pymysql.converters.escape_string(summary) - - - -sql = 'insert into movies(film_name,director,scriptwriter,actor,filmtype,area,language,initialrReleaseDate,ranks,runtime,rating_num,stars5_rating_per,rating_people,summary,film_name_en,links) values("{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}");'.format(film_name,director,scriptwriter,actor,filmtype,area,language,initialrReleaseDate,ranks,runtime,rating_num,stars5_rating_per,rating_people,summary,film_name_en,film_url) + #存到数据库 + sql = 'insert into movies(film_name,director,scriptwriter,actor,filmtype,area,language,initialrReleaseDate,ranks,runtime,rating_num,stars5_rating_per,rating_people,summary,film_name_en,links) values("{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}","{}");'.format(film_name,director,scriptwriter,actor,filmtype,area,language,initialrReleaseDate,ranks,runtime,rating_num,stars5_rating_per,rating_people,summary,film_name_en,film_url) db = getDB() try: cursor = db.cursor() cursor.execute(sql) cursor.execute('insert into moviehash(movieid) values("{}")'.format(id)) + for j in range(len(types)): + cursor.execute('insert into movietype(movieid,filmtype) values("{}","{}")'.format(id,types[j].strip())) db.commit() except Exception as e: print(e) @@ -91,13 +107,11 @@ sql = 'insert into movies(film_name,director,scriptwriter,actor,filmtype,area,la db.close() - - if __name__ == '__main__': print('开始抓取') db = getDB() cursor = db.cursor() - for i in range(0,50,25): + for i in range(0,250,25): film_urls, movie_list = get_url("https://movie.douban.com/top250?start="+str(i)+"&filter=") for film_url in range(len(film_urls)): id = re.search('\d\d+',film_urls[film_url]).group() @@ -106,3 +120,4 @@ if __name__ == '__main__': data = cursor.fetchall() if not data: get_url_info(film_urls[film_url],movie_list[film_url],id) + # get_url_info("https://movie.douban.com/subject/1291561/","111","1291561") \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..4ed2d9b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,182 @@ + + + + + + + + 首页 + + + + + + + + + + + + + + + + +
+{# --------------------导航栏---------------------#} + + +{# --------------------容器1--------------------#} +
+
+
+

关于我们

+
+
+{# -----------------容器2-------------#} +
+
+
    +
  • +

    这是一个什么样的系统?

    +

      该系统致力于让用户简单明了地查看到电影top250排行榜及其详细信息,同时, + 用户可以通过统计图的呈现了解到历年电影走势、电影类型分布等相关信息,方便用户根据其信息选择电影。

    +


  • +
  • +

    为什么要对数据进行分析统计?

    +

      在当今社会,生活节奏越来越快,人们也越来越注重精神享受,而电影已经成为人们日常生活中不可或缺的 + 娱乐方式。一部好的电影,除了给人们带来放松和娱乐以外,还可以引发人们的思考和文化的传播。
       + 从微观上来说,如何在有限的时间内找到感兴趣的、高质量的电影就显得很有必要了。对于观看者而言,观影前的影片选择 + 尤为重要,每个人都有自己的喜好,有的人偏爱喜剧片,有的人偏爱恐怖片,也有的人喜欢爱情片,针对不同观影者的喜好, + 将电影类型进行分类,使用户可以通过可视化数据更好的了解电影的类型;针对喜欢看热门电影的用户,可以通过获取的热门 + 电影排行,有选择的进行观看;针对注重评分的用户来说,可以从他人的评分和影评中了解到这部电影是否值得去看。对于 + 从事影视行业的人员而言,对电影的类型和数量进行分析,能在归纳数据的基础上了解其分布;分析历年的影片走势,通过 + 可视化分析得出的统计图预计未来的发展方向;还可通过相关技术提取影评关键词,更好的了解用户的喜好和需求,制作出 + 令观众满意的作品。
      从宏观上来说,中国电影行业的产业链的经营还不够专业化,现在一些圈外的资 + 本为了利益,在缺乏专业性的情况下,也开始随大众投入电影行业,在这样的背景下,进行相关数据的分析有利于提高电影 + 行业的专业性和科学性,提高影片的质量。虽然在庞大的网络体系下,每一条数据看似杂乱无章,但是在进行技术分析后, + 都会绘成一张张清晰的偏好图谱,从而制片方可以更好的利用反馈制定精准的宣发策略。

    +


  • +
  • +

    如何使用该系统?

    +

    1.你可以通过点击菜单”排行榜“查看top250榜单;
    + 2.你可以点击具体的电影名称进入页面查看该电影的详细介绍;
    + 3.你可以通过点击菜单“统计”查看:根据电影评分、电影类型、上映年份等形成的统计图;
    +

    +


  • +
  • +

    温馨提示:

    +

    1.数据分析并不能保证电影的艺术价值和质量;
    + 2.即使是真实的数据也会影响分析的有效性;
    + 3.该系统研究的数据有限,不一定能满足所有用户的需求;
    + 4.该系统研究的数据以及分析结果仅供参考。

    +


  • +
+
+
+
+ +{#----------页脚----------#} + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/templates/movies.html b/templates/movies.html new file mode 100644 index 0000000..9f0687d --- /dev/null +++ b/templates/movies.html @@ -0,0 +1,225 @@ + + + + + + + + 电影top250 + + + + + + + + + + + + + + + +
+{# --------------------导航栏---------------------#} + + +{# --------------------容器1--------------------#} +
+{# -------------左上角标语-----------#} +
+
+

豆瓣电影top250排行榜

+
+
+{# -----------------容器2-------------#} +
+
+ + + + + + + + + + + {% for movie in movies %} + + + + + + + + + + {% endfor %} +
电影排名电影中文名称电影外国名称电影评分评分人数电影简介其他信息
{{ movie[0] }}{{ movie[2] }}{{ movie[3] }}{{ movie[4] }}{{ movie[5] }}{{ movie[6] }}{{ movie[7] }}
+ {##} +
+ + +
+
+ + +
+ +{#----------页脚----------#} + + + +
+ + + + + +{# #} +{# #} +{# #} +{# #} +{# #} + + + + \ No newline at end of file diff --git a/templates/tj.html b/templates/tj.html new file mode 100644 index 0000000..dc4e8d9 --- /dev/null +++ b/templates/tj.html @@ -0,0 +1,367 @@ + + + + + + + + 统计 + + + + + + + + + + + + + + + +
+ {# --------------------导航栏---------------------#} + + + + {# --------------------容器1--------------------#} +
+ {# -------------左上角标语-----------#} +
+
+

电影评分分布图

+ {# #} +
+
+ {# -----------------容器2-------------#} +
+
+
+
+
+ + +
+ +
+
+

电影类型分布图

+
+
+ +
+
+
+
+
+ +
+
+

20年内电影上映数量统计图

+
+
+ +
+
+
+
+
+ +
+
+

电影数量最多的top10年份

+
+
+ +
+
+
+
+
+
+ + {#----------页脚----------#} + + + +
+ + + + + + + +{# -----------评分分布图---------------#} + + + + + \ No newline at end of file