`
kongshanxuelin
  • 浏览: 927349 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

抓取百度Top500歌曲以及地址源码

阅读更多

在我整理完在线听歌(http://ting.faqee.com/)的模块后,剩下来的工作就是如何通过程序抓取最新的Baidu好听的歌曲,抓取的工作主要包括3个属性:歌名、歌曲在线播放地址和歌词内容(符合LRC歌词格式),目前完成歌曲和歌曲地址抓取,由于百度的歌曲地址很多通过js获取,所以歌曲地址获取我这里使用搜狗音乐搜索方便些,所有的源码如下:

package com.common.utils;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.common.doc.FileOperUtils;


class Song{
	private String name;
	private String url;
	private String lrc;
	public Song(String name,String url){
		this.name = name;
		this.url = url;
		this.lrc = "";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getLrc() {
		return lrc;
	}
	public void setLrc(String lrc) {
		this.lrc = lrc;
	}
	
}

public class BaiduMp3 {
	
	public static String visitURL(String strUrl) {
		URL url = null;
		try {
			url = new URL(strUrl);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		URLConnection conn = null;
		try {
			conn = url.openConnection();
			conn.setDoOutput(true);
		} catch (IOException e) {
			System.out.println("e:"+e.getMessage());
		}
		OutputStreamWriter out;
		try {
			out = new OutputStreamWriter(conn.getOutputStream(), "GBK");
			out.flush();
			out.close();

		} catch (UnsupportedEncodingException e2) {

			e2.printStackTrace();
		} catch (IOException e2) {

			e2.printStackTrace();
		}

		// 接收返回信息
		BufferedReader rd = null;
		try {
			rd = new BufferedReader(
					new InputStreamReader(conn.getInputStream()));
			return rd.readLine();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return "";
	}
	
	
	/**
	* 功能说明:访问指定的URL并检查返回结果。
	* @param strUrl
	* @param successFlag 请求成功的标识,比如包含“_SUCCESS”字。
	* @return
	*/
	public static String visitURL(String strUrl, String successFlag) {
	    
	    boolean rs = false;
	    HttpURLConnection jconn = null;
	    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

	    try {
	        URL url = new URL(strUrl);

	        jconn = (HttpURLConnection) url.openConnection();
	        jconn.setDoOutput(true);
	        jconn.setDoInput(true);
	        jconn.connect();
	        
	        InputStream in = jconn.getInputStream();
	        byte[] buf = new byte[4096];

	        int bytesRead;
	        while ((bytesRead = in.read(buf)) != -1) {
	            byteArrayOutputStream.write(buf, 0, bytesRead);
	        }

	        String strRead = new String(byteArrayOutputStream.toByteArray(),"GBK");
	        
	        
	        return strRead;
	        
	        
	    } catch (MalformedURLException e) {
	        e.printStackTrace();
	    } catch (IOException e) {
	        e.printStackTrace();
	    } finally {
	        jconn.disconnect();

	        try {
	            byteArrayOutputStream.close();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	    
	    return "";
	}
	
	private static boolean isTrimEmptyOrBlank(String astr) {
		if ((null == astr) || (astr.length() == 0) || " ".equals(astr)) {
			return true;
		}
		astr = astr.trim();
		if ((null == astr) || (astr.length() == 0)) {
			return true;
		}
		return false;
	}

	private static String getFilteredContent(String htmlContent, String reg,int i) {
		String content = "";
		int k=1;
		Pattern pp = Pattern.compile(reg, Pattern.DOTALL);
		Matcher m = pp.matcher(htmlContent);
		while (m.find()) {
			content = m.group();
			if(k++==i)
				break;
		}
		return content;
	}	
	
	public static List<Song> getBaiduSongs(){
		List<Song> ss = new ArrayList();
		
		String htmlContent = visitURL("http://list.mp3.baidu.com/topso/mp3topsong.html?id=1?top2","s");
		String encode = "GBK";
		
//		System.out.println("===========================================================================");
//		System.out.println(htmlContent);
//		System.out.println("===========================================================================");
		String reg = "<table width=\"100%\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"list\">(.*?)</table>";
		htmlContent = getFilteredContent(htmlContent,reg,0);
		//FileOperUtils.writeFile("c:\\1.html", htmlContent, false);
		
		String line = "",lineurl="";
		Node anode = null;
		TextNode textnode = null;
		try {
			Parser parser = Parser.createParser(htmlContent, encode);
			NodeClassFilter textFilter = new NodeClassFilter(LinkTag.class);
			
			OrFilter lastFilter = new OrFilter();
			lastFilter.setPredicates(new NodeFilter[] { textFilter });

			NodeList nodeList = parser.parse(lastFilter);

			Node[] nodes = nodeList.toNodeArray();
			for (int i = 0; i < nodes.length; i++) {
				anode = (Node) nodes[i];

				if(anode instanceof LinkTag){
					LinkTag txt = (LinkTag)anode;
					line = txt.getLinkText();
					if(txt.getPreviousSibling()!=null){
						if(txt.getPreviousSibling().toString().indexOf("(")>=0)
							continue;
					}
					line = txt.getLinkText();
					lineurl = txt.getAttribute("href");	
					
					//System.out.println(txt.getLink());
				}

				if (isTrimEmptyOrBlank(line)||isTrimEmptyOrBlank(lineurl))
					continue;

				ss.add(new Song(line,getSongURL(line)));
			}
		} catch (ParserException pe) {
			pe.printStackTrace();
		}
		return ss;
	}
	
	private static String getSongURL(String songname){
		try {
		String ss = URLEncoder.encode(songname,"GBK");
		String htmlContent = visitURL("http://so.mp3.qihoo.com/?type=0&src=s&kw="+ss,"s");
		String encode = "GBK";
		
		String reg = "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">(.*?)</table>";
		htmlContent = getFilteredContent(htmlContent,reg,1);
		
		String line = "",lineurl="";
		Node anode = null;
		TextNode textnode = null;
		
			Parser parser = Parser.createParser(htmlContent, encode);
			NodeClassFilter textFilter = new NodeClassFilter(LinkTag.class);
			
			OrFilter lastFilter = new OrFilter();
			lastFilter.setPredicates(new NodeFilter[] { textFilter });

			NodeList nodeList = parser.parse(lastFilter);

			Node[] nodes = nodeList.toNodeArray();
			for (int i = 0; i < nodes.length; i++) {
				anode = (Node) nodes[i];

				if(anode instanceof LinkTag){
					LinkTag txt = (LinkTag)anode;
					line = txt.getLinkText();
					lineurl = txt.getAttribute("href");	
					if(!isTrimEmptyOrBlank(lineurl) && lineurl.startsWith("down.html")){
						String s = getFilteredContent(lineurl,"u=(.*?)\\&",0);
						if(!s.equals("")&&s.length()>5){
							s = Utils.replace(s, "u=", "");
							s = Utils.replace(s, "&", "");
							s = URLDecoder.decode(s,"GBK");
							return s;
						}
					}
				}
			}
		} catch (Exception pe) {
			pe.printStackTrace();
		}
		return "";		
	}
	
	public static void main(String[] args) throws Exception{
		List<Song> ss = getBaiduSongs();
		int idx = 0;
		for(Song s:ss){
			System.out.println((++idx)+":"+s.getName()+"->"+s.getUrl());
		}
//		String ss = getSongURL("国家");
//		System.out.println(ss);
		
//		String s = URLDecoder.decode("http%3A%2F%2Fwww.yuelin.net%2F%B9%FA%BC%D2.mp3","GBK");
//		System.out.println(s);
	}
}

 

4
1
分享到:
评论
5 楼 我会好好的 2009-08-03  
楼主  如果一首歌有多个链接  都要存入数据库
这个应该怎么处理呢?
4 楼 kongshanxuelin 2009-07-01  
dohkoos 写道
http://www.blogjava.net/funinhand/archive/2009/06/23/283820.html

这家伙转帖了你的文章,却将在线听歌的地址换了

鄙视一下,点进去还不是听歌的,都是小说,哎,败类中的败类!
3 楼 dohkoos 2009-06-30  
http://www.blogjava.net/funinhand/archive/2009/06/23/283820.html

这家伙转帖了你的文章,却将在线听歌的地址换了
2 楼 yanghamming 2009-05-31  
楼主顺便做个下载功能,呵呵,搜到了全部下载下来。
1 楼 kongshanxuelin 2009-05-31  
程序运行结果:
引用

1:国家->http://www.yuelin.net/国家.mp3
2:大海->http://220.179.115.78/songmp3/dahai.mp3
3:没有如果->http://gequ.yage2008.com.cn/ZRXG/RGMYN(RXQ).mp3
4:心跳->http://space.csp360.com/UMusic/5151/Chinese/%D0%C4%CC%F8.mp3
...............

相关推荐

    企业SEO-CMS建站源码 v5.12.zip

    1.该源码是我公司软件工程师根据网络一些开源码,结合公司要求开发的新网站,其版权应该属于我公司和网络上开源码提供者,源码完全完全免费。 2.在IE6,IE7,IE8,firefox上都测试过,能够正常显示,网站设置栏目...

    小刀网站自动收录源码 v2.0 UTF-8

    比如你从百度进入网站后,百度会自动显示在第一个位置,如果此时谷歌又有用户进入本站则谷歌显示第一,而百度会自动下滑到第二的位置,以此类推,首页只限量展示top30;3、网站演示地址是:...

    小刀网站自动收录源码 v2.0 UTF-8.zip

    比如你从百度进入网站后,百度会自动显示在第一个位置,如果此时谷歌又有用户进入本站则谷歌显示第一,而百度会自动下滑到第二的位置,以此类推,首页只限量展示top30; 3、网站演示地址是:...

    企业建站源码 v5.11.zip

    该源码是我公司软件工程师根据网络一些开源码,结合公司要求开发的新网站,被应用于我公司自己的网站上,网站完全免费,并且我们在 IE6,IE7,IE8,firefox上都测试过,能够正常显示,网站设置栏目可以根据自己的要求...

    百度知道小偷程序 v1.0 测试版

    【百度知道小偷程序 v1.0 测试版】是一个基于ASP编程语言开发的应用程序,其主要功能是抓取和展示百度知道平台上的问答数据。该程序可能被用于数据分析、知识整理或者网站内容填充,但请注意,未经许可的爬虫行为...

    淘宝客api程序 2.0

    本程序采用最新的topapi 2.0编写的。 1.网站首页可通过后台管理自动更新,使首页不再静止不变,从而加快百度快照的更新和提高百度页面的收录。 2.支持API商品数据缓存,全面提高网页访问速度,更重要的是减少API...

    搜索引擎名次查询.net版源码下载

    搜索引擎名次查询.net版下载 源码&lt;!-- 查询关键字排名(共享版) 程序说明: 此程序为ASP调用.net,你的空间必须支持asp.net否则你只有使用另一组文件 bin目录必须放在网站的根目录,此文件可以直接使用,如果你的...

    Python实现百度热榜爬取源代码

    本项目是关于使用Python实现百度热榜的爬取,这将帮助我们了解如何利用Python进行网页抓取,并处理实时更新的数据。在这个过程中,我们将涉及到网络请求、HTML解析以及数据存储等多个环节。 首先,我们需要引入必要...

    SEO查询软件绿色版

    SKYCC营销软件系列SEO查询工具能实现网页综合分析:分析网页的关键字密度、Top10关键字的百度搜索暖度指数、Header内容、Meta信息、模仿蜘蛛抓取网页内容、网页源码,搜索引擎收录查询。 •关键字排名:查询您的网站...

    python获取百度热榜链接的实例方法

    本文旨在分享如何使用Python编程语言抓取百度热榜中的热门话题及其链接。百度作为中国最大的搜索引擎之一,其热榜反映了当前互联网上的热点话题。对于数据分析、趋势研究等领域来说,能够自动获取这些数据非常有价值...

    Tom连环画连载.rar

    2. **头部文件Top.htm**:这是网页的头部部分,通常包含HTML的标签内的元素,如页面标题、CSS样式表链接、JavaScript引用以及元数据等。头部文件对于整个网站的布局和风格至关重要,因为它决定了页面的基本样式和...

    seo的常用工具

    域名缩短工具能够将较长的URL地址转换为较短的形式,便于分享和传播。常见的域名缩短工具有: - **谷歌缩短**:`http://goo.gl/` - **淘宝客缩短**:`http://www.taourl.com/` - **QQ推广缩短**:`http://url.cn/` -...

Global site tag (gtag.js) - Google Analytics