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 = "οnclick=/"return _sl_onclickStreaming//("/music/url//?qx3dhttp%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. Android获取酷狗音乐歌曲详细信息

    Android获取酷狗音乐歌曲详细信息 一.目标 二.实现方案 三.最终方案 四.网易云音乐 五.遗留问题 六.接下来 七.Finally 在<Android获取歌曲详细信息>一文中,介绍 ...

  2. Android获取网易云音乐歌曲详细信息

    Android获取网易云音乐歌曲详细信息 一.目标 二.实现方案 三.最终方案 四.遗留问题 五.接下来 六.Finally 在<Android获取歌曲详细信息>一文中,介绍了几种获取网易 ...

  3. Python爬取网易云各类音乐的详细信息

    python爬虫:通过selenium+requests爬取各类音乐的详细信息 完整代码如下: from selenium import webdriver from lxml import etre ...

  4. 用WMI获取远程机器操作系统的详细信息

    使用WMI获取远程机器操作系统的详细信息 大杂烩-.NET 代码主题部分的OperatingSystem类,是使用工具(Management (WMI) Extensions for Visual S ...

  5. linux 获取模块,get_module - 获取Linux内核模块的详细信息

    补充说明 get_module命令 用于获取Linux内核模块的详细信息. 语法 get_module 模块名 实例 使用lsmod命令查看内核模块: lsmod | head -5 Module S ...

  6. taobao.trade.fullinfo.get( 获取单笔交易的详细信息 )、淘宝店铺卖出订单详情接口,店铺订单明文接口,店铺订单解密接口,店铺订单消息推送接口

    taobao.trade.fullinfo.get( 获取单笔交易的详细信息 ),淘宝店铺卖出订单详情接口,对接该接口可用于获取淘宝店铺订单详情信息,包括卖出订单详情,买家姓名,买家电话,买家收货地址 ...

  7. taobao.trade.fullinfo.get( 获取单笔交易的详细信息 )、淘宝店铺卖出订单详情接口,淘宝店铺订单明文接口,淘宝店铺订单解密接口

    taobao.trade.fullinfo.get( 获取单笔交易的详细信息 ),淘宝店铺卖出订单详情接口,对接该接口可用于获取淘宝店铺订单详情信息,包括卖出订单详情,买家姓名,买家电话,买家收货地址 ...

  8. taobao.trade.fullinfo.get( 获取单笔交易的详细信息API接口),淘宝店铺订单明文接口代码分享

    采用官方taobao.trade.fullinfo.get( 获取单笔交易的详细信息 )接口拿到店铺订单详情,包括:买家信息,交易创造时间,商品交易数据,商品订单号,付款时间,付款金额,收货人手机号码 ...

  9. PC企业微信HOOK接口,获取指定好友的详细信息

    简要描述 获取指定好友的详细信息 操作码 102017 请求说明 参数名 必选 类型 说明 type 是 int 类型 user_id 是 string 用户id syncKey 是 string 同 ...

最新文章

  1. I am too vegetable to all kill the 51nod problems on level 2 and 3.
  2. mysql的联合索引_mysql联合索引
  3. go 定义一个结构体并赋初始值_Go中必须谈论的四个迷点
  4. 午夜十分之凌晨三点半
  5. iphone3G恢复到3.1.2遇到的问题
  6. mysql 替换 汉字_MySQL替换文字
  7. (转)JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别
  8. CSU 1556 Pseudoprime numbers
  9. Java基础篇之什么是CharArrayWriter
  10. BZOJ4568 [Scoi2016]幸运数字
  11. tpl_main_page.php
  12. Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法
  13. paip.模块间同步登录SSO实现总结
  14. 终端的乐趣--Linux下有趣的终端命令或者工具
  15. 基于人工萤火虫优化(GSO)算法的函数寻优算法
  16. 黑苹果E430c, 安装过程
  17. 香港服务器低价租用内幕
  18. SAP BW/4 HANA基础学习(二)
  19. SDIO读写SD卡速度有多快?
  20. 程序员写博客的意义何在?为什么推荐程序员写个人博客?

热门文章

  1. z变换判断稳定性和因果性_江苏自学考试数学信号处理教材大纲
  2. L3智能驾驶控制算法及验证、自动驾驶道路测试与数据采集、场景挖掘
  3. 增强现实AR的Python实现
  4. Unity制作自定义字体的两种方法
  5. 关于酒吧抓酒鬼最后一点补充理解
  6. python chain.from_iterable()
  7. 在Ubuntu 10.04下使用uTorrent下载六维空间资源
  8. 谈谈基于Go的Aop设计
  9. painter打不开问题的解决
  10. 【Linux】在Xilinx平台上实现UVC Gadget(1)