如何使用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
相关产品推荐
相关产品推荐

