package command; import model.Paper; import strategy.CrawlerStrategy; import strategy.StrategyFactory; import repository.PaperRepository; import view.ConsoleView; import java.util.List; public class CrawlCommand implements Command { private ConsoleView view; private StrategyFactory strategyFactory; public CrawlCommand(ConsoleView view, StrategyFactory strategyFactory) { this.view = view; this.strategyFactory = strategyFactory; } @Override public void execute(String[] args, PaperRepository repository) { if (args.length < 2) { view.showError("请提供要爬取的论文网站URL,格式: crawl "); return; } String url = args[1]; if (!isValidUrl(url)) { view.showError("无效的URL格式,请提供有效的论文网站URL"); return; } try { view.showInfo("开始爬取论文..."); view.showInfo("目标URL: " + url); CrawlerStrategy crawler = strategyFactory.createCrawlerByUrl(url); if (crawler == null) { view.showError("不支持的网站,请提供支持的论文网站URL"); return; } String platformName = crawler.getPlatformName(); repository.init(platformName); List papers = crawler.crawl(url, 10); if (papers.isEmpty()) { view.showInfo("未获取到论文"); } else { List uniquePapers = repository.removeDuplicates(papers); repository.savePapers(uniquePapers); view.showSuccess("成功爬取 " + uniquePapers.size() + " 篇论文"); } } catch (Exception e) { view.showError("爬取失败: " + e.getMessage()); } } private boolean isValidUrl(String url) { return url != null && (url.startsWith("http://") || url.startsWith("https://")); } @Override public String getDescription() { return "爬取指定URL的论文,格式: crawl <论文网站URL>"; } @Override public String getName() { return "crawl"; } }