利用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: '<div><blockquote><p><strong>想要更多科技類資訊,歡迎關注公眾號“
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.