From 5965a6ff76016bf120002b6a461e831df201ddca Mon Sep 17 00:00:00 2001 From: wangyandi <3512851994@qq.com> Date: Sun, 31 May 2026 13:50:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0Command=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/example/command/.gitignore | 39 +++++++++++++ .../java/org/example/command/Article.java | 26 +++++++++ .../java/org/example/command/Command.java | 7 +++ .../org/example/command/CrawlerException.java | 12 ++++ .../org/example/command/CrawlerService.java | 53 ++++++++++++++++++ .../main/java/org/example/command/Main.java | 23 ++++++++ .../org/example/command/SearchCommand.java | 55 +++++++++++++++++++ .../src/main/java/org/example/command/pom.xml | 27 +++++++++ 8 files changed, 242 insertions(+) create mode 100644 project/src/main/java/org/example/command/.gitignore create mode 100644 project/src/main/java/org/example/command/Article.java create mode 100644 project/src/main/java/org/example/command/Command.java create mode 100644 project/src/main/java/org/example/command/CrawlerException.java create mode 100644 project/src/main/java/org/example/command/CrawlerService.java create mode 100644 project/src/main/java/org/example/command/Main.java create mode 100644 project/src/main/java/org/example/command/SearchCommand.java create mode 100644 project/src/main/java/org/example/command/pom.xml diff --git a/project/src/main/java/org/example/command/.gitignore b/project/src/main/java/org/example/command/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/project/src/main/java/org/example/command/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/project/src/main/java/org/example/command/Article.java b/project/src/main/java/org/example/command/Article.java new file mode 100644 index 0000000..e0a7494 --- /dev/null +++ b/project/src/main/java/org/example/command/Article.java @@ -0,0 +1,26 @@ +package org.example.model; + +public class Article { + private String title; + private String url; + + // 构造方法 + public Article(String title, String url) { + this.title = title; + this.url = url; + } + + // Getter 方法 (非常重要,SearchCommand 里要用到) + public String getTitle() { + return title; + } + + public String getUrl() { + return url; + } + + @Override + public String toString() { + return "标题: " + title + "\n链接: " + url; + } +} \ No newline at end of file diff --git a/project/src/main/java/org/example/command/Command.java b/project/src/main/java/org/example/command/Command.java new file mode 100644 index 0000000..347490a --- /dev/null +++ b/project/src/main/java/org/example/command/Command.java @@ -0,0 +1,7 @@ +package org.example.command; + +public interface Command { + void execute(); + + void execute(String[] args); +} diff --git a/project/src/main/java/org/example/command/CrawlerException.java b/project/src/main/java/org/example/command/CrawlerException.java new file mode 100644 index 0000000..7cf0372 --- /dev/null +++ b/project/src/main/java/org/example/command/CrawlerException.java @@ -0,0 +1,12 @@ +package org.example.exception; + +// 自定义运行时异常 +public class CrawlerException extends RuntimeException { + public CrawlerException(String message) { + super(message); + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/project/src/main/java/org/example/command/CrawlerService.java b/project/src/main/java/org/example/command/CrawlerService.java new file mode 100644 index 0000000..2b62347 --- /dev/null +++ b/project/src/main/java/org/example/command/CrawlerService.java @@ -0,0 +1,53 @@ +package org.example.service; + +import org.example.exception.CrawlerException; +import org.example.model.Article; +import org.example.strategy.BaiduStrategy; +import org.example.strategy.BingStrategy; +import org.example.strategy.CrawlerStrategy; +import org.example.strategy.CsdnStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class CrawlerService { + + /** + * 聚合搜索:同时调用所有策略进行搜索 + */ + public List
search(String keyword) throws CrawlerException { + if (keyword == null || keyword.trim().isEmpty()) { + throw new CrawlerException("关键词不能为空!"); + } + + System.out.println("Service层: 正在调度所有爬虫策略..."); + + List strategies = new ArrayList<>(); + strategies.add(new BaiduStrategy()); + strategies.add(new BingStrategy()); + strategies.add(new CsdnStrategy()); + + List
allResults = new ArrayList<>(); + + for (CrawlerStrategy strategy : strategies) { + try { + System.out.println("正在爬取 [" + strategy.getName() + "] ..."); + + // 调用具体策略的 crawl 方法 + List
results = strategy.crawl(keyword); + + // 将当前策略的结果添加到总列表中 + allResults.addAll(results); + + System.out.println("[" + strategy.getName() + "] 爬取完成,获取到 " + results.size() + " 条数据。"); + + } catch (Exception e) { + // 捕获单个策略的异常,防止因为一个网站挂了导致整个程序崩溃 + System.err.println("警告: [" + strategy.getName() + "] 爬取失败: " + e.getMessage()); + } + } + + System.out.println("搜索结束,共获取到 " + allResults.size() + " 条结果。"); + return allResults; + } +} \ No newline at end of file diff --git a/project/src/main/java/org/example/command/Main.java b/project/src/main/java/org/example/command/Main.java new file mode 100644 index 0000000..96c923d --- /dev/null +++ b/project/src/main/java/org/example/command/Main.java @@ -0,0 +1,23 @@ +package org.example; + +import org.example.command.Command; +import org.example.command.SearchCommand; +import org.example.service.CrawlerService; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + System.out.println("简易搜索引擎启动"); + + // 1. 初始化 Service + CrawlerService service = new CrawlerService(); + + // 2. 初始化 Command (注入 Service) + Command searchCmd = new SearchCommand(service); + + // 3. 执行命令 + searchCmd.execute(); + + System.out.println("程序结束"); + } +} \ No newline at end of file diff --git a/project/src/main/java/org/example/command/SearchCommand.java b/project/src/main/java/org/example/command/SearchCommand.java new file mode 100644 index 0000000..b009a4b --- /dev/null +++ b/project/src/main/java/org/example/command/SearchCommand.java @@ -0,0 +1,55 @@ +package org.example.command; + +import org.example.exception.CrawlerException; +import org.example.model.Article; +import org.example.service.CrawlerService; + +import java.util.List; +import java.util.Scanner; + +/** + * 处理搜索指令的具体命令类 + */ +public class SearchCommand implements Command { + + private final CrawlerService crawlerService; + + // 构造方法注入 Service + public SearchCommand(CrawlerService crawlerService) { + this.crawlerService = crawlerService; + } + + @Override + public void execute() { + Scanner scanner = new Scanner(System.in); + try { + System.out.println("请输入要搜索的关键词:"); + String keyword = scanner.nextLine(); + + System.out.println("正在爬取数据,请稍候..."); + + // 调用 Service 层的搜索方法 + List
results = crawlerService.search(keyword); + + if (results.isEmpty()) { + System.out.println("未找到相关结果。"); + } else { + System.out.println("共找到 " + results.size() + " 条结果:"); + for (Article article : results) { + System.out.println(article); + } + } + + } catch (CrawlerException e) { + // 捕获我们在 Service 层抛出的自定义异常 + System.err.println("搜索失败:" + e.getMessage()); + } catch (Exception e) { + System.err.println("发生未知错误:" + e.getMessage()); + } + } + + @Override + public void execute(String[] args) { + + } +} diff --git a/project/src/main/java/org/example/command/pom.xml b/project/src/main/java/org/example/command/pom.xml new file mode 100644 index 0000000..20b08c7 --- /dev/null +++ b/project/src/main/java/org/example/command/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.example + Homework + 1.0-SNAPSHOT + + + 25 + 25 + UTF-8 + + + + + org.jsoup + jsoup + 1.15.3 + + + + + + \ No newline at end of file