通过爬虫初步实现qqMusic的搜索下载

  • 1.起点
  • 2.破局
  • 3.借鉴博客
  • 4.几个过程记录
  • 5.这一部分有待完善的功能 (还要先完成主线)
  • 6.贴下工作时补的知识
  • 7.小结


前两天因事缓了下进度,今天继续任务。

1.起点

由于之前看的网课讲得都是很基础的知识,离实际任务所需有一定差距,我个人选择借鉴他人实例,再主要融入自己的思想。也希望经过一次次的试炼,自己能有一天写出90%以上原创的代码。
通过群里简单的讨论,我了解到vkey,songmid等与qq music有关的名词,这也是我的搜索起点吧,我以他们为关键词开始思考借鉴。QQ音乐API寻找开始。。

2.破局

充分利用浏览器的开发者工具,细致检索列表内。其中有许多中间URL,最终URL也在其中。通过preview可以清楚找到许多信息参数,再从中找到歌曲所有的独特信息

3.借鉴博客

4.几个过程记录

中间url有借鉴博客。(应该是通过不同对比,发现变化的参数来确定)

android qq音乐播放器代码 qq音乐的代码_字符串


在播放页面这是一首歌曲最终的stream流地址,可以以此为检验,因为后面发现不止一个mid,vkey。

可以通过对几首歌曲信息观察,发现vkey,songmid随歌曲变化而变。而guid,uin等推测是周期改变,短时间一致。

所以,要从搜索页面和播放页面再获取信息。

android qq音乐播放器代码 qq音乐的代码_JSON_02


android qq音乐播放器代码 qq音乐的代码_字符串_03


付费歌曲的信息,注意浏览器页面preview的参数和代码里loads之后的json对象形式不一定相同,如pay_down对应代码中的paydownloaded。

android qq音乐播放器代码 qq音乐的代码_字符串_04


搜索页面,有中间URL,preview——data里面也能拿到诸如songmid的信息,vkey还没看到,可能就要去播放页面再找着了。

android qq音乐播放器代码 qq音乐的代码_JSON_05


android qq音乐播放器代码 qq音乐的代码_字符串_06


果然,下一个URL又出现了,还有想要的信息,像sip有最终头部等。

当大致信息知道如何拥有后,就可以开始通过爬虫实现基本功能。

通过借鉴实例的帮忙,我写出了初版代码。(将于近期贴上,还在完善中)

android qq音乐播放器代码 qq音乐的代码_json_07


android qq音乐播放器代码 qq音乐的代码_JSON_08


android qq音乐播放器代码 qq音乐的代码_字符串_09


-guid,uin应该要定期更新,现在自己还是手输。

5.这一部分有待完善的功能 (还要先完成主线)

1.用户交互输入错误的情况如何处理得更好 (健壮性)
2.程序运行效率的提升
3.列表全是VIP怎么办(我太穷了吧),不过可以获得VIP的songmid,还需解决URL2
4.多线程异步下载,不知能不能爬取更高音质资源
5.爬取歌曲评论,专辑图片,MV
6.GUI,现在就一原始人版音乐下载器
7.其他人性化的功能
8.代码在视觉上更整洁简洁点吧

6.贴下工作时补的知识

  • self的用处:
    1)self只有在类的方法中才会有,独立的函数或方法是不必带有self的。
    2)self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
    3)self名称不是必须的,在python中self不是关键词,定义成a或b或其他名字都可以,只是约定俗成我们定义成了self。
    4)self指的是类实例对象本身,不是类本身。
  • json文件储存:
    JSON ,全称为 JavaScript ect Notation ,也就是 JavaScript 对象标记 。它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。
    1.对象和数组
    JavaScript 语言中,一切都是对象。 因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、 对象、数组等,但是对象和数组是比较特殊且常用的两种类型。
    对象:它在 JavaScript 中是使用花括号{ }包裹起来的内容,数据结构为{ key1 value1, key2: value2 }的键值对结构。在面向对象的语言中, key 为对象的属性, value 为对应的值。键名可以使用整数和字符串来表示,值的类型可以是任意类型。
    数组:它也可以像对象那样使用键值对,但还是索引用得多。同样,值的类型可以是任意类型。
  • android qq音乐播放器代码 qq音乐的代码_json_10

  • 2.读取 JSON
    Python 为我们提供了简单易用的 JSON 库来实现 JSON 文件的读写操作,我们可以调用 json.loads ()方法将 JSON 文本字符串转为 JSON 象,可以通过 dumps ()方法将 JSON 对象转为文本字符串。
    例如,如果有一个 JSON 形式的字符串,它是 str 类型,使用 loads ()方法将字符串转为 JSON 对象,就可以用索引来获取对应的内容了。
    获得json数据中元素:
  • android qq音乐播放器代码 qq音乐的代码_json_11

  • 有关json字符串的表示使用双引号包围
  • android qq音乐播放器代码 qq音乐的代码_android qq音乐播放器代码_12

  • 如果从 JSON 文本中读取内容,例如有一个 data.json 文本文件,其内容是刚才定义的 JSON符串,可以先将文本文件内容读出( r ),然后再利用 loads ()方法转化。(这里我还没研究)
    3.输出json
  • android qq音乐播放器代码 qq音乐的代码_json_13

  • 如果想保存 JSON 的格式(整齐换行有缩进),可以再在上面dumps后加一个参数 indent ,代表缩进字符个数,如indent=2。
    如何将中文内容写入json文本:
  • android qq音乐播放器代码 qq音乐的代码_字符串_14

7.小结

从无到有,对于我这样的小白的确挺难。之前的10天我接触的基本是理论,但纸上得来终觉浅,今天通过实操,更能激发我的兴趣与动力。当底层知识有些许积累后,边做边学真的让人受益匪浅,有效进步。不要只满足于理论,这是我对自己的真心话。