You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
public class AnalyzeCommand implements Command {
|
|
|
|
private static final Pattern URL_PATTERN =
|
|
Pattern.compile("^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)*$");
|
|
|
|
private final ConsoleView view;
|
|
private final StrategyFactory strategyFactory;
|
|
|
|
public AnalyzeCommand(ConsoleView view, StrategyFactory strategyFactory) {
|
|
this.view = view;
|
|
this.strategyFactory = strategyFactory;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "analyze";
|
|
}
|
|
|
|
@Override
|
|
public void execute(String[] args, List<Article> unused) {
|
|
|
|
if (args.length < 2) {
|
|
view.printError("用法:analyze <url>");
|
|
return;
|
|
}
|
|
|
|
String url = args[1];
|
|
|
|
|
|
if (!isValidUrl(url)) {
|
|
view.printError("无效的URL格式:" + url);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
|
|
List<Article> parsedArticles = strategyFactory.getStrategy(url).crawl(url);
|
|
|
|
|
|
printAnalysisResult(url, parsedArticles);
|
|
|
|
} catch (Exception e) {
|
|
view.printError("解析失败:" + e.getMessage());
|
|
}
|
|
}
|
|
|
|
private void printAnalysisResult(String url, List<Article> articles) {
|
|
view.printInfo("解析统计结果 ");
|
|
view.printInfo("目标 URL:" + url);
|
|
view.printInfo("解析到文章数量:" + articles.size());
|
|
|
|
if (!articles.isEmpty()) {
|
|
Article first = articles.get(0);
|
|
view.printInfo("首篇文章标题:" + first.getTitle());
|
|
view.printInfo("首篇文章作者:" + first.getAuthor());
|
|
view.printInfo("首篇发布日期:" + first.getPublishDate());
|
|
}
|
|
}
|
|
|
|
private boolean isValidUrl(String url) {
|
|
return url != null && URL_PATTERN.matcher(url).matches();
|
|
}
|
|
}
|
|
|