模拟qq音乐网页的搜索和下载功能

第一步:模拟搜索功能
其中需要掌握request库进行爬虫
关键是获取存有歌曲信息的地址
其中第一个url的获取不能直接复制搜索网址
我在一开始直接使用搜索网址,发现无论搜什么,都是

第一个url要通过F12,获得调试网页的开发者工具,在Network中的XHR中找到文件client_search

其中的Request URL就是我们需要的歌曲信息地址,通过多次搜索,我们可以发现地址中的变量的作用,最后得到
‘https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w=%s’%(name)
其中第一个p是第一页,第二个p是搜索条数,w是搜索名

以下是搜索对象函数代码

 def searchMusic(self):        #搜索歌曲或歌手信息try:name = input("请输入歌名或者歌手:")#导入相关信息url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w=%s'%(name)html = self.getHTMLText(url).text#解码html = html[9:]html = html[:-1]js = json.loads(html)#获取歌曲信息songlist = js['data']['song']['list']#访问song字典for song in songlist:songmid = song['songmid']songname = song['songname']songsinger = song['singer'][0]['name']songid = song['songid']self.songname.append(songname)          #获取歌曲名信息self.songsinger.append(songsinger)      #获取歌手信息self.songid.append(songid)              #获取歌曲id用以获取评论地址self.songmid.append(songmid)            #获取歌曲mid用以获取歌曲下载地址if song['pay']['paydownload']:          #获取歌曲VIP信息,打印歌曲实现搜索功能self.songlist.append([songname,songsinger,songmid,'[VIP]'])print(songname,songsinger,songmid,'[VIP]')else:self.songlist.append([songname,songsinger,songmid])print(songname,songsinger,songmid)except:print("搜索功能出错!")

第二步:模拟下载功能
这一步骤的关键是得到下载地址
其中我们需要获得key_url和url
首先随便找首歌播放进入播放页面,F12+F5
在其中通过size找到最大的type是media的


我们想要下载这个文件,需要找到它的地址,其中uin和guin登录后获得,不同歌曲的vkey不同,显然我们要找到放vkey的地方,而文件中刚好有一个get vkey

进入这个url,就可以找到purl

拼接后得到下载地址,具体代码如下

    def downloadMusic(self):      #下载音乐try:want = int(input('您想下载第几首歌曲(1-10):'))self.want = want#排除VIP歌曲while want<=0:print("数据错误!,请重新输入一个大于0的数")while ['VIP'] in self.songlist[want-1]:want = int(input('抱歉,VIP歌曲无法下载,请重新输入想下载的歌曲:'))print('获取歌曲资源中,请稍等...')#获取purl链接key_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":"220844550"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"220844550","songmid":["%s"],"uin":"2212"}},"comm":{"uin":2212}}'%(self.songmid[want-1])html = self.getHTMLText(key_url).text#解码key_json = json.loads(html)final_url =key_json['req_0']['data']['midurlinfo'][0]['purl']#拼接url获得下载地址url = 'http://dl.stream.qqmusic.qq.com/' + final_urlprint("成功获取资源!")print("正在下载歌曲中......")#设置下载名称name = self.songlist[want-1][0] + '-' + self.songlist[want-1][1] + '-' + self.songlist[want-1][2]music = self.getHTMLText(url).contentwith open(name + '.mp4','wb') as f:f.write(music)print("成功下载歌曲!")f.close()except:print("下载音乐出错!")

传入数据库代码

    def connectDataBase(self):print("开始连接数据库...")#连接数据库db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='qqmusic', charset='utf8')cur = db.cursor()print("成功连接数据库")sqlc = '''          #创建音乐下载表create table if not exists download(id int(20) not null auto_increment primary key comment '编号',songname varchar(20) not null comment '歌曲名',songsinger varchar(20) not null comment '歌手',songmid varchar(30) not null comment '歌曲mid'  )'''cur.execute(sqlc)warnings.filterwarnings('ignore')       #用于忽视重复建表警告songname = self.songname[self.want-1]songsinger = self.songsinger[self.want-1]songmid = self.songmid[self.want-1]#插入数据,可检测重复下载sqli = '''replace into download(songname,songsinger,songmid)values('%s','%s','%s')''' % (songname, songsinger, songmid)try:cur.execute(sqli)db.commit()print("导入数据库成功!")except:db.rollback()print("导入数据库失败!")cur.close()

扩展功能:读取评论并制作词云

第一步:读取评论
获取评论链接:在评论界面

对比后发现topid不同,偶然发现topid和songid一致(运气好… .)
由之前得到的songid得到url

第二步:制作词云
使用wordcloud,jieba,matplotlib.pyplot模块搞定


下面是全部的代码:

import requests
import json
import jieba
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
import pymysql
import warningsclass QQmusic:def __init__(self, want=0, commentwant=0):self.songlist = []self.songname = []self.songsinger = []self.songmid = []self.songid = []self.commentwant = commentwantself.want = wantdef getHTMLText(self,url):    #获取信息页面try:r = requests.get(url,headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'},timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn rexcept:print("无法获得网页信息!")def searchMusic(self):        #搜索歌曲或歌手信息try:name = input("请输入歌名或者歌手:")#导入相关信息url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w=%s'%(name)html = self.getHTMLText(url).text#解码html = html[9:]html = html[:-1]js = json.loads(html)#获取歌曲信息songlist = js['data']['song']['list']#访问song字典for song in songlist:songmid = song['songmid']songname = song['songname']songsinger = song['singer'][0]['name']songid = song['songid']self.songname.append(songname)          #获取歌曲名信息self.songsinger.append(songsinger)      #获取歌手信息self.songid.append(songid)              #获取歌曲id用以获取评论地址self.songmid.append(songmid)            #获取歌曲mid用以获取歌曲下载地址if song['pay']['paydownload']:          #获取歌曲VIP信息,打印歌曲实现搜索功能self.songlist.append([songname,songsinger,songmid,'[VIP]'])print(songname,songsinger,songmid,'[VIP]')else:self.songlist.append([songname,songsinger,songmid])print(songname,songsinger,songmid)except:print("搜索功能出错!")def downloadMusic(self):      #下载音乐try:want = int(input('您想下载第几首歌曲(1-10):'))self.want = want#排除VIP歌曲while want<=0:print("数据错误!,请重新输入一个大于0的数")while ['VIP'] in self.songlist[want-1]:want = int(input('抱歉,VIP歌曲无法下载,请重新输入想下载的歌曲:'))print('获取歌曲资源中,请稍等...')#获取purl链接key_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":"220844550"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"220844550","songmid":["%s"],"uin":"2212"}},"comm":{"uin":2212}}'%(self.songmid[want-1])html = self.getHTMLText(key_url).text#解码key_json = json.loads(html)final_url =key_json['req_0']['data']['midurlinfo'][0]['purl']#拼接url获得下载地址url = 'http://dl.stream.qqmusic.qq.com/' + final_urlprint("成功获取资源!")print("正在下载歌曲中......")#设置下载名称name = self.songlist[want-1][0] + '-' + self.songlist[want-1][1] + '-' + self.songlist[want-1][2]music = self.getHTMLText(url).contentwith open(name + '.mp4','wb') as f:f.write(music)print("成功下载歌曲!")f.close()except:print("下载音乐出错!")def getMusicReviews(self):try:want = int(input("请输入想要获得评论的歌曲(1-10):"))self.commentwant = want#获取前10页评论for pagenum in range(0,10):#获取评论连接url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk_new_20200303=5381&g_tk=5381&loginUin=939542692&hostUin=0&format=json&inCharset=utf8&outCharset=GB2312&notice=0&platform=yqq.json&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=%s&cmd=8&needmusiccrit=0&pagenum=%d&pagesize=25&lasthotcommentid=&domain=qq.com&ct=24&cv=10101010'%(self.songid[want-1],pagenum)r = self.getHTMLText(url)html = str(r.content,'UTF-8')#解码js = json.loads(html)commentlist = js['comment']['commentlist']content = []#保存评论并删去特定字符for i in commentlist:try:content.append(i['rootcommentcontent'].replace("[em]", "").replace("[/em]", "").replace("e400", "").replace("\r",""))except KeyError:content = []breakname = self.songlist[want - 1][0] + '-' + self.songlist[want - 1][1]print("正在将评论保存到文本中......")with open(name + '-' + 'comment' + '.txt', 'a', encoding='UTF-8') as f:for i in range(len(content)):string = content[i].split("\\n")for i in string:i = i.replace("该评论已经被删除", "")f.writelines(i)f.write("\n")print("保存成功!")except:print("评论查询功能出错!")def createWordCloud(self):print("根据评论开始生成词云...")name = self.songlist[self.commentwant - 1][0] + '-' + self.songlist[self.commentwant - 1][1]with open(name + '-' + 'comment' + '.txt', 'r', encoding='UTF-8') as f:str = f.read()f.close()word = " ".join(jieba.cut(str))     #将评论句子以空格将一些关键字词分开wordcloud = WordCloud(background_color='white',   #设置词云背景为白色max_words=300,              #最大字数300stopwords=STOPWORDS,font_path='C:\Windows\Fonts\simsun.ttc',    #使用字体为微软雅黑width=1200,         #设置宽度height=800,         #设置高度max_font_size=120,      #设置字体型号random_state=45,        #随机颜色数量collocations=False,margin=2).generate(word)plt.imshow(wordcloud, interpolation='bilinear')plt.axis("off")plt.show()def connectDataBase(self):print("开始连接数据库...")#连接数据库db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='qqmusic', charset='utf8')cur = db.cursor()print("成功连接数据库")sqlc = '''          #创建音乐下载表create table if not exists download(id int(20) not null auto_increment primary key comment '编号',songname varchar(20) not null comment '歌曲名',songsinger varchar(20) not null comment '歌手',songmid varchar(30) not null comment '歌曲mid'  )'''cur.execute(sqlc)warnings.filterwarnings('ignore')       #用于忽视重复建表警告songname = self.songname[self.want-1]songsinger = self.songsinger[self.want-1]songmid = self.songmid[self.want-1]#插入数据,可检测重复下载sqli = '''replace into download(songname,songsinger,songmid)values('%s','%s','%s')''' % (songname, songsinger, songmid)try:cur.execute(sqli)db.commit()print("导入数据库成功!")except:db.rollback()print("导入数据库失败!")cur.close()QQ = QQmusic()
QQ.searchMusic()
QQ.downloadMusic()
QQ.connectDataBase()
print("是否需要读取评论并制作词云?")
ans = input("回复yes 或 no:")
if ans == 'yes':QQ.getMusicReviews()QQ.createWordCloud()
while 1:print("请问是否继续下载?")answer = input("回复yes 或 no:")if answer == 'yes':QQ = QQmusic()QQ.searchMusic()QQ.downloadMusic()QQ.connectDataBase()print("是否需要读取评论并制作词云?")ans = input("回复yes 或 no:")if ans == 'yes':QQ.getMusicReviews()QQ.createWordCloud()else:break

目前正在做推荐系统。。。书里的代码有点怪,估计要自己想办法- –

qq音乐推荐下载器(一)——模拟搜索,下载,读取评论制作词云并将下载数据传至数据库相关推荐

  1. 网易云词云python_Python3爬取网易云音乐评论制作词云!网易云评论人才辈出啊!...

    主要思路 利用Python爬取网易云音乐中相应歌曲的所有评论,并利用这些评论制作歌曲的专属词云. 具体过程见相关文件中的源代码. 开发工具 Python版本:3.5.4 相关模块: requests模 ...

  2. QQ音乐推荐召回算法的探索与实践

    文章目录 一.业务介绍 1.业务介绍 2. QQ音乐推荐场景特点 3. QQ音乐推荐解决方案 二.融合音乐知识图谱召回 三.序列与多兴趣召回 3.1 空间和时间建模方案 3.2 多兴趣提取方案 3.3 ...

  3. 【Python3.6爬虫学习记录】(九)模拟登陆QQ空间爬取好友所有留言并制作词云

    前言:非常郁闷,写了第三遍了,无故404 学了五天了,熬夜搞出这份代码,虽然一度卡死几个小时,但结果是好的. 目录 第一部分 Selenium+Chrome爬取空间留言 1.1 使用说明 1.2 代码 ...

  4. 统计QQ聊天记录进阶版(分词+统计关键字出现的次数+根据词频制作词云)

    继上个博客统计关键字次数的进阶,将关键词的次数制作成词云保存到图片.之前说过的部分现在就不说了,这里主要讲根据词频制作词云. 1.安装wordcloud(这里要注意坑) 这个安装的过程比jieba复杂 ...

  5. QQ音乐推荐歌单API报错 invalid referer

    概述 准备通过vue全家桶仿制一个QQ音乐播放器,绝大多数根据网上抓取下来的API都是没有问题的. 在获取推荐歌单API的时候,发现接口老是返回 invalid referer,下面我们来看看这个提示 ...

  6. iOS恢复QQ音乐等播放器中断

    在App中如果用AVAudioSession setActive等来中断其它播放器,当自己App中播放完毕,一般要恢复其它播放器. NSError *err; [[AVAudioSession sha ...

  7. 爬取QQ音乐中一首歌的相关信息及评论(破解反爬虫、多协程队列爬虫)

    刚写完这个实验作业,顺便来记录一下一些易错的地方: 目录 一.页面预览 二.其他信息 三.一些小细节 四.源码 项目框图: 一.页面预览 先从歌手页爬取到这首歌的相关信息,包括它歌曲.专辑的url.这 ...

  8. 【Python制作词云】分析QQ群聊信息,记录词频并制作词云

    Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDN@AXYZdong,CSDN首发,AXYZd ...

  9. 手机qq2008java通用版下载_【手机音乐】别被它的名字迷惑了,其实它是一款很良心的播放器兼无损下载器!...

    前言 蓝叔的公众号"蓝蓝分享汇"已经坚持了一段时间不定期为大家分享最新电影,美剧,英剧,韩剧等资源,有需要的小伙伴可以去关注一下.软件类的资源将不在公众号"凌晨两点蓝&q ...

  10. 【趣味编程】第1期。用python做简易版音乐下载器

    目录 前言 爬虫部分 完整代码 前言 那废话不多说,先了解准备工作. 1.先下载python,可以搜索python官网,到官网里面下载 2.下载外置模块 第一种方法,按win+R,输入cmd,然后输入 ...

最新文章

  1. 你只使用到了 VS Code 20% 的功能?让 VS Code 首著作者带你玩转 VS Code!
  2. Java程序访问Mysql Cluster
  3. Apache的网页和安全优化
  4. mpvue 小程序下拉刷新 三个点那种
  5. 职场心理:12个建议或许能改变你的一生(图)
  6. JS 入门经典 第三章 判断、循环和函数
  7. 2014年12月15日报
  8. 程序员离不开这 7 大编程方法!
  9. 基于STM32设计的数字电子秤
  10. 墙裂推荐几款桌面应用
  11. 方方格子access_FX Console(AE工作流程插件)
  12. 【数电】数电基础知识
  13. http报文格式详解!
  14. 组态王通过Modbus TCP与ESP32通讯
  15. 读博与怠工(在北航硕博连读)——转载
  16. Stimulsoft reports 2022.4.2
  17. 挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机
  18. 【翻译】CEDEC2014[跨越我的尸体2]跨越Stylized Rendering
  19. 欧几里得算法的实现(Java)
  20. 做php的灯就灭,121128 还原 我是做PHP的,女嘉宾把灯全灭了 真相

热门文章

  1. mysql 如何去掉毫秒_MySQL 关于毫秒的处理-阿里云开发者社区
  2. 苍井空老师的Twitter
  3. 基于鱼群算法的函数寻优算法
  4. java我行我素购物系统_用java怎么编写 我行我素shopping购物管理体统
  5. 聊一聊关于“元宇宙”涉及的前端技术
  6. 国产银河麒麟 安装wps 的简单方法
  7. 《白帽子讲web安全》笔记
  8. word输入带圈字符快捷键(0-20)
  9. 金蝶KIS专业版V14.1生产任务单|销售单等单据图片打印
  10. easydarwin 安装_使用EasyDarwin搭建流服务器