You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中使用Jsoup爬取网页并写入文件的技术问询

完善Jsoup多页面爬虫并写入本地文件的解决方案

我看你这段代码已经搭好了爬虫的基本框架,但在文件写入逻辑和代码完整性上还有些问题,下面帮你修正并完善,确保能顺利爬取指定页面内容并写入本地文件:

原代码存在的核心问题

  • 每次循环都新建PrintWriter,会直接覆盖之前写入的内容,而且没有正确关闭资源,容易引发IO异常
  • 代码未完成,writer.printl...语句不完整
  • 缺少单个页面爬取失败的异常处理,一个页面出错会导致整个程序直接终止

修正后的完整可运行代码

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.io.PrintWriter;

public class AudioPageCrawler {
    public static void main(String[] args) {
        // 替换成你自己的本地文件路径
        String outputFilePath = "C:\\Users\\cholp\\Desktop\\out.txt";
        
        // 使用try-with-resources自动管理文件流,无需手动关闭,避免资源泄漏
        try (PrintWriter writer = new PrintWriter(outputFilePath, "UTF-8")) {
            // 遍历21到29的目标页面
            for (int pageNum = 21; pageNum < 30; pageNum++) {
                String targetUrl = "https://www.super.kg/media/audio/" + pageNum;
                try {
                    // 模拟浏览器请求,避免被网站识别为爬虫
                    Document pageDoc = Jsoup.connect(targetUrl)
                            .timeout(6000)
                            .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
                            .get();
                    
                    // 定位目标内容容器(如果爬取内容不对,需检查页面结构调整选择器)
                    Elements contentItems = pageDoc.select("div.clear");
                    
                    for (Element item : contentItems) {
                        // 提取并处理内容,替换HTML换行符为文本换行
                        String rawContent = item.select("div.media_mtspan.video_desc_text").html();
                        String processedContent = rawContent.replaceAll("<br>", "\n");
                        
                        // 控制台输出+写入文件
                        System.out.println(processedContent);
                        writer.println(processedContent);
                        // 添加分隔线,方便区分不同页面/条目(可按需删除)
                        writer.println("=== 页面" + pageNum + "条目分割线 ===");
                    }
                    System.out.println("第" + pageNum + "页爬取完成");
                } catch (IOException e) {
                    // 单个页面爬取失败不影响整体流程
                    System.err.println("爬取第" + pageNum + "页出错:" + e.getMessage());
                }
            }
            System.out.println("所有页面爬取完成,内容已写入文件:" + outputFilePath);
        } catch (IOException e) {
            System.err.println("初始化文件写入流失败:" + e.getMessage());
        }
    }
}

关键改进点说明

  • 文件写入逻辑优化:把PrintWriter初始化放在循环外部,用try-with-resources自动管理资源,既避免文件被重复覆盖,又不用手动处理流关闭
  • 异常容错处理:给每个页面的爬取单独加了异常捕获,某个页面出错不会打断整个爬取流程
  • 反爬兼容:添加了浏览器userAgent请求头,降低被目标网站拦截的概率
  • 内容可读性优化:添加了页面条目分隔线,方便后续查看文件内容
  • 代码完整性:补全了未完成的写入语句,确保逻辑闭环

如果爬取的内容不符合预期,你可以打开目标页面的开发者工具,检查实际HTML结构,调整select()方法里的选择器,确保能准确定位到你需要的内容。

内容的提问来源于stack exchange,提问作者Jypargul CHolponova

火山引擎 最新活动