QQ音乐爬虫程序详细解析(一)——歌曲下载模块

  • 前言

       完整的QQ音乐爬虫程序分两个部分: 歌曲下载模块  +  歌曲详细信息提取模块
    
  • 歌曲下载模块构建

网页构成分析:

(1)找到QQ音乐的下载网址
    
      播放页面中,刷新F5,查看文件类型,有个type 为媒体文件media  且比较大 几M,点进去看;


然后就找到了本歌曲的下载网址:




(2)分析网址:

取两首歌曲的网址对比:

http://dl.stream.qqmusic.qq.com/ C400003YDLNN4EIffX.m4a? vkey=A308D712991EBD1D53F9B5838A4C3701CB555FA14CF338E75815DA7464FA79167A44352CD7682EAC7ABBD29CFA2A27BEBA9C8273E8E8CB00 &guid=6964837424&uin=0&fromtag=66

 Adventures 歌曲的链接:

http://dl.stream.qqmusic.qq.com/ C400001O6xe10VDdA5.m4a? vkey=2B345A6EFF534205F7D3FC37CB6526A99172E2F0D5AD657103EAA023A9F3F7EB035D12C510CA67897F255C31A9CD6911B6AF761CD0619226 &guid=6964837424&uin=247990761&fromtag=66


规律:
http://dl.stream.qqmusic.qq.com/( fileindex).m4a?(vkey=?) guid=6964837424&uin=247990761&fromtag=66

需要提前歌曲链接得参数:
  • fileindex
  • vkey

guid/uin/fromtag每首歌都是一样的

然后任务变成找到提前歌曲参数的链接,提取信息;

(3) 提取生成歌曲链接所需参数:
   
   先记住我们要找的东西:
         fileindex  例如   C400003YDLNN4EIffX
        vkey        例如 vkey=A308D712991EBD1D53F9B5838A4C3701CB555FA14CF338E75815DA7464FA79167A44352CD7682EAC7ABBD29CFA2A27BEBA9C8273E8E8CB00
   
     在歌单页面,进行元素审查,我们都知道QQ音乐采用的是JSON动态返回的方法,所以去JSON信息中去找这个歌单下歌曲的信息,看能不能有所收获:
                  

发现这个文件下有song_list ,刚好J记录这一页歌单所有歌曲的一些信息:


进一步查看:比如第一首歌曲




好像看到一些有意思的东西,albummid 格式有点像我们要的fileindex? 对不对? 验证一下:

把这首哥的地址查看下:

http://dl.stream.qqmusic.qq.com/C400002kpGuj0eD0SW.m4a?vkey=DDE737BFC8E7657EFD5370BE030349BE58436CF05659F534036EB9BD4CEA58555B39B49AEF245DB76C7CBD27F4D1B59B92D1DEA6159A1C8D&guid=6964837424&uin=247990761&fromtag=66

albummid的值格式有点像 fileindex ,但是值!=  C400002kpGuj0eD0SW  所以,应该不是我们要找的;
ctrl+F5  元素分析中搜索  C400002kpGuj0eD0SW.  



居然没有找到!!  难道是什么地方搞错了?? 仔细一看,songmid= 2kpGuj0eD0SW  这个匹配 ,再看 规律是 C4000+ songmid -> FILEINDEX:

修改下歌曲URL的规律:
http://dl.stream.qqmusic.qq.com/C4000(+songmid).m4a (+vkey=xxxx ) guid=6964837424&uin=247990761&fromtag=66

所以通过提取fcg_ucc _xxx  这个文件的链接下的内容,可以得到歌单下所有歌曲的 songmid;(敲黑板,画重点)

继续找vkey ing...........................

在歌单页面的json信息和XHR中都找不到vkey.....

点击进入歌曲页面,元素审查查找:

找到了对应歌曲的vkey的内容:


9528911464323242

对应的URL链接:
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065&jsonpCallback=MusicJsonCallback8283129727027805&loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback8283129727027805&uin=247990761&songmid=002kpGuj0eD0SW&filename=C400002kpGuj0eD0SW.m4a&guid=6964837424

 从这个链接可以提取cool的vkey值;but 怎么提取整个歌单下面所有歌曲的vkey值呢?....................

分析上面这个链接个规律:(还是用对比法吧!)

另一首歌的:
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065&jsonpCallback=MusicJsonCallback14456243607230945&loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback14456243607230945&uin=247990761&songmid=001O6xe10VDdA5&filename=C400001O6xe10VDdA5.m4a&guid=6964837424

特异性的参数标注如下:


建立一个通用的可以提取 所有歌 vkey的URL 地址公式:

https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065& jsonpCallback={0}&loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747& callback={1}&uin=247990761& songmid={2}& filename=C40000{3}.m4a&guid=6964837424. format(jsonpCallback,callback,songmid,songmid )

目前需要提取得参数: jsonpCallback,callback  ...............
 jsonpCallback 和callback  还有可以简化的规律,他们都相同,且遵循:
    ”MusicJsonCallback”+ “一个相同的ID值”

现在需要找到这个ID值: .......
找了一圈没有找到,怎么办,草泥马飞过~~~~

难道 jsonpCallback,callback参数可有可无!!??

试试下面的网址,删除了 jsonpCallback,callback:


https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065&loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747&uin=247990761&songmid=001O6xe10VDdA5&filename=C400001O6xe10VDdA5.m4a&guid=6964837424

居然访问成功!!!再次一万匹 草泥马飞过~~~~

自此,大功告成,修改前面 有歌 通用vkey的URL 地址公式:
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065& &loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747& &uin=247990761& songmid={0} & filename=C40000{1} .m4a&guid=6964837424. format(songmid,songmid )

总结:

(1)歌曲下载通用地址:" http://dl.stream.qqmusic.qq.com/ C400{0} .m4a?vkey={1} guid=6964837424&uin=247990761&fromtag=66 ".format(songmid,vkey)

(2) songmid 在歌单页面,json中可以得到当前页面所有歌的songmid;

(3)vkey 的提取URL地址 :

 “ https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=1160855065& &loginUin=247990761&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747& &uin=247990761& songmid={0} & filename=C400{1} .m4a&guid=6964837424”. format(songmid,songmid )

(4)歌曲对应唯一的songmid  ->  vkey的地址  -> 唯一的vkey  -> 得到歌单里每一首歌曲下载地址

  歌曲下载的地址爬取完成!!

歌曲下载部分示例代码:

     download_music只负责单个歌曲下载功能; 输入一个对应歌曲的songmid (songmid在歌曲详细信息函数提取,并将多个music的信息分别送入download_music),得到对应歌曲的下载文件输出;















你可能感兴趣的:(phython技术)