获取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文件时, 显演示样例如以下图
获取Google音乐的具体信息(方便对Google音乐批量下载)的更多相关文章
- HTML5获取地理位置信息并在Google Maps上显示
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 信息搜集之google语法
总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎, ...
- 第14.4节 使用IE浏览器获取网站访问的http信息
上节<第14.3节 使用google浏览器获取网站访问的http信息>中介绍了使用Google浏览器怎么获取网站访问的http相关报文信息,本节介绍IE浏览器中怎么获取相关信息.以上节为基 ...
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(四)-介绍库函数,获取一些SD卡的信息
其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...
- ASP.NET获取客户端、服务器端的信息
ASP.NET获取客户端.服务器端基础信息 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名: ...
- asp.net获取服务端和客户端信息
asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- win7下用python3.3获取cable modem的设备信息
毕业一年多了,一直做cable modem的测试,总是觉得在国内这一行的人才很少,想找个师傅真的很不容易. 苦闷了许久之后,终于决定,自己去写点东西,万一就找到同行了呢? 下面就是本小姐写的第一篇博客 ...
- html5+ 获取当前设备的加速度信息
getCurrentAcceleration 获取当前设备的加速度信息 void plus.accelerometer.getCurrentAcceleration( successCB, error ...
随机推荐
- 讲解下for循环的用法,加深记忆
引子 这是一段很简单的代码,但是即便是这么简单的东西,这里我们还是需要说一下. 关于for循环整个执行流程就是,先执行var i=10,然后到了第二个语句,判断10是否大于0,很明显为true,所以此 ...
- Spring MVC 多选框 绑定 Entity 中的 list 属性
问题描述: 有两个类:Record.java 和 User.java,Record中有个attenders属性,是List<User>类型. 我想绑定Record中的attenders.网 ...
- quartz 2.1学习(一)
quartz是一种开源任务调度框架,提供了强大的任务调度机制,Quartz允许开发人员灵活地定义触发器的调度时间表,并可对触发器和任务进行关联映射.废话不多说了,介绍一下编程的基本步骤: 实现Job接 ...
- 【Bootstrap3.0建站笔记二】button可下拉弹出层
1.button可下拉弹出层: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hpbmFwbGFu/font/5a6L5L2T/fontsize/400 ...
- Qt中用正則表達式来推断Text的语种,主要通过推断unicode的编码范围
QString MainWindow::ParseLanguage(QString Text) { if(Text.length()<=0) { return & ...
- event.srcElement获得引发事件的控件(表单)
<1> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- 棋盘问题 简单搜索DFS
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- shell字符串长度
方法一 $ expr length "Find out the length of this string from Linux Bash shell." 57 方法二 str1= ...
- MySQL内存表的特性与使用介绍 -- 简明现代魔法
MySQL内存表的特性与使用介绍 -- 简明现代魔法 MySQL内存表的特性与使用介绍
- 显示形状回归算法(ESR)代码介绍
源地址:http://www.thinkface.cn/thread-3704-1-6.html 人脸对齐包括两个部分,分别为训练部分和测试部分.所有的代码基于opencv2.0.(一)训练阶段Ste ...