要点: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) #用scrapy的Selector,懒得用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贴上来,大家不妨深入研究!
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个参数params跟encSecKey
这2个参数params跟encSecKey哪里来的呢,就是要解码!!
点击歌曲所在页面的控制台(F12) Sources
,可以看到有很多请求的数据,这里包含