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文件时, 显演示样例如以下图

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

  1. HTML5获取地理位置信息并在Google Maps上显示

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  2. 信息搜集之google语法

    总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎, ...

  3. 第14.4节 使用IE浏览器获取网站访问的http信息

    上节<第14.3节 使用google浏览器获取网站访问的http信息>中介绍了使用Google浏览器怎么获取网站访问的http相关报文信息,本节介绍IE浏览器中怎么获取相关信息.以上节为基 ...

  4. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(四)-介绍库函数,获取一些SD卡的信息

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...

  5. ASP.NET获取客户端、服务器端的信息

    ASP.NET获取客户端.服务器端基础信息 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名: ...

  6. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  7. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  8. win7下用python3.3获取cable modem的设备信息

    毕业一年多了,一直做cable modem的测试,总是觉得在国内这一行的人才很少,想找个师傅真的很不容易. 苦闷了许久之后,终于决定,自己去写点东西,万一就找到同行了呢? 下面就是本小姐写的第一篇博客 ...

  9. html5+ 获取当前设备的加速度信息

    getCurrentAcceleration 获取当前设备的加速度信息 void plus.accelerometer.getCurrentAcceleration( successCB, error ...

随机推荐

  1. javascript 中对this关键字的一些理解

    var self = this 可能会觉得奇怪为什么我会定义一个_self的变量, 因为在js里,this不用对于其他的对象语言,他的解析过程与运行过程中this会改变的.这里简单说说js里this的 ...

  2. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程)

    1.当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vie ...

  3. 修改合同号的bapi

    这个例子是在合同号中新增项目号: 1.先要读取该合同号的信息用一个BAPI BAPI_CONTRACT_GETDETAIL 2.调用修改合同号的BAPI. 代码如下: REPORT ztest_cla ...

  4. 一些关于Console的API函数

    SetConsoleCtrlHandlerGenerateConsoleCtrlEventSetConsoleMode ReadConsole WriteConsole SetConsoleCP Se ...

  5. Solaris 11的自动化安装(AI server)的搭建

    solaris 11 总体比solaris 10很多变动的地方,可以去官方网站上面学习:http://www.oracle.com/technetwork/server-storage/solaris ...

  6. Swift - 使用NSURL进行数据的提交和获取(POST与GET)

    使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以分为同步请求和异步请求. 下面通过四个例子来进行 ...

  7. linux公社的大了免费在线android资料

    2011年linux数据库的android在线分享 linux公社:开源公社             本文撰写:杨凯专属频道 2011年9月12日 21:39 <目录> Android 3 ...

  8. MFC实现多风格真彩色大图标工具栏按钮

    研究zlib库,想实现一个类似winrar功能的小东东,打开winrar界面看它的工具栏比较好看于是动手想做一个,当然资源也使用的是winrar附带的.下面是截图:真彩色(32位)32*32大图标工具 ...

  9. Webbrowser加载Flash后方向键失效问题(用到了OLE接口,没有被处理就转发,够复杂的)

    原文:http://blog.csdn.net/dropme/article/details/6253528 窗体上放一个ApplicationEvent控件,OnMessage事件中这么写 uses ...

  10. 将Ojective-C代码移植转换为Swift代码

    相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些Objective-C代码转换成Swift,下面总结了各种常见的情况. 1,构造函数的迁移 Objective-C为: ...