You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jsoup获取网站最新5篇文章?

使用Jsoup实现Java桌面应用提取网页最新5篇文章

嘿,我来帮你把这个需求落地!你选Jsoup绝对是个靠谱的选择,它处理HTML解析超级顺手,比自己写正则或者原生DOM操作省心多了。下面我一步步给你讲清楚怎么实现:

1. 先搞定Jsoup依赖

首先得确保你的项目里引入了Jsoup库。如果用Maven的话,直接在pom.xml里加这段:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version> <!-- 用最新稳定版就行 -->
</dependency>

如果是Gradle项目,就在build.gradle里加:

implementation 'org.jsoup:jsoup:1.17.2'

2. 核心:抓取并解析网页内容

你给出的示例代码已经有个开头了,我把它补全成完整的逻辑,重点是根据目标网页的HTML结构调整选择器——这一步很关键,不同网站的文章元素结构不一样,你得先打开目标网页的开发者工具,找到文章对应的HTML标签和类名。

比如假设目标网站的文章都放在div.post-item里,标题是h3.post-title a,摘要在p.post-excerpt里,那代码可以这么写:

package com.stackoverflow.q2835505;

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.util.ArrayList;
import java.util.List;

// 定义一个文章实体类,用来存提取到的信息
class Article {
    private String title;
    private String url;
    private String excerpt;

    // 构造器、getter、setter
    public Article(String title, String url, String excerpt) {
        this.title = title;
        this.url = url;
        this.excerpt = excerpt;
    }

    public String getTitle() { return title; }
    public String getUrl() { return url; }
    public String getExcerpt() { return excerpt; }
}

public class ArticleFetcher {
    public static List<Article> fetchLatestArticles(String targetUrl, int count) throws IOException {
        List<Article> articles = new ArrayList<>();
        
        // 连接网页,设置超时时间避免卡壳,模拟浏览器请求防反爬
        Document doc = Jsoup.connect(targetUrl)
                .timeout(10000) // 10秒超时
                .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 articleElements = doc.select("div.post-item");
        
        // 取前count篇(这里是5篇)
        for (int i = 0; i < Math.min(count, articleElements.size()); i++) {
            Element item = articleElements.get(i);
            // 提取标题和绝对链接
            Element titleElement = item.selectFirst("h3.post-title a");
            String title = titleElement.text();
            String url = titleElement.attr("abs:href"); // abs:href自动补全绝对路径
            
            // 提取摘要(如果网站有提供的话)
            String excerpt = item.selectFirst("p.post-excerpt").text();
            
            articles.add(new Article(title, url, excerpt));
        }
        
        return articles;
    }

    // 测试用的main方法
    public static void main(String[] args) {
        try {
            List<Article> latest5 = fetchLatestArticles("https://目标网站地址.com", 5);
            for (Article article : latest5) {
                System.out.println("标题:" + article.getTitle());
                System.out.println("链接:" + article.getUrl());
                System.out.println("摘要:" + article.getExcerpt());
                System.out.println("---");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里要划重点:doc.select("div.post-item")这个选择器一定要替换成目标网站实际的文章容器选择器,你可以用浏览器的“检查元素”功能找到对应的标签和类名。

3. 在Java桌面应用里展示内容

接下来就是把提取到的文章展示在桌面应用里,比如用Swing的JList做个简单的列表展示,点击还能看详情:

import javax.swing.*;
import java.awt.*;
import java.util.List;

public class ArticleViewer extends JFrame {
    public ArticleViewer(List<Article> articles) {
        setTitle("最新文章");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        
        // 把文章标题转成数组给JList
        String[] titles = articles.stream()
                .map(Article::getTitle)
                .toArray(String[]::new);
        
        JList<String> articleList = new JList<>(titles);
        articleList.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        // 点击列表项显示文章详情
        articleList.addListSelectionListener(e -> {
            if (!e.getValueIsAdjusting()) {
                int index = articleList.getSelectedIndex();
                Article selected = articles.get(index);
                JOptionPane.showMessageDialog(this, 
                        "标题:" + selected.getTitle() + "\n链接:" + selected.getUrl() + "\n摘要:" + selected.getExcerpt(),
                        "文章详情", JOptionPane.INFORMATION_MESSAGE);
            }
        });
        
        add(new JScrollPane(articleList), BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        // 注意:别在UI线程里做网络请求!用SwingUtilities确保UI在事件线程启动
        SwingUtilities.invokeLater(() -> {
            try {
                List<Article> latest5 = ArticleFetcher.fetchLatestArticles("https://目标网站地址.com", 5);
                new ArticleViewer(latest5).setVisible(true);
            } catch (IOException e) {
                JOptionPane.showMessageDialog(null, "抓取文章失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        });
    }
}

这里要注意:网络请求不能放在UI线程里,否则会导致应用卡住。如果是复杂的请求,建议用SwingWorker做异步处理,让UI保持响应。

一些额外提醒

  • 有些网站会有反爬机制,如果遇到403或者请求失败,可以尝试设置更真实的User-Agent,或者添加Cookie(如果需要登录的话)。
  • 记得处理异常,比如网络断开、网页结构变化导致的元素找不到等情况,给用户友好的提示。
  • 如果需要定时刷新文章,可以用Timer或者ScheduledExecutorService来定时调用抓取方法。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:50:01