这两天突然想听听杰克逊的歌.首选当然是巨鲸.
支持正版.
发现在线收听都会重复下载,浪费带宽,并且网络差的时候听让人崩溃.
下载下来.
网站不提供批量下载,手动一个一个点可不是我们程序员的风格.
分析了下它的源代码,挺整齐的,OK,jsoup
闪亮登场.这里用最新的1.51.
代码很简单:
package com.javaeye.i2534;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Top100Mp3Downloader {
/**
* 给定歌曲列表页面,返回歌曲名称和加密id的键值对
*
* @param url
* 歌曲列表地址,如:http://www.top100.cn/artist/info-agr5dcqe.shtml
* @return 键值对
*/
private Map<String, String> findIds(String url) {
try {
URL u = new URL(url);
Document doc = Jsoup.parse(u, 1000 * 10);
Element listDiv = doc.getElementById("songsListDiv");
Elements uls = listDiv.getElementsByTag("ul");
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < uls.size(); i++) {
Element ul = uls.get(i);
Element hidden = ul.getElementById("hidValue");
String id = hidden.val();
Element li = ul.getElementsByAttributeValue("class", "l3")
.first();
Element href = li.getElementsByTag("a").first();
String name = href.attr("title");
map.put(name, id);
}
return map;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 从歌曲的加密id获取歌曲的下载页面,并分析得到下载地址
*
* @param id
* 加密id
* @return 歌曲下载页面地址
*/
private String findDownPathById(String id) {
if (id.startsWith("m")) {// 所有id都是m开头
id = id.substring(1);
}
try {
URL url = new URL(
"http://www.top100.cn/download/download.aspx?Productid="
+ id);
Document doc = Jsoup.parse(url, 1000 * 2);
Elements eles = doc.getElementsByAttributeValue("onclick",
"javascript:$(this).css('color','red');");
String path = null;
for (int i = 0; i < eles.size(); i++) {
Element e = eles.get(i);
if (e.tagName().equals("a")) {
path = e.attr("href");
break;
}
}
return path;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 从获取的下载地址获取歌曲内容
*
* @param dir
* 保存到目录
* @param name
* 歌曲名称
* @param path
* 歌曲下载地址
*/
private void downByPath(String dir, String name, String path) {
File parent = new File(dir);
if (!parent.exists()) {
parent.mkdirs();
}
File mp3 = new File(parent, name + ".mp3");
try {
URL url = new URL(path);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// 此处必须伪造referer,否则会自动返回首页.分析后,与cookie无关
con
.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon;)");
con.setRequestProperty("Accept-Encoding", "gzip");
con.setRequestProperty("referer", "http://www.top100.cn");
con.setDoInput(true);
con.connect();
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = con.getInputStream();
byte[] b = new byte[1024 * 5];
int length = -1;
OutputStream os = new FileOutputStream(mp3);
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
os.flush();
os.close();
is.close();
} else {
System.out.println("服务器返回:" + con.getResponseCode());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Top100Mp3Downloader m = new Top100Mp3Downloader();
for (Map.Entry<String, String> e : m.findIds(
"http://www.top100.cn/artist/info-agr5dcqe.shtml").entrySet()) {
String name = e.getKey();
String path = m.findDownPathById(e.getValue());
m.downByPath("F:\\music\\files\\Michael Jackson", name, path);
System.out.println(name + " from " + path + " has down!");
}
}
}
本人测试,可以下载.
注:不保证一直可以使用,因为巨鲸只要改变验证或者改变任何一个html元素的特征就可以导致此程序失效.
分享到:
相关推荐
这个库的设计灵感来源于jQuery,因此,如果你熟悉jQuery的语法,使用jsoup会感到特别亲切。 **1. HTML解析** jsoup的核心功能是解析HTML文档。它可以将HTML源代码转换为一个复杂的Document对象,这个对象代表了...
jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jarjsoup-...
**JSoup:网页内容分析利器** JSoup是一个Java库,设计用于处理真实世界的HTML,它提供了非常方便的API,用于抓取和解析网页内容。在HTMLParser不再更新的情况下,JSoup是一个理想的选择,因为它能够有效地处理HTML...
Jsoup一款Java版数据挖掘工具,该资源包提供一键下载网络资源到本地 只需一个url 可携带cookie 携带自定义请求头 模拟用户操作
感觉设计的很好,最近看了java的jsoup(html 解析器)把Google的logo全部下载下来,另外,在Google logos页面发现都是英文的,通过利用Google翻译api对logo说明进行翻译,最终把图片信息以及翻译结果用json保存下来...
**Jsoup解析与使用** Jsoup是一款非常实用的Java库,专为网页抓取和解析而设计。它提供了丰富的API,使得开发者可以方便地提取结构化数据,类似于浏览器执行JavaScript的方式,但更专注于HTML文档的处理。Jsoup的...
**jsoup简介** jsoup是一款强大的Java库,用于处理和解析HTML文档。它设计的目标是使得在Java中处理HTML变得更加简单和直观。jsoup能够理解现代复杂网页的结构,并提供了丰富的API来帮助开发者提取和操作数据。这款...
1. `jsoup.jar`:Jsoup的主要库文件,包含了所有的类和方法,导入此文件即可在项目中使用Jsoup。 2. `README.md`或`README.txt`:文件说明,介绍如何使用Jsoup以及可能的注意事项。 3. `LICENSE`:Jsoup的许可协议,...
`jsoup中文API.docx`文档提供的是jsoup库的中文版API文档,这对于中文使用者来说是一大福音。它详尽地介绍了jsoup的各种类、方法和常量,帮助开发者更高效地理解和使用这个库。通常,API文档会包括以下内容: - **...
**Jsoup API 深入解析** Jsoup 是一个用于处理和解析HTML的Java库,它提供了强大的功能,使得在Java程序中操作...在实际使用中,查阅Jsoup的API文档(如jsoup-API-1.10.2-javadoc)将有助于更好地理解和利用这些功能。
在这个项目中,我们使用Jsoup配合Java,实现了抓取整个网站的功能,包括其中的图片、CSS样式表和JavaScript文件。通过这样的工具,我们可以对网页进行离线浏览或者备份,甚至进行数据分析。 首先,我们要理解Jsoup...
1. **数据抓取**:Jsoup可以轻松抓取网页上的结构化数据,如商品价格、评论等,用于数据分析或构建应用。 2. **网站验证**:在自动化测试中,Jsoup可以帮助验证HTML元素是否按预期显示或交互。 3. **内容过滤**:...
在处理完成后,你可以使用 Document 提供的各种方法来提取数据。...它简化了与网页交互的过程,尤其适合构建爬虫和网页分析应用。通过熟练运用上述方法,你可以有效地解析 HTML 并从中获取所需信息。
**使用Jsoup获取网页内容并修改** Jsoup是一款强大的Java库,它允许开发者方便地解析、操作和提取HTML内容。在Android开发中,Jsoup常用于网页数据抓取和页面内容的处理。以下将详细解释如何使用Jsoup来实现这个...
例如,你可以使用`Jsoup.connect(url).get()`来获取一个网页的HTML内容,或者用`Document.select("selector")`来选择特定的HTML元素。 **2. 源码(jsoup-1.8.3-sources.jar)** 这个文件包含了JSoup的源代码,对于...
5. **数据分析**:在大数据领域,jsoup可以作为预处理工具,将非结构化的HTML数据转化为结构化数据,便于分析。 6. **移动应用开发**:对于Android开发者,jsoup可以用来解析和展示从网络加载的HTML内容,比如在...
在网页分析领域,Jsoup是一个非常实用的工具,尤其对于那些需要从网站获取结构化数据或者进行爬虫开发的项目。 Jsoup的核心功能包括: 1. **HTML解析**:Jsoup可以解析HTML文档,将其转化为一个复杂的DOM树结构,...
Jsoup在Web抓取、数据分析和网页爬虫项目中广泛应用。本文将深入探讨Jsoup 1.5.2和1.6这两个版本的主要特性、变化以及如何在项目中使用它们。 首先,让我们了解Jsoup的基本功能。Jsoup的核心功能包括: 1. **HTML...
**jsoup库详解** `jsoup-1.8.1.jar` 是一个Java库,用于处理HTML文档。jsoup提供了一种简洁而强大的API,使得开发者可以方便地解析、操作、提取以及清洁HTML数据。这个版本是1.8.1,意味着它是该库的一个稳定版本,...