爬虫(一) 得到网页所有链接,图片,文件

袁增
2023-12-01

直接祭出代码

    /**
	 * 爬虫网址
	 */
	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;
    }


如果直接复制的,注意改保存路径

 类似资料: