前些天偶然听到了某首歌, 发现挺好听的,然后打开歌曲评论,发现评论数竟然高达80多万,紧接着我又看了下歌曲的发行日期,17年的,看到这就不能忍了,像我这种音乐达人(自恋一会)怎麽能不知道这种好歌呢!!!
然后刚好最近考完试,于是决定写个类似的爬虫程序来爬取高评论数歌曲,好了,废话不多说,下面开始介绍下程序吧。
针对的是手机酷狗app(为啥不是别的我就懒得说了,没有啥原因),然后是Fiddler对手机抓包,抓包过程我就省略了。
抓包研究一会后,发现每首歌曲关键的地方是它对应的Hash值,通过这个Hash可以获取到诸多信息,比如评论,关联歌单信息等等。
然后主要就是模拟发包了,特别要注意包内的参数,具体参见代码注释吧!
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author As_
* @since 2018/07/07
* @email apknet@163.com
* @github https://github.com/apknet
*
*/
public class Main {
// public static int n = 0;
public static Map mapKey = new HashMap();
public static void main(String[] args) {
//以抓包获取到的某首歌曲Hash值为着手点
//c3e7e3306a10374b801cc39e0de6bdca
try {
//外面for遍历入口歌曲关联的歌单,里面for遍历每个歌单内的歌曲列表。如果想更大范围内爬取,可以多加几次循环!
for(String colId : musToCol("c3e7e3306a10374b801cc39e0de6bdca")){
for(Map.Entry<String, String> map : colToHash(colId).entrySet()){
hashToComment(map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//由歌曲Hash提取推荐歌单 static List<String> musToCol(String hash) { //仅更改歌曲Hash即可得到关联歌单信息 //网址参数能减少的我都尽量减了,剩下差不多都是些必要参数 String str = String.format("http://servicegz.mobile.kugou.com/v1/yueku/special_album_recommend?api_ver=1&album_audio_id=29010106&num=30&hash=%s", hash); // String str = "http://servicegz.mobile.kugou.com/v1/yueku/special_album_recommend?api_ver=1&album_audio_id=29010106&num=10&hash=791A040895D0D7998F63E0D9DACBE5B6"; List<String> list = new ArrayList<>(); try { URL url = new URL(str); InputStream in = url.openStream(); BufferedReader reader = new