环境:

  • windows

  • python3.6.5

模块:

  • requests

  • selenium

  • json

  • re

  • urllib

    环境与模块介绍完毕后,就可以来实行我们的操作了。

第1步:

通过一个解析网站:http://www.douqq.com/qqmusic/

我们可以发现,只需要在这里填写QQ音乐的地址,即可获取我们想要的音乐源文件。

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

第二步:

获取到QQ音乐的地址,打开我们的QQ音乐首页https://y.qq.com/

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

通过源文件,我们可以发现里面并没有我们想要的数据:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

那么,我们再来抓包分析:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

发现确实有我们想要的数据,但是当我们看到 headers报文当中的 url时,发现都是加密过后的数据!

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

所以涉及到了JS加密,那么 会有很多人感觉到很难,所以我们可以选择另外一个python模块selenium,直接获取我们的element 元素:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

源代码为:

url=f'https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w={name}'
driver.get(url)
driver.implicitly_wait(10)
data=driver.find_element_by_xpath('//div[@class="songlist__item"]//span[@class="songlist__songname_txt"]/a').get_attribute('href')

这里的url是通过简单分析得到的结论,只需要修改w参数即可得到不同的音乐。

第三步

把我们渠道的data链接利用到我们的解析网站:http://www.douqq.com/qqmusic/

抓包分析:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

可以发现这个是一个post请求,然后我们的表单提交的数据,就是我们的QQ音乐地址!

第四步:

模拟访问这个post请求,拿到我们的返回数据:

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    ',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.douqq.com',
    'Origin': 'http://www.douqq.com',
    'Referer': 'http://www.douqq.com/qqmusic/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}
data = {'mid': '前面取到的音乐地址'}
url = 'http://www.douqq.com/qqmusic/qqapi.php'
req = requests.post(url, data=data, headers=headers).text

它的返回值:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

可以发现MV对应的链接有偏差,不是一个规则的URL,所以在此可以进行数据精炼,得到最终音乐链接:

req = json.loads(req)
req = req.replace('\/\/', '//').replace('\/', '/')
rg = re.compile('"mp3_l":"(.*?)",')
rs = re.findall(rg, req)[0]

第五步:

下载音乐:

urlretrieve(rs, name+'.mp3')

效果:

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?-LMLPHP

05-22 16:16