直接祭出代码
/**
* 爬虫网址
*/
public static String path = "https://www.ximalaya.com/yule/18103710/";
/**
* 本地保存路径
*/
public static final String WORKSPACE = "/test";
/**
* 定义四个文件类 a链接 img链接 文件链接 访问失败的链接
*/
public static File aLink, imgLink, textLink, errorLink;
public static void main(String[] args) {
// 创建文件夹
File directory = new File(WORKSPACE);
if (!directory.exists() && !directory.isDirectory()) {
directory.mkdir();
}
aLink = new File(WORKSPACE + "/ALinks.txt");
imgLink = new File(WORKSPACE + "/ImgLinks.txt");
textLink = new File(WORKSPACE + "/TextLinks.txt");
errorLink = new File(WORKSPACE + "/ErrorLinks.txt");
File[] files = new File[] { aLink, imgLink, textLink, errorLink };
try {
for (File file : files) {
if (file.exists())
file.delete();
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
Document doc = null;
try {
doc = Jsoup.parse(HttpUtil.get(path));
} catch (Exception e) {
writeTxtFile(errorLink, path + "\r\n"); // 写入错误链接
}
Elements aLinks = doc.select("a[href]");// 所有a标签
Elements imgLinks = doc.select("img[src]");// 所有img标签
for (Element element : aLinks) {
String url = element.attr("href");
// 判断链接是否包含这两个头
if (!url.contains("http://") && !url.contains("https://")) {
url = path.substring(0,path.length()-1) + url;//去掉一个斜杠 拼接正确的URL
}
// 如果文件中没有这个链接,而且链接中不包含javascript:则继续(因为有的是用js语法跳转)
if (!readTxtFile(aLink).contains(url) && !url.contains("javascript")) {
// 路径必须包含网页主链接--->防止爬入别的网站
if (url.contains(path)) {
// 判断该a标签的内容是文件还是子链接
if (url.contains(".doc") || url.contains(".exl") || url.contains(".exe") || url.contains(".apk")
|| url.contains(".mp3") || url.contains(".mp4")) {
// 写入文件中,文件名+文件链接
writeTxtFile(textLink, element.text() + "\r\n\t" + url + "\r\n");
} else {
// 将链接写入文件
writeTxtFile(aLink, url + "\r\n");
}
}
}
}
for (Element element : imgLinks) {
String imgurl = element.attr("src");
if (!imgurl.contains("http://") && !imgurl.contains("https://")) {// 没有这两个头
imgurl = path + imgurl;
}
// 去重
if (!readTxtFile(imgLink).contains(imgurl)) {
// 将图片链接写进文件中
writeTxtFile(imgLink, imgurl + "\r\n");
}
}
System.out.println("a链接有"+getFileCount(aLink)+"条");
System.out.println("img链接有"+getFileCount(imgLink)+"条");
System.out.println("文件链接有"+getFileCount(textLink)+"条");
System.out.println("失败链接有"+getFileCount(errorLink)+"条");
}
/**
* 写入内容
*
* @param file
* 文件类
* @param urlStr
* 要写入的文本
*/
public static void writeTxtFile(File file, String content) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取文件内容
*
* @param file
* 文件类
* @return 文件内容
*/
public static String readTxtFile(File file) {
String result = ""; // 读取結果
String thisLine = ""; // 每次读取的行
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
try {
while ((thisLine = reader.readLine()) != null) {
result += thisLine + "\n";
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return result;
}
/**
* 获取文件总行数(有多少链接)
*
* @param file 文件类
* @return 总行数
*/
public static int getFileCount(File file) {
int count = 0;
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
while (reader.readLine() != null) { //遍历文件行
count++;
}
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
如果直接复制的,注意改保存路径