python 爬虫爬取下载网易云音乐歌单的歌曲(需要使用JS的加密方法得出params去获取下载地址)

本文介绍了使用Python爬虫下载网易云音乐歌单的过程,涉及JS加密参数解析、requests库的使用、Scrapy选择器替代BeautifulSoup以及文件下载。主要难点在于解码加密参数params和encSecKey,需要分析JS代码,最终通过模拟函数实现解码,成功获取歌曲的MP3下载地址。
摘要由CSDN通过智能技术生成

要点:1.js加密就是麻烦,只能百度寻找了!设计的加密模块binascii、Crypto、base64

          2.requests.Session的用法,可以指定headers、cookies

         3.可以用scrapy.selector 替代beautiful  搜索

         4.requests 可以直接json()得到json文本

         5.用自己加到requests模块的urlretrieve 下载文件


说干就干,先打开charles,然后进入歌单页面


这时在看看charles,先从code是206(歌曲mp3的网址)开始分析,最后找到歌单

mp3文件


复制mp3的url,看看哪个网站出现


直接找到了包含歌曲url信息的网址,不过蛋疼的是这得POST,再看看post的参数


CTRL+F 了下,完全找不到这2个参数从哪里来,百度了下,特么需要解码,算了,先跳过,先说说歌单


看来很简单的了,歌名前面就是id了,但是特么没有歌手信息啊,还得再折腾

得把’song?id=64006‘ 提取出来,进入每一首歌的页面,再汇总



import requests,os,json,re
from scrapy.selector import Selector

class wangyiyun():
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'Referer': 'http://music.163.com/'}
        self.main_url='http://music.163.com/'
        self.session = requests.Session()
        self.session.headers.update(self.headers)

    def get_songurls(self,playlist):
        '''进入所选歌单页面,得出歌单里每首歌各自的ID 形式就是“song?id=64006"'''
        url=self.main_url+'playlist?id=%d'% playlist
        re= self.session.get(url)   #直接用session进入网页,懒得构造了
        sel=Selector(text=re.text)   #scrapySelector,懒得用BS4        songurls=sel.xpath('//ul[@class="f-hide"]/li/a/@href').extract()
        return songurls   #所有歌曲组成的list

    def get_songinfos(self,songurls):
        '''根据songid进入每首歌对应的url,拿到歌手名字,url就是:"http://music.163.com/song?id=64006"'''
        for songurl in songurls:
            url=self.main_url+songurl
            re=self.session.get(url)
            sel=Selector(text=re.text)
            song_id = url.split('=')[1]
            song_name = sel.xpath("//em[@class='f-ff2']/text()").extract_first()
            singer= '&'.join(sel.xpath("//p[@class='des s-fc4']/span/a/text()").extract())
            print(song_id,song_name,singer)

    def work(self,playlist):
        songurls=self.get_songurls(playlist)
        self.get_songinfos(songurls)

d=wangyiyun()
d.work(2214059025)

结果如下:



好了!,终于到了最难搞的部分,解码!!

老实说,我是不太看得明,我把我所参考的3位大神的URL贴上来,大家不妨深入研究!

C语言:https://www.zhanghuanglong.com/detail/csharp-version-of-netease-cloud-music-api-analysis-(with-source-code)

Python单纯的解码部分:https://segmentfault.com/a/1190000012818254?utm_source=tuicool&utm_medium=referral

@Jack-Cherish 老哥的完整代码:https://github.com/Jack-Cherish/python-spider

刚才已经由歌单得到歌曲的ID、歌名、歌手

接着就是如何根据歌曲ID得到MP3的URL了,很明显,中间得经过这个网址


就能得出歌曲的真实地址了,可是,需要post2个参数paramsencSecKey


这2个参数paramsencSecKey哪里来的呢,就是要解码!!

image.png


点击歌曲所在页面的控制台(F12) Sources,可以看到有很多请求的数据,这里包含 

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值