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();
}
}
如果有疑问,欢迎大家在下方评论!