当前位置:   article > 正文

Python高分数据可视化分析(网易云热评音乐数据分析)_基于python的网易云音乐歌单分析

基于python的网易云音乐歌单分析

项目介绍:

项目名称:基于Django的网易云热评歌单数据可视化分析;项目实现功能:用户登陆注册,用户个人信息编辑修改,数据总览以及实现歌单的收藏,针对歌单的点赞量,评论量,收藏量,歌曲量,歌单类型等系列数据参数对数据进行可视化分析。

项目技术简介:

登陆注册:

  1. # 01用户登录
  2. def login(request):
  3. if request.method == 'GET':
  4. return render(request, 'login.html')
  5. if request.method == 'POST':
  6. name = request.POST.get('name')
  7. password = request.POST.get('password')
  8. if User.objects.filter(username=name, password=password):
  9. user=User.objects.get(username=name, password=password)
  10. username=request.session['username'] = {'username':user.username,'avatar':str(user.avatar)}
  11. return redirect('index')
  12. else:
  13. msg = '信息错误!'
  14. return render(request, 'login.html', {"msg": msg})
  15. # 02用户注册
  16. def register(request):
  17. if request.method == 'POST':
  18. name = request.POST.get('name')
  19. password = request.POST.get('password')
  20. phone = request.POST.get('phone')
  21. email = request.POST.get('email')
  22. avatar = request.FILES.get('avatar')
  23. stu = User.objects.filter(username=name)
  24. if stu:
  25. msg = '用户已存在!'
  26. return render(request, 'register.html', {"msg": msg})
  27. else:
  28. User.objects.create(username=name,password=password,phone=phone,email=email,avatar=avatar)
  29. msg = "注册成功!"
  30. return render(request, 'login.html', {"msg": msg})
  31. if request.method == 'GET':
  32. return render(request,'register.html')
'
运行

用户登录 (login 函数)

  1. GET 请求:当用户访问登录页面时,视图函数会返回登录页面模板。

  2. POST 请求:当用户提交登录表单时,视图函数会获取表单中提交的用户名和密码。

  3. 使用 User.objects.filter(username=name, password=password) 进行用户名和密码的验证。这里使用了 filter() 方法而不是 get() 方法,因为 filter() 方法会返回一个 QuerySet,即使没有匹配项也不会引发异常。

  4. 如果存在匹配的用户,则将用户对象赋值给 user 变量,并将用户名和头像信息存储在会话(session)中,然后重定向到首页。

  5. 如果用户名或密码错误,视图函数将返回登录页面,并在页面上显示错误信息。

用户注册 (register 函数)

  1. POST 请求:当用户提交注册表单时,视图函数会获取表单中提交的用户名、密码、电话、邮箱和头像信息。

  2. 使用 User.objects.filter(username=name) 检查用户名是否已经存在于数据库中。

  3. 如果用户名已经存在,则返回注册页面,并在页面上显示错误信息。

  4. 如果用户名不存在,使用 User.objects.create() 创建新用户,并将用户信息存储到数据库中。

  5. 注册成功后,返回登录页面,并在页面上显示注册成功的消息。

    1. def tableData(request):
    2. username = request.session.get("username").get('username')
    3. useravatar = request.session.get("username").get('avatar')
    4. userInfo = User.objects.get(username=username)
    5. tableData = Songs.objects.all()
    6. paginator = Paginator(tableData, 10)
    7. # 根据请求地址的信息来跳转页码数据
    8. cur_page = 1
    9. if request.GET.get("page"):
    10. cur_page = int(request.GET.get("page"))
    11. if cur_page:
    12. c_page = paginator.page(cur_page)
    13. else:
    14. c_page = paginator.page(1)
    15. page_range = []
    16. visibleNumber = 10
    17. min = int(cur_page - visibleNumber / 2)
    18. if min < 1:
    19. min = 1
    20. max = min + visibleNumber
    21. if max > paginator.page_range[-1]:
    22. max = paginator.page_range[-1]
    23. for i in range(min,max):
    24. page_range.append(i)
    25. return render(request, 'tableData.html',{
    26. 'username': username,
    27. 'useravatar': useravatar,
    28. 'userInfo': userInfo,
    29. 'tableData':tableData,
    30. "pagination":paginator,
    31. "c_page":c_page,
    32. 'page_range':page_range
    33. })
    34. def historyTableData(request):
    35. username = request.session.get("username").get('username')
    36. userInfo = User.objects.get(username=username)
    37. historyData = Histroy.objects.all()
    38. return render(request,'historyTableData.html',{
    39. 'userInfo': userInfo,
    40. 'historyData':historyData
    41. })
    42. def addHistory(request,songId):
    43. username = request.session.get("username").get('username')
    44. userInfo = User.objects.get(username=username)
    45. getHistoryTableData.addHistory(userInfo,songId)
    46. return redirect('historyTableData')
    '
    运行

tableData 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 使用 User.objects.get(username=username) 通过用户名获取用户的详细信息。
  • 获取所有歌曲数据,使用 Songs.objects.all()
  • 使用 Django 的 Paginator 对歌曲数据进行分页处理,每页显示 10 条记录。
  • 通过 request.GET.get("page") 获取当前请求的页码,然后通过 paginator.page(cur_page) 获取当前页的记录。
  • 计算页码范围(page_range),用于在页面上显示页码导航。页码范围根据当前页码和一个固定的可见页码数量(visibleNumber)来计算。
  • 将收集到的所有信息通过上下文传递给 tableData.html 模板并渲染页面。

 historyTableData 函数:

  • 类似于 tableData 函数,从会话中获取当前登录用户的用户名,并获取用户的详细信息。
  • 获取所有历史记录数据,使用 History.objects.all()
  • 将用户信息和历史记录数据通过上下文传递给 historyTableData.html 模板并渲染页面。

addHistory 函数:

  • 从会话中获取当前登录用户的用户名,并获取用户的详细信息。
  • addHistory(userInfo, songId) 似乎是一个尝试将指定歌曲 ID 与当前用户的历史记录关联的操作。但是,代码中没有提供 getHistoryTableData.addHistory 的实现细节,因此无法具体解释其功能。假设它是用来添加一个新的历史记录项到数据库中。
  • 完成添加历史记录后,通过 redirect('historyTableData') 重定向到历史记录页面。
  1. def songDistribute(request):
  2. username = request.session.get("username").get('username')
  3. useravatar = request.session.get("username").get('avatar')
  4. songs = Songs.objects.all();dict1={};result1=[];dict2={};result2=[];
  5. for i in songs:
  6. if dict1.get(i.tag,-1)==-1:
  7. dict1[i.tag]=1
  8. else:
  9. dict1[i.tag]+=1
  10. for k,v in dict1.items():
  11. result1.append({
  12. 'value': v,
  13. "name":k
  14. })
  15. for i in songs:
  16. if dict2.get(datetime.strptime(str(i.time), '%Y-%m-%d').year,-1)==-1:
  17. dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]=1
  18. else:
  19. dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]+=1
  20. for k,v in dict2.items():
  21. result2.append({
  22. 'value': v,
  23. "name":k
  24. })
  25. context={'result1':result1,'result2':result2,'username':username,'useravatar':useravatar}
  26. return render(request,'songDistribute.html',context)
  27. def songScore(request):
  28. username = request.session.get("username").get('username')
  29. useravatar = request.session.get("username").get('avatar')
  30. songs1=Songs.objects.all().order_by('-playcount')[0:10]
  31. songs2=Songs.objects.all().order_by('-commentcount')[0:10]
  32. data1=['收藏量','分享量','评论量'];data2=['收藏量','播放量','分享量']
  33. list1=[];list2=[];list3=[];list4=[];list5=[];list6=[];list7=[];list8=[];
  34. # 取得评分前10的景点名称
  35. for p in songs1:
  36. list1.append(p.collectcount);list2.append(p.sharecount);list3.append(p.commentcount);list4.append(p.title)
  37. for p in songs2:
  38. list5.append(p.playcount);list6.append(p.collectcount);list7.append(p.sharecount);list8.append(p.title)
  39. context={'data1':data1,'data2':data2,'list1':list1,'list2':list2,'list3':list3,'list4':list4,'list5':list5,'list6':list6,'list7':list7,'list8':list8,'username':username,'useravatar':useravatar}
  40. return render(request,'songScore.html',context)
  41. def songwordcloud(request):
  42. username = request.session.get("username").get('username')
  43. useravatar = request.session.get("username").get('avatar')
  44. # wouldCloud.wouldCloudMain()
  45. context = {'username':username,'useravatar':useravatar}
  46. return render(request,'songwordcloud.html',context)
  47. def songtyperank(request):
  48. username = request.session.get("username").get('username')
  49. useravatar = request.session.get("username").get('avatar')
  50. list1_legend=[];list1=[];list2_legend=[];list2=[];list3_legend=[];list3=[]
  51. type1songs=Songs.objects.all().filter(tag='华语').order_by('-playcount')[:10]
  52. type2songs=Songs.objects.all().filter(tag='欧美').order_by('-playcount')[:10]
  53. type3songs=Songs.objects.all().filter(tag='日语').order_by('-playcount')[:10]
  54. for p in type1songs:
  55. list1_legend.append(p.title)
  56. list1.append({'value':p.playcount,'name':p.title})
  57. for p in type2songs:
  58. list2_legend.append(p.title)
  59. list2.append({'value':p.playcount,'name':p.title})
  60. for p in type3songs:
  61. list3_legend.append(p.title)
  62. list3.append({'value':p.playcount,'name':p.title})
  63. context={'username':username,'useravatar':useravatar,'list1_legend':list1_legend,'list1':list1,'list2_legend':list2_legend,'list2':list2,'list3_legend':list3_legend,'list3':list3}
  64. return render(request, 'songtyperank.html', context)
'
运行

songDistribute 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取所有歌曲数据,使用 Songs.objects.all()
  • 统计歌曲的标签(tag)和年份信息,分别存储在 dict1 和 dict2 字典中,并将统计结果转换成适合图表展示的格式。
  • 将处理后的数据传递给模板,并渲染 songDistribute.html 页面。

songScore 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取收藏量、分享量、评论量和播放量排名前 10 的歌曲数据,并将其存储在 songs1 和 songs2 列表中。
  • 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示歌曲的评分情况。

songwordcloud 函数:

这个函数的目的是生成歌曲标题和标签的词云图,用于展示歌曲标题和标签的热门关键词。在实际应用中,可以在页面上展示这些词云图,以便用户更直观地了解歌曲的热门主题和标签。

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 导入必要的模块和库,包括 Songs 模型、matplotlib 绘图库、jieba 中文分词库以及 WordCloud 词云库。

  • 从数据库中获取所有歌曲数据,使用 Songs.objects.all()

  • 遍历每首歌曲,将歌曲标题和标签(tag)拼接成一个长字符串,并使用 jieba 分词库对其进行分词处理。

  • 从文件中读取停用词(stopwords),这些词通常是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉的词语,如“的”、“了”、“是”等。

  • 对分词后的结果进行处理,去除停用词,并统计词频,将其保存在 word_dict 字典中。

  • 使用 WordCloud 词云库生成词云图,设置字体、背景颜色和尺寸等参数,并调用 generate_from_frequencies 方法根据词频生成词云图。

  • 使用 matplotlib 绘制词云图,并将其保存为静态文件(如 JPEG 格式的图片)。

  • 重复以上步骤,分别生成歌曲标签的词云图,并保存为另一个静态文件。

  • 将用户信息传递给模板,以便在页面上显示。

songtyperank 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取华语、欧美和日语歌曲的播放量排名前 10 的数据,并将其存储在 type1songstype2songs 和 type3songs 列表中。
  • 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示不同类型歌曲的播放排行。

 项目运行效果图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1015768
推荐阅读
相关标签
  

闽ICP备14008679号