1. 程式人生 > >利用JAVA發掘(爬取)酷狗流行音樂(或評論)

利用JAVA發掘(爬取)酷狗流行音樂(或評論)

前些天偶然聽到了某首歌, 發現挺好聽的,然後開啟歌曲評論,發現評論數竟然高達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 
[email protected]
* @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 BufferedReader(new InputStreamReader(in));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            reader.close();
            in.close();
            String strJson = stringBuilder.toString();
//            System.out.println(strJson);
//下面操作是解析json獲得歌單的識別碼specialid
JSONObject jsonObject = new JSONObject(strJson).getJSONObject("data").getJSONObject("info");

//            System.out.println(jsonObject);
JSONArray jsonArray = jsonObject.getJSONArray("special");
            for (int i = 0; i < jsonArray.length(); i++) {
                jsonObject = (JSONObject) jsonArray.get(i);
                //   System.out.println(jsonObject.getString("specialid") + '\n');
list.add(jsonObject.getString("specialid"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    //提取歌單中歌曲對應歌曲Hash值
static Map<String, String> colToHash(String colId) {
        String str = String.format("http://mobilecdngz.kugou.com/api/v3/special/song?version=8983&plat=0&pagesize=-1&area_code=1&page=1&specialid=%s&with_res_tag=1", colId);
        //        List<String> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();
        try {
            URL url = new URL(str);
            InputStream in = url.openStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            reader.close();
            in.close();            //去除頭尾多餘的資訊,以免影響json的格式
String strJson = stringBuilder.toString().replace("<!--KG_TAG_RES_START-->", "").replace("<!--KG_TAG_RES_END-->", "");
            //            System.out.println(strJson);
JSONObject jsonObject = new JSONObject(strJson).getJSONObject("data");//            System.out.println(jsonObject);
JSONArray jsonArray = jsonObject.getJSONArray("info");
            for (int i = 0; i < jsonArray.length(); i++) {
                jsonObject = (JSONObject) jsonArray.get(i);
                map.put(jsonObject.getString("hash"), jsonObject.getString("remark"));
                //                System.out.println(jsonObject.getString("hash") + '\n');
                //                list.add(jsonObject.getString("hash"));
}
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    // 由Hash值得到評論
static void hashToComment(Map.Entry<String, String> map) {
//引數列表中的code好像是個定值, 每首歌曲都是對應的這個值。後面的extdata也就是歌曲hash值了
String str = String.format("http://m.comment.service.kugou.com/index.php?r=commentsv2/getCommentWithLike&code=fc4be23b4e972707f36b8a828a93ba8a&clientver=8983&extdata=%s&p=1&pagesize=20", map.getKey());
        try {
            URL url = new URL(str);
            InputStream in = url.openStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            reader.close();
            in.close();
            //            System.out.println(stringBuilder.toString());
JSONObject jsonObject = new JSONObject(stringBuilder.toString());
            // 獲取歌曲中的評論
/*  System.out.println(jsonObject.get("list"));
                                JSONArray jsonArray = jsonObject.getJSONArray("list");
                                for(int i = 0; i < jsonArray.length(); i++){
                                    jsonObject = (JSONObject) jsonArray.get(i);
                                    System.out.println(n + ". " + jsonObject.getString("content") + '\n');
                                    n++;
                     }*/
//獲得歌曲評論數
int comCount = jsonObject.getInt("combine_count");
            //          System.out.println(comCount);
            //評論數15萬以上的就打印出來
if (comCount > 150000) {
                System.out.println(comCount + ": " + map.getValue());
                mapKey.put(map.getKey(), map.getValue());
            }
        } catch (Exception e) {
            System.out.println("- - - - - -> 抱歉,該歌曲未提供評論功能!");
            e.printStackTrace();
        }
    }



}

最後就是實驗截圖了

相關推薦

利用JAVA發掘流行音樂評論

前些天偶然聽到了某首歌, 發現挺好聽的,然後開啟歌曲評論,發現評論數竟然高達80多萬,緊接著我又看了下歌曲的發行日期,17年的,看到這就不能忍了,像我這種音樂達人(自戀一會)怎麼能不知道這種好歌呢!!!然後剛好最近考完試,於是決定寫個類似的爬蟲程式來爬取高評論數歌曲,好了,廢

利用java-maven程式西刺網頁的ip代理

主要程式碼: package com.itquwei.spider; import java.io.IOException; import java.nio.charset.Charset; import org.apache.http.HttpEntity; import org.a

利用正則表示式處理的今日頭條內容資料Python爬蟲資料清洗

本次要處理的是抓取的頭條內容,內容如下: content = '''content: '&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;想要更多科技類資訊,歡迎關注公眾號“

java實現簡單的網路爬蟲電影天堂電影資訊

在最開始,我們要在網上下載所用到的jar包,應為這只是一個簡單的網路爬蟲所以很多包裡的內容沒有用到。 下面幾個包就可以了。並且要引入這些包。 主類Bigdata.javaimport org.htmlparser.util.ParserException; public

利用協程asyncio美女圖片——實戰

上節我們詳細的介紹了asyncio庫的應用(連結https://blog.csdn.net/MG1723054/article/details/81778460),本節我們將其應用到實戰之中。主要還是以分析ajax爬取搜狗美女圖片(連結https://blog.csdn.net/MG172305

利用協程asyncio美女圖片——asyncio庫的介紹和使用

上一節,我們通過分析ajax爬取搜狗美女圖片,(連結https://blog.csdn.net/MG1723054/article/details/81735834)這樣爬取的效率相對來說比較高,在文章的末尾我們使用程序池來提高效率,但是由於爬蟲主要是密集型IO操作,利用程序對其提高時效率不高,

scrapy爬蟲和Django後臺結合音樂

程式碼結構:  Spider/spider/kuwo.py爬蟲程式碼: # -*- coding: utf-8 -*- import scrapy import demjson import re import os from ..items import Mus

利用python的bs4和selenium庫結合實現動態頁面的天氣網上面的歷史天氣資料

報告分析需要歷史氣象資料,查詢到天氣網上面有歷史天氣資料,從2011年到2018年,第一次接觸爬蟲,在網上找了爬取天氣網歷史資料的python原始碼,利用bs4庫,但是實際操作中發現soup.select( )函式返回的列表總是[ ] (空),查詢發現天氣網目前使用的是javascript寫的動態頁

使用BeautifulSoup“0daydown”站點的信息2——字符編碼問題解決

snippet sni 結束 編碼錯誤 charset utf 教程 作者 request 上篇中的程序實現了抓取0daydown最新的10頁信息。輸出是直接輸出到控制臺裏面。再次改進代碼時我準備把它們寫入到一個TXT文檔中。這是問題就出來了。 最初我的代碼例如以

關於html的多行匹配,正則re.S的使用豆瓣電影短評

htm detail 3.1 port encoding 關於 color tel frame 參考鏈接:http://www.python(tab).com/html/2017/pythonhexinbiancheng_0904/1170.html(去除括號)     

關於json內容生成詞雲瘋狂踩坑

.sh 動態 cnblogs google 插件 save result json數據 keys 本文爬取了掘金上關於前端前n頁的標題。將文章的標題進行分析,可以看出人們對前端關註的點或者近來的熱點。 導入庫 import requests import re from

網絡爬蟲網站圖片,自動保存本地

accep RoCE itl mage pytho range @class == title 事先申明一點,這個人品沒有什麽問題,只是朋友發一段python源碼,再這裏分享大家。 1 import requests 2 from lxml import html

原生爬蟲熊貓直播人氣主播排名

show () 字節碼 content see http color open span ‘‘‘‘ This is a module ‘‘‘ import re from urllib import request # 斷點調試 class Spider()

★ Python爬蟲 - 網頁文字資訊並儲存美文的與儲存

 本篇文章所包含的主要內容:  使用requests模組實現對網頁以字串的形式儲存 使用open()、write()、close()函式實現檔案的開啟與寫入 使用if() 條件語句對所需要的文字資訊進行過濾以形成一個專用提取函式 &n

Web偵察工具HTTrack 整站

項目 name 一個 下載 root image inf 爬取 獲取 Web偵察工具HTTrack (爬取整站) HTTrack介紹 爬取整站的網頁,用於離線瀏覽,減少與目標系統交互,HTTrack是一個免費的(GPL,自由軟件)和易於使用的離線瀏覽器工具。它允許您從Int

Python 爬蟲簡單實現 下載連結

原文地址:https://www.jianshu.com/p/8fb5bc33c78e 專案地址:https://github.com/Kulbear/All-IT-eBooks-Spider 這幾日和朋友搜尋東西的

Python爬蟲實戰專案1 | 基礎爬蟲的實現100條百度百科詞條

【基礎爬蟲篇】 本篇講解一個比較簡單的Python爬蟲。 這個爬蟲雖然簡單,但五臟俱全,大爬蟲有的模組這個基礎爬蟲都有,只不過大爬蟲做的更全面、多樣。 1.實現的功能:這個爬蟲實現的功能為爬取百度百科中的詞條資訊。爬取的結果見6。 2.背景知識:(1).Python語法;(2).Be

python爬蟲——記一次前所未有的經歷魔方格作文

前言 我還是第一次遇到魔方格這麼處理請求的網站,這裡記錄一下   過程 1、爬取物件:http://zuowen.mofangge.com/html/zwDetail/20161023/u111424965.html 需要抓取中間作文格里的作文  

HttpClient 實現百度搜索結果自動翻頁

如果你對HttpClient還不是很瞭解,建議先移步我的另一篇部落格HttpClient4.x之請求示例後再來看這篇部落格。我們這裡的專案採用maven搭建。在閱讀前要對jdk和maven有一定的瞭解。另外開發工具這裡我這裡使用的是:Spring Tool Suite(STS)當然你也可以使用其

python實戰之網路爬蟲新聞內文資訊

(1)前期準備:開啟谷歌瀏覽器,進入新浪新聞網國內新聞頁面,點選進入其中一條新聞,開啟開發者工具介面。獲取當前網頁資料,然後使用BeautifulSoup進行剖析,程式碼: import requests from bs4 import BeautifulSoup res = requests.