QQ音乐API爬取全过程
1. 前序:
在以前的QQ音乐的API爬取中,是非常容易的,采用的是jsonp的请求方式,但现在QQ音乐请求已经全部改成XHR的ajax的方式发送请求,所以要爬取QQ音乐的数据就需要破解QQ音乐发送请求的参数。
2. 对于前端:
在前端发送XHR请求的话会有请求端跨域限制,所以对于前端不能直接发送XHR请求到QQ音乐后端,而是要自己另外搭一个服务器,用我们的服务器去向QQ音乐发送请求。
3. QQ音乐接口分析:
以获取QQ音乐的焦点图为例。
这是我们要爬取的图片。在浏览器中按F12,然后查看network的xhr请求,可以看到。
QQ音乐是从这里拿到的数据,所以对于这个接口分析。
Request Header:
在这个请求的header中,是有服务端referer和origin限制的,所以为了骗过QQ音乐的服务器,我们在我们后台发的请求的header中也要把origin和referer设置成和QQ音乐一样。
Query String Parameters:
可以看到QQ音乐的params中是有’-'和sign签名的,我们要拿到这个数据,首先就是要这两个的加密的获取方式,而在其他中,实际上都是一些静态数据,直接复制上去就好了。
4. ‘-’和Sign的获取
要知道怎么获取’-‘或者sign就必须知道这两个加密是怎么产生的,所以在浏览器的控制台中按ctrl+shift+f。
首先我们搜索recom,在’-'中recom是一个不变的量。
在ctrl+shift+f搜索到的文件中,先把它格式化,然后按ctrl+f就可以在文件中搜索我们要的数据。
在这个请求中我们可以看到recom的获取是通过。
'recom' + (Math.random() + '').replace('0.', '')
这么一个方法。所以我们这个加在请求中就可以了。
然后是sign的获取,sign的获取会些许麻烦。
用相同的方法,我们可以看到sign是从一个getSecuritySign获取的,然后这个方法使用通过一个js文件获取,链接挂在下面。
'地址y.qq.com/component/m/qmfe-security-sign/index.umd.js?max_age=2592000'
先把这个js格式化之后,可以大概的看一下这个js文件。
可以看到,封装了一个__sign_hash_20200305的function。
所以我们把这个js复制下来,放到自己的文件当中,然后自己写一个方法去获取这个sign的值,然后把这个方法导出去。
export default function getSecuritySign(data) {
let str = 'abcdefghijklmnopqrstuvwxyz0123456789'
let count = Math.floor(Math.random() * 7 + 10)
let sign = 'zza'
for (let i = 0; i < count; i++) {
sign += str[Math.floor(Math.random() * 36)]
}
sign += window.