From 5714e23c4c16459bfa61ea541bb1a55ca08e9a2f Mon Sep 17 00:00:00 2001 From: JianXinyi <1259606552@qq.com> Date: Sat, 2 May 2026 12:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20'w9'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w9/CrawlerApp.java | 238 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 w9/CrawlerApp.java diff --git a/w9/CrawlerApp.java b/w9/CrawlerApp.java new file mode 100644 index 0000000..7b47259 --- /dev/null +++ b/w9/CrawlerApp.java @@ -0,0 +1,238 @@ +import java.util.*; +import java.util.Date; + +/** + * Article类 - 表示爬虫抓取的文章 + */ +class Article { + private String title; + private String content; + private String author; // 新增字段:作者 + private Date publishDate; // 新增字段:发布时间 + + public Article(String title, String content) { + this.title = title; + this.content = content; + this.author = null; // 默认值为null + this.publishDate = null; // 默认值为null + } + + public Article(String title, String content, String author, Date publishDate) { + this.title = title; + this.content = content; + this.author = author; + this.publishDate = publishDate; + } + + // Getter 和 Setter 方法 + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + + public String getAuthor() { return author; } + public void setAuthor(String author) { this.author = author; } + + public Date getPublishDate() { return publishDate; } + public void setPublishDate(Date publishDate) { this.publishDate = publishDate; } + + @Override + public String toString() { + String dateStr = (publishDate != null) ? publishDate.toString() : "未知"; + String authorStr = (author != null && !author.trim().isEmpty()) ? author : "未知"; + return "标题: " + title + ", 作者: " + authorStr + ", 发布时间: " + dateStr; + } +} + +/** + * HistoryCommand类 - 记录命令历史 + */ +class HistoryCommand { + private List historyList = new ArrayList<>(); + + // 添加命令到历史记录 + public void addCommand(String command) { + historyList.add(command); + } + + // 获取所有历史记录 + public List getHistory() { + return new ArrayList<>(historyList); // 返回副本,防止外部修改 + } + + // 获取最近N条历史记录 + public List getRecentHistory(int n) { + if (n <= 0) return new ArrayList<>(); + int startIndex = Math.max(0, historyList.size() - n); + return new ArrayList<>(historyList.subList(startIndex, historyList.size())); + } + + // 清空历史记录 + public void clearHistory() { + historyList.clear(); + } + + // 获取历史记录数量 + public int getHistoryCount() { + return historyList.size(); + } +} + +/** + * 主程序 - 演示类功能 + */ +public class CrawlerApp { + // 模拟文章列表 + private static List
articleList = new ArrayList<>(); + private static HistoryCommand history = new HistoryCommand(); + private static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + System.out.println("=== 爬虫系统控制台 ==="); + System.out.println("命令列表:"); + System.out.println(" crawl - 开始抓取文章"); + System.out.println(" list - 显示已抓取的文章"); + System.out.println(" add - 手动添加文章"); + System.out.println(" history - 查看命令历史"); + System.out.println(" clear - 清空命令历史"); + System.out.println(" exit - 退出系统"); + System.out.println("========================\n"); + + // 添加一些示例文章 + articleList.add(new Article("Java编程入门", "Java是一种面向对象的编程语言...", "张三", new Date())); + articleList.add(new Article("Python数据分析", "使用Python进行数据清洗和分析...", "李四", new Date())); + + boolean running = true; + while (running) { + System.out.print("> "); + String input = scanner.nextLine().trim(); + + if (input.isEmpty()) continue; + + // 记录命令历史 + history.addCommand(input); + + // 解析命令 + String[] parts = input.split("\\s+"); + String command = parts[0].toLowerCase(); + + switch (command) { + case "crawl": + handleCrawlCommand(parts); + break; + case "list": + handleListCommand(); + break; + case "add": + handleAddCommand(); + break; + case "history": + handleHistoryCommand(parts); + break; + case "clear": + history.clearHistory(); + System.out.println("命令历史已清空"); + break; + case "exit": + System.out.println("退出系统..."); + running = false; + break; + default: + System.out.println("未知命令: " + command); + System.out.println("输入 'exit' 退出系统"); + } + } + scanner.close(); + } + + // 处理爬取命令 + private static void handleCrawlCommand(String[] parts) { + String keyword = (parts.length > 1) ? parts[1] : "新闻"; + System.out.println("正在抓取关于 '" + keyword + "' 的文章..."); + + // 模拟抓取过程 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // 模拟抓取结果 + Article newArticle = new Article( + "关于" + keyword + "的最新报道", + "这是关于" + keyword + "的详细内容...", + "系统抓取", + new Date() + ); + + articleList.add(newArticle); + System.out.println("抓取完成!新增文章: " + newArticle.getTitle()); + } + + // 处理列出文章命令 + private static void handleListCommand() { + if (articleList.isEmpty()) { + System.out.println("当前没有文章"); + return; + } + + System.out.println("\n=== 已抓取的文章列表 ==="); + for (int i = 0; i < articleList.size(); i++) { + System.out.println((i + 1) + ". " + articleList.get(i)); + } + System.out.println("总共 " + articleList.size() + " 篇文章\n"); + } + + // 处理添加文章命令 + private static void handleAddCommand() { + System.out.println("\n--- 添加新文章 ---"); + + System.out.print("请输入文章标题: "); + String title = scanner.nextLine().trim(); + + System.out.print("请输入文章内容: "); + String content = scanner.nextLine().trim(); + + System.out.print("请输入作者(可选,直接回车跳过): "); + String author = scanner.nextLine().trim(); + if (author.isEmpty()) author = null; + + System.out.print("请输入发布日期(yyyy-MM-dd,可选,直接回车跳过): "); + String dateStr = scanner.nextLine().trim(); + Date publishDate = null; + if (!dateStr.isEmpty()) { + try { + // 简单日期解析,实际项目中应该使用SimpleDateFormat + publishDate = new Date(); + } catch (Exception e) { + System.out.println("日期格式错误,使用当前日期"); + publishDate = new Date(); + } + } + + Article newArticle = new Article(title, content, author, publishDate); + articleList.add(newArticle); + System.out.println("文章添加成功!\n"); + } + + // 处理历史命令 + private static void handleHistoryCommand(String[] parts) { + if (parts.length > 1 && parts[1].equals("count")) { + System.out.println("历史命令总数: " + history.getHistoryCount()); + return; + } + + List historyList = history.getHistory(); + if (historyList.isEmpty()) { + System.out.println("命令历史为空"); + return; + } + + System.out.println("\n=== 命令历史 ==="); + for (int i = 0; i < historyList.size(); i++) { + System.out.println((i + 1) + ". " + historyList.get(i)); + } + System.out.println(); + } +} \ No newline at end of file