爬虫初上手之爬取QQ音乐!
程序员文章站
2022-07-15 14:12:18
...
爬虫初上手之爬取QQ音乐!
作为一名爬虫界的萌新,我终于通过了新手教程——requests库的学习,兴致勃勃地撸起袖子准备大爬一场大干一场。
我的第一个爬取目标是QQ音乐。在我的设想中,一个网站的根目录下有很多子目录,里面装着子网页和各种资源,其中一个文件夹就是音乐库,所有的音乐都在里面被分门别类地存放好,我只要找到这个文件夹就好了。比如这样:r = requests.get('https://y.qq.com/music/你的名字.mp3')
“爬虫真是又简单又方便!一行代码连QQ音乐都能爬下来!”我这么想着,打开了QQ音乐的主页,然后就看到了这个:
emmm,好吧,看样子事情并没有我想的那么简单。
WTF?!网页版下不了歌??那我怎么爬?我人都傻了。。
没办法,看样子我还是太菜了,所以我只好在网上找资料,看看大神都是怎么爬的。
。
。。
。。。
。。。。
。。。。。
。。。。。。
终于,被我找到了一个大神的博客:https://blog.csdn.net/weixin_44119390/article/details/90812246
这篇博客不长,在大神一通眼花缭乱看不懂的操作之后,就成功找到了资源的url。
没办法,一步一步地查资料,一点一点地理解吧,慢慢来。。。
。。。。。。
。。。。。
。。。。
。。。
。。
。
我终于弄懂大神的意思了哈哈哈哈哈~~(笑容中透着心酸)~~
以下是参考博主后我自己的代码:
import requests
import json
import os
class QQmusic:
def __init__(self):
self.songlist = []
def get(self,url): # 访问服务器
try:
res = 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'})
res.raise_for_status()
except:
print('连接服务器失败!')
os.system("pause")
else:
res.encoding = 'utf-8'
return res
def search(self): # 搜索音乐
name = input('请输入歌名或歌手:')
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=20&w=%s'%(name)
html = self.get(url).text
html = html[9:]
html = html[:-1]
html = json.loads(html) # 获取歌曲信息
self.songlist = html['data']['song']['list']
for song in self.songlist:
if song['pay']['paydownload']:
print(song['songname'],song['singer'][0]['name'],'[VIP]')
else:
print(song['songname'], song['singer'][0]['name'])
def download(self): # 下载音乐
choice = int(input('您想下载第几首歌(1~20):'))
while self.songlist[choice-1]['pay']['paydownload']:
choice = int(input('您无法下载VIP歌曲!请重新输入(1~20):'))
print('开始获取资源......') # 获取vkey,purl
keyUrl = 'https://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":"9106200888"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"9106200888","songmid":["%s"],"uin":"3137"}},"comm":{"uin":3137}}'%(self.songlist[choice-1]['songmid'])
html = self.get(keyUrl).text
html = json.loads(html)
purl = html['req_0']['data']['midurlinfo'][0]['purl']
url = 'http://dl.stream.qqmusic.qq.com/' + purl # 拼凑资源url
print('资源地址获取成功')
music = self.get(url).content
with open(self.songlist[choice-1]['singer'][0]['name'] + ' ' + self.songlist[choice-1]['songname'] + '.mp4', 'wb') as f:
f.write(music)
print('下载完成')
f.close()
os.system("pause")
QQ = QQmusic()
QQ.search()
QQ.download()
运行结果:
emmm,界面好丑,接下来是GUI图形化了,又是一块硬骨头。。