From 8f51818043b73353bf808b8fd49429574ab5998a Mon Sep 17 00:00:00 2001 From: wuqiuyu <2135752554@qq.com> Date: Sun, 31 May 2026 14:21:59 +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'project'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/ConsoleView.java | 42 ++++++++++++++++++++++++++++ project/CrawlStrategy.java | 10 +++++++ project/HnuNewsStrategy.java | 54 ++++++++++++++++++++++++++++++++++++ project/NewsStrategy.java | 25 +++++++++++++++++ project/StrategyFactory.java | 28 +++++++++++++++++++ 5 files changed, 159 insertions(+) create mode 100644 project/ConsoleView.java create mode 100644 project/CrawlStrategy.java create mode 100644 project/HnuNewsStrategy.java create mode 100644 project/NewsStrategy.java create mode 100644 project/StrategyFactory.java diff --git a/project/ConsoleView.java b/project/ConsoleView.java new file mode 100644 index 0000000..f2691da --- /dev/null +++ b/project/ConsoleView.java @@ -0,0 +1,42 @@ +package com.example.datacollect.view; + +import com.example.datacollect.model.Article; +import java.util.List; +import java.util.Scanner; + +public class ConsoleView { + private static final String ANSI_RESET = "\u001B[0m"; + private static final String ANSI_GREEN = "\u001B[32m"; + private static final String ANSI_RED = "\u001B[31m"; + private static final String ANSI_BLUE = "\u001B[34m"; + + private final Scanner scanner = new Scanner(System.in); + + public String readLine() { + System.out.print("> "); + return scanner.nextLine(); + } + + public void printSuccess(String msg) { + System.out.println(ANSI_GREEN + msg + ANSI_RESET); + } + + public void printError(String msg) { + System.out.println(ANSI_RED + msg + ANSI_RESET); + } + + public void printInfo(String msg) { + System.out.println(ANSI_BLUE + msg + ANSI_RESET); + } + + public void display(List
articles) { + if (articles.isEmpty()) { + printInfo("暂无文章,请先执行 crawl。"); + return; + } + for (int i = 0; i < articles.size(); i++) { + Article a = articles.get(i); + System.out.println((i + 1) + ". " + a.getTitle() + " | " + a.getUrl()); + } + } +} diff --git a/project/CrawlStrategy.java b/project/CrawlStrategy.java new file mode 100644 index 0000000..35c4783 --- /dev/null +++ b/project/CrawlStrategy.java @@ -0,0 +1,10 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; +import org.jsoup.nodes.Document; +import java.util.List; + +public interface CrawlStrategy { + List
parse(String url, Document doc); + boolean supports(String url); +} diff --git a/project/HnuNewsStrategy.java b/project/HnuNewsStrategy.java new file mode 100644 index 0000000..ec20d81 --- /dev/null +++ b/project/HnuNewsStrategy.java @@ -0,0 +1,54 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import java.util.ArrayList; +import java.util.List; + +public class HnuNewsStrategy implements CrawlStrategy { + @Override + public boolean supports(String url) { + return url.contains("news.hnu.edu.cn"); + } + + @Override + public List
parse(String url, Document doc) { + List
articles = new ArrayList<>(); + + Elements links = doc.select("a[href*='/info/']"); + + for (Element link : links) { + String articleUrl = link.attr("abs:href"); + + if (!articleUrl.startsWith("http")) { + articleUrl = "https://news.hnu.edu.cn" + link.attr("href").replace("..", ""); + } + + String title = link.text().trim(); + + if (title.isEmpty()) { + Element titleEl = link.selectFirst("h2, h3, h4, .title"); + if (titleEl != null) { + title = titleEl.text().trim(); + } + } + + String content = ""; + Element parent = link.parent(); + if (parent != null) { + Element contentEl = parent.selectFirst("p, .summary, .description"); + if (contentEl != null) { + content = contentEl.text().trim(); + } + } + + if (!title.isEmpty() && articleUrl.contains("/info/")) { + articles.add(new Article(title, articleUrl, content)); + } + } + + return articles; + } +} diff --git a/project/NewsStrategy.java b/project/NewsStrategy.java new file mode 100644 index 0000000..b18cd76 --- /dev/null +++ b/project/NewsStrategy.java @@ -0,0 +1,25 @@ +package com.example.datacollect.strategy; + +import com.example.datacollect.model.Article; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import java.util.ArrayList; +import java.util.List; + +public class NewsStrategy implements CrawlStrategy { + @Override + public boolean supports(String url) { + return url.contains("news.example.com"); + } + + @Override + public List
parse(String url, Document doc) { + List
articles = new ArrayList<>(); + Elements items = doc.select(".article-headline"); + for (Element e : items) { + articles.add(new Article(e.text(), url, "")); + } + return articles; + } +} diff --git a/project/StrategyFactory.java b/project/StrategyFactory.java new file mode 100644 index 0000000..0ee0fbd --- /dev/null +++ b/project/StrategyFactory.java @@ -0,0 +1,28 @@ +package com.example.datacollect.strategy; + +import java.util.ArrayList; +import java.util.List; + +public class StrategyFactory { + private final List strategies = new ArrayList<>(); + + public StrategyFactory() { + strategies.add(new HnuNewsStrategy()); + strategies.add(new BlogStrategy()); + strategies.add(new NewsStrategy()); + strategies.add(new BaiduBaikeStrategy()); + } + + public CrawlStrategy getStrategy(String url) { + for (CrawlStrategy s : strategies) { + if (s.supports(url)) { + return s; + } + } + return null; + } + + public void register(CrawlStrategy strategy) { + strategies.add(strategy); + } +}