欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java爬虫小程序

程序员文章站 2022-05-04 11:28:06
...

最近用Java做了一个音乐播放器,实现了在线爬取歌词的功能,在这里总结一下吧。我爬取歌词的网站是http://www.lrcgc.com/。一共需要解析两个网站,所以我分别使用了两个方法。代码中都有十分详细的注释,下面是代码。

package worm;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

public class Spider {
	private final static String ENCODE = "utf-8";

	public String getMailsByWeb(String str) throws IOException {//str是你要搜索的歌曲名 可能为中文 所以要转码
		// 1,读取源文件。
		String result = java.net.URLEncoder.encode(str, ENCODE);//网址中文转码
		String u = "http://www.lrcgc.com/so/?q=" + result + "&csrf_token=52e914139a7d26d4";// 合并网址  网址前后部分是固定的 只有中间输入的搜索关键词不同
		URL url = new URL(u);//创建连接
		BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));//读取数据
		// 2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
		// String mail_regex = "lyric-[0-9]{4}-[0-9]{6}";
		String mail_regex = "lyric-(.*).html";//正则匹配模式串
		// <a href="/lyric-30290-307010.html"
		Pattern p = Pattern.compile(mail_regex);//正则表达式的编译表示形式  提高效率
		String line = null;
		while ((line = bufr.readLine()) != null) {//一次读取一行匹配  注意匹配的是html标签 需查看网页源码
			Matcher m = p.matcher(line);//匹配器匹配
			while (m.find()) {
				// 3,将符合规则的数据存储到集合中。
				return m.group().replaceAll(".html", "");//获得特定的歌曲页面网址
			}
		}
		return null;
	}
	
	public void load(String str,String name) {//下载歌词线程
		new Thread() {
			public void run(){
				String url = "http://www.lrcgc.com/"+str+"/-.lrc";//歌词下载网址
				//System.out.println(url);
				try {
					InputStream in = new URL(url).openConnection().getInputStream();//连接
					FilterOutputStream f = new FilterOutputStream(//存入本地
							new FileOutputStream(new File("E:/javaproject/myplayer/lyrics/"+name+".lrc")));// 创建文件输出流
					byte[] bb = new byte[102400]; // 接收缓存
					int len;
					while ((len = in.read(bb)) > 0) { // 接收
						f.write(bb, 0, len); // 写入文件
					}
					JOptionPane.showMessageDialog(null,"歌词下载完成!");
					f.close();//关闭文件
					in.close();//关闭输入流
				} catch (IOException e) {
					JOptionPane.showMessageDialog(null, "网络连接失败!");
				}
			}
		}.start();
	}
}

如果有疑问,欢迎大家在下方评论!

相关标签: 爬虫 java