`
i2534
  • 浏览: 182497 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用jsoup分析下载巨鲸的mp3

    博客分类:
  • util
阅读更多

这两天突然想听听杰克逊的歌.首选当然是巨鲸.

支持正版.

发现在线收听都会重复下载,浪费带宽,并且网络差的时候听让人崩溃.

下载下来.

网站不提供批量下载,手动一个一个点可不是我们程序员的风格.

分析了下它的源代码,挺整齐的,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元素的特征就可以导致此程序失效.

分享到:
评论

相关推荐

    jsoup常用包下载

    这个库的设计灵感来源于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.jar,jsoup-1.15.3.jarjsoup-...

    jsoup网页内容分析

    **JSoup:网页内容分析利器** JSoup是一个Java库,设计用于处理真实世界的HTML,它提供了非常方便的API,用于抓取和解析网页内容。在HTMLParser不再更新的情况下,JSoup是一个理想的选择,因为它能够有效地处理HTML...

    jsoup写下载.txt

    Jsoup一款Java版数据挖掘工具,该资源包提供一键下载网络资源到本地 只需一个url 可携带cookie 携带自定义请求头 模拟用户操作

    使用HttpClient 和 jsoup 下载 Google logo

    感觉设计的很好,最近看了java的jsoup(html 解析器)把Google的logo全部下载下来,另外,在Google logos页面发现都是英文的,通过利用Google翻译api对logo说明进行翻译,最终把图片信息以及翻译结果用json保存下来...

    Jsoup解析与使用

    **Jsoup解析与使用** Jsoup是一款非常实用的Java库,专为网页抓取和解析而设计。它提供了丰富的API,使得开发者可以方便地提取结构化数据,类似于浏览器执行JavaScript的方式,但更专注于HTML文档的处理。Jsoup的...

    jsoup 1.10.2 和 1.8.1包下载

    **jsoup简介** jsoup是一款强大的Java库,用于处理和解析HTML文档。它设计的目标是使得在Java中处理HTML变得更加简单和直观。jsoup能够理解现代复杂网页的结构,并提供了丰富的API来帮助开发者提取和操作数据。这款...

    Jsoup库文件;Jsoup解析Java包

    1. `jsoup.jar`:Jsoup的主要库文件,包含了所有的类和方法,导入此文件即可在项目中使用Jsoup。 2. `README.md`或`README.txt`:文件说明,介绍如何使用Jsoup以及可能的注意事项。 3. `LICENSE`:Jsoup的许可协议,...

    jsoupjar+jsoup中文API

    `jsoup中文API.docx`文档提供的是jsoup库的中文版API文档,这对于中文使用者来说是一大福音。它详尽地介绍了jsoup的各种类、方法和常量,帮助开发者更高效地理解和使用这个库。通常,API文档会包括以下内容: - **...

    JsoupAPI(jsoup帮助文档)

    **Jsoup API 深入解析** Jsoup 是一个用于处理和解析HTML的Java库,它提供了强大的功能,使得在Java程序中操作...在实际使用中,查阅Jsoup的API文档(如jsoup-API-1.10.2-javadoc)将有助于更好地理解和利用这些功能。

    使用Jsoup,抓取整个网站(包括图片、js、css)

    在这个项目中,我们使用Jsoup配合Java,实现了抓取整个网站的功能,包括其中的图片、CSS样式表和JavaScript文件。通过这样的工具,我们可以对网页进行离线浏览或者备份,甚至进行数据分析。 首先,我们要理解Jsoup...

    使用Jsoup解析html网页

    1. **数据抓取**:Jsoup可以轻松抓取网页上的结构化数据,如商品价格、评论等,用于数据分析或构建应用。 2. **网站验证**:在自动化测试中,Jsoup可以帮助验证HTML元素是否按预期显示或交互。 3. **内容过滤**:...

    jsoup中文帮助文档

    在处理完成后,你可以使用 Document 提供的各种方法来提取数据。...它简化了与网页交互的过程,尤其适合构建爬虫和网页分析应用。通过熟练运用上述方法,你可以有效地解析 HTML 并从中获取所需信息。

    使用jsoup获取网页内容并修改

    **使用Jsoup获取网页内容并修改** Jsoup是一款强大的Java库,它允许开发者方便地解析、操作和提取HTML内容。在Android开发中,Jsoup常用于网页数据抓取和页面内容的处理。以下将详细解释如何使用Jsoup来实现这个...

    jsoup-1.8.3.zip

    例如,你可以使用`Jsoup.connect(url).get()`来获取一个网页的HTML内容,或者用`Document.select("selector")`来选择特定的HTML元素。 **2. 源码(jsoup-1.8.3-sources.jar)** 这个文件包含了JSoup的源代码,对于...

    jsoup的jar包

    5. **数据分析**:在大数据领域,jsoup可以作为预处理工具,将非结构化的HTML数据转化为结构化数据,便于分析。 6. **移动应用开发**:对于Android开发者,jsoup可以用来解析和展示从网络加载的HTML内容,比如在...

    jsoup网页分析jar包

    在网页分析领域,Jsoup是一个非常实用的工具,尤其对于那些需要从网站获取结构化数据或者进行爬虫开发的项目。 Jsoup的核心功能包括: 1. **HTML解析**:Jsoup可以解析HTML文档,将其转化为一个复杂的DOM树结构,...

    Jsoup 1.5.2 和jsoup 1.6

    Jsoup在Web抓取、数据分析和网页爬虫项目中广泛应用。本文将深入探讨Jsoup 1.5.2和1.6这两个版本的主要特性、变化以及如何在项目中使用它们。 首先,让我们了解Jsoup的基本功能。Jsoup的核心功能包括: 1. **HTML...

    jsoup-1.8.1.jar

    **jsoup库详解** `jsoup-1.8.1.jar` 是一个Java库,用于处理HTML文档。jsoup提供了一种简洁而强大的API,使得开发者可以方便地解析、操作、提取以及清洁HTML数据。这个版本是1.8.1,意味着它是该库的一个稳定版本,...

Global site tag (gtag.js) - Google Analytics