获取Google音乐的具体信息(方便对Google音乐批量下载)

Google音乐都是正版音乐, 不像百度所有都是盗链, 并且死链也多. 但有一个麻烦就是要下载Google音乐的时候得一个一个的点击下载链接, 进入下载页面再点"下载", 才干下载, 为此写了这个读取Google音乐具体信息(当然包含下载地址)的工具类, 仅仅要略微加功(将输出结果保存为一个HTML文件)即能够用迅雷的"下载所有链接" 进行批量下载.

GoogleMusicUtil.java

package com.hmw.web;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GoogleMusicUtil{

/**正則表達式Pattern: 提取歌曲*/
private Pattern patternName;

/**正則表達式Pattern: 提取Artist*/
private Pattern patternSonger;

/**正則表達式Pattern: 提取文件大小*/
private Pattern patternSize;

/**正則表達式Pattern: 提取格式*/
private Pattern patternFormat;

/**正則表達式Pattern: 提取下载地址*/
private Pattern patternUrl;

/**
* 构造方法
*/
public GoogleMusicUtil(){
int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
patternName = Pattern.compile("<tr class=/"meta-data-tr/"><td class=/"td-song-name/">(.*?)</td>", flags);
patternSonger = Pattern.compile("<tr class=/"meta-data-tr/">.+?<td class=/"td-singer/">(.*?)</td>", flags);
patternSize = Pattern.compile("<tr class=/"meta-data-tr/">.+?<td class=/"td-size/">(.*?)</td>", flags);
patternFormat = Pattern.compile("<tr class=/"meta-data-tr/">.+?<td class=/"td-format/">(.*?)</td>", flags);
patternUrl = Pattern.compile("<a href="/" mce_href="/""/music/top100/url//?q=(.*?)&ct=.+?", flags);
}

public static void main(String[] args) {
String url = "http://www.google.cn/music/homepage"; //首页
/*
* 同一时候还能够用下面 URL 进行測试
* "http://www.google.cn/music/chartlisting?q=chinese_new_songs_cn&cat=song&grouping=new-release_music" //排行版-->华语新歌
* http://www.google.cn/music/chartlisting?q=chinese_new-release_albums_cn&cat=album" //排行版-->最新专辑
* "http://www.google.cn/music/topiclisting?q=top100_new_age1_2009&cat=song" //专题-->天籁新世纪之音1
* http://www.google.cn/music/album?id=Befc2c2000898fb75" //专辑-->《我的黄金时代》
* http://www.google.cn/music/artist?id=A745deb6e0af83070" //歌手-->王力宏
*/
GoogleMusicUtil g = new GoogleMusicUtil();
List<String> list = g.getMusicIds(url);
if (!list.isEmpty()) {
System.out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.0 Transitional//EN/" /"http://www.w3.org/TR/html4/loose.dtd/"><html><head><meta http-equiv=/"Content-type/" content=/"text/html; charset=UTF-8/"><title>谷歌音乐批量下载</title></head><body><table>");
String id;
GoogleMusic music;
String alink;
for (int i=0; i<list.size(); i++) {
if(i>0 && i%10==0){ //每循环10次后歇息2.5秒再进行请求, 否则可能被Google当作网络攻击
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

id = list.get(i);
music = g.getGoogleMusic(id);
if(music.getUrl() == null){
alink = "<a href="/" mce_href="/""http://g.top100.cn/7872775/html/download.html?id=" + id + "/" target=/"_blank/">点击进入下载页面</a>";
}else{
alink = "<a href="/" mce_href="/""" + music.getUrl().replaceAll("%3A", ":").replaceAll("%2F", "/") + "/" target=/"_blank/">下载</a>";;
}
System.out.println("<tr><td>"+music.getId()+"</td><td>"+music.getName()+"</td><td>"+music.getSonger()+"</td><td>"+music.getSize()+"</td><td>"+music.getFormat()+"</td><td>"+alink+"</td><tr>");
}
System.out.println("</table></body></html>");
}else{
System.out.println(url + "不包括不论什么GOOGLE音乐的ID");
}
}

/**
* 依据 URL 读取应对页面的HTML源代码
* @param url Google音乐的URL
* @return String URL应对页面的HTML源代码, 假设连接到指定URL, 则返回一个空字符串("")
*/
public String getHtmlCode(String url) {
try {
URL u = new URL(url);
URLConnection urlConnection = u.openConnection();
urlConnection.setAllowUserInteraction(false);
// 使用openStream得到一输入流并由此构造一个BufferedReader对象
BufferedReader in = new BufferedReader(new InputStreamReader(u.openStream()));
String inputLine;
StringBuffer tempHtml = new StringBuffer();
while ((inputLine = in.readLine()) != null){ // 从输入流不断的读数据,直到读完为止
tempHtml.append(inputLine).append("/n");
}
return tempHtml.toString();
}catch (IOException e) {
return "";
}
}

/**
* 依据 URL 获取相应页面上的全部歌曲ID
* @param url google音乐的URL
* @return URL相应页面的全部歌曲ID的List, 假设此页面,没有歌曲ID,则返回一个长度为 0 的List
*/
public List<String> getMusicIds(String url){
String html = getHtmlCode(url);
String idPatternStr = "onclick=/"return _sl_onclickStreaming//("/music/url//?q////x3dhttp%3A%2F%2Fwww//.google//.cn.*?id%3D(.+?)%26type%3Dsong%26autoplay%3D.+?"//);/">";
Pattern p = Pattern.compile(idPatternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(html);
List<String> list = new ArrayList<String>();
String id = null;
while(matcher.find()){
id = matcher.group(1);
if(!list.contains(id)){
list.add(id);
}
}
return list;
}

/**
* 依据歌曲ID查询歌曲的具体信息
* @param id 歌曲ID
* @return 返回一个 GoogleMusic 对象, 此 GoogleMusic 对象的ID即为传过来的ID
*/
public GoogleMusic getGoogleMusic(String id){
String html = getHtmlCode("http://www.google.cn/music/top100/musicdownload?id=" + id);
Matcher mName = patternName.matcher(html);
Matcher mSonger = patternSonger.matcher(html);
Matcher mSize = patternSize.matcher(html);
Matcher mFormat = patternFormat.matcher(html);
Matcher mUrl = patternUrl.matcher(html);

GoogleMusic music = new GoogleMusic();
music.setId(id);
if(mName.find()){
music.setName(mName.group(1));
}
if(mSonger.find()){
music.setSonger(mSonger.group(1));
}
if(mSize.find()){
music.setSize(mSize.group(1));
}
if(mFormat.find()){
music.setFormat(mFormat.group(1));
}
if(mUrl.find()){
music.setUrl(mUrl.group(1));
}
return music;
}
}

PO类: GoogleMusic.java

public class GoogleMusic{
/**歌曲ID*/
private String id;

/**歌曲名称*/
private String name;

/**演唱者*/
private String songer;

/**文件大小*/
private String size;

/**文件格式*/
private String format;

/**下载地址*/
private String url;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSonger() {
return songer;
}

public void setSonger(String songer) {
this.songer = songer;
}

public String getSize() {
return size;
}

public void setSize(String size) {
this.size = size;
}

public String getFormat() {
return format;
}

public void setFormat(String format) {
this.format = format;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}
}

输入结果例如以下图:

保存为HTML文件时, 显演示样例如以下图

时间: 2024-10-06 23:18:28

获取Google音乐的具体信息(方便对Google音乐批量下载)的相关文章

一步步分析百度音乐的播放地址,利用Python爬虫批量下载

百度音乐不需要登录也可以下载?听到这个消息是不是很兴奋呢, 接下来我们打开百度音乐,随便打开一首歌,切换到百度播放页面:如图 我这里用的是Firfox 浏览器,打开firebug 先清空所有的请求,如图: 现在我们重新刷新下页面,看到这个.mp3的地址就是百度音乐的地址,我们可以直接复制到迅雷里下载,但是这种做法太初级了吧,如果有很多首歌曲呢,每个都这样复制,岂不是很麻烦啊.,接下来我们继续分析. 这个链接有个特点,就是music/1658513  这个是什么呢? 你猜的没错,这个是每首歌曲的I

Use GraceNote SDK in iOS(二)获取音乐的完整信息

在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,终于完成了在iOS上通过音乐的部分信息获取完整信息的功能了.(好吧,我承认是相对完整...) 首先介绍下在项目中配置GraceNote的iOS SDK. SDK的下载地址:Mobile Client 注意要先登录才能见到文件的下载链接.另外官网还给出来一个SDK的配置文档,完全跟着走在Xcode 5是走不通的,不过也具有一定的指导作用,建议看一看. 下载解压后,新建一个工程,

根据google地图抓去全国信息- 抓去全国小区以及新建楼盘信息

本案例由于google每天每个账户能post20000次所以我们需要相对较长的时间来抓去google的数据信息. 主要思路:通过一定的zoom一个相对较大的zoom.我们尽可能的搜索我们的所有数据. 之后我们获取google的搜索数据如下图 我们要抓去的就是上面的小红点了. 我这边抓去全国的小区信息用一台服务器跑了20天左右将全国的小区信息基本上都抓到了. 小到县 镇 的小区信息也抓到了. 相对还是比较理想.当时分析消耗了大量的时间. 由于我需要获取这个小区名称以及地图的坐标点所以这块还是有一定

信息搜集之google语法

总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎,其强大的搜索功能,可以让你在瞬间找到你想要的一切.不过对于普通的计算机用户而言,Google是一个强大的搜索引擎:而对于黑客而言,则可能是一款绝佳的黑客工具.正因为google的检索能力强大,黑客可以构造特殊的关键字,使用Google搜索互联网上的相关隐私信息.通过Google,黑客甚至可以在几秒种

获取INET4与INET6的信息

参考书籍: 本人封装的源码: // // IPAddressInfo.h // YXNETWORK // // http://www.cnblogs.com/YouXianMing/ // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h> @interface IPAddressInfo : NSObject + (NSDictionary *)net4Info; @end

ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片 <pre code_snippet_id="346208" snippet_file_name="blog_20140515_1_2220869" name="code" class="cpp">- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {

[C语言](二)01 获取Windows图形构件大小信息

SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<> //消息循环处理函数,Windows回调函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windows程序的入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIn

【工具】获取窗口与控件信息

[工具]获取窗口与控件信息 常言道,工欲善其事,必先利其器.在脚本中常见的一种操作是操作窗口或控件,在操作之前,首先必须获取目标的各种信息,这时就要用上辅助工具了.本文会介绍一些获取窗口.控件信息的常用工具,这里的先后顺序是随意安排.如果目前用的没什么问题就继续用着,如果对某些地方不满意则可试试其他.简单的截图不容易全面反映整个工具的功能和特色,使用才能获得真实体验. Active Window Info 评论:这个最初来自于 AutoIt3 且安装包中自带的工具,就无需过多介绍了.功能简陋,但

获取DNS服务器的版本信息

1 如何获取DNS服务器的版本信息 向某个DNS服务器发送下面的请求即可获得版本信息 ? 1 dig @115.124.17.156 version.bind chaos txt 它返回的信息如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6 <<>> @115.124.17.156 version.bind