Попытка заставить веб-сканер искать ключевое слово, а затем записывает в файл. Завершается рано - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать веб-сканер, хотя я столкнулся с проблемой, когда код заканчивается рано и не создает файл. Любая помощь будет оценена. Я пытаюсь заставить этот базовый код работать до добавления других необходимых мне функций (таких как реализация стеков и квенов для хранения веб-адресов, а также жесткого ограничения на доступ к веб-страницам).

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;

public class WebCrawler {
        private HashSet<String> links;
        private List<List<String>> articles;
        private static final int MAX_DEPTH = 2;

        public WebCrawler() {
            links = new HashSet<String>();
            articles = new ArrayList<>();

        }

        public void getPageLinks(String URL, int depth) {
            if (!links.contains(URL) && (depth < MAX_DEPTH)){
                System.out.println(">> Depth: " + depth + " [ " + URL + "]");
                try {
                    links.add(URL);

                    Document document = Jsoup.connect(URL).get();
                    Elements otherLinks = document.select("a[href^=\"http://www.mkyong.com/page/\"]");

                    depth++;
                    for (Element page : otherLinks) {
                        if (links.add(URL)) {
                            System.out.println(URL);
                        }

                        getPageLinks(page.attr("abs:href"), depth);
                    }
                } catch (IOException e) {
                    System.err.println(e.getMessage());
                }
            }
        }

        public void getArticles() {
            links.forEach(x -> {
                Document document;
                try {
                    document = Jsoup.connect(x).get();
                    Elements articleLinks = document.select("h2 a[href^=\"http://www.mkyong.com/\"]");
                    for (Element article : articleLinks) {
                        if (article.text().matches("^.*?(Java 8|java 8|JAVA 8).*$")) {

                            System.out.println(article.attr("abs:href"));

                            ArrayList<String> temporary = new ArrayList<>();
                            temporary.add(article.text());
                            temporary.add(article.attr("abs:href"));
                            articles.add(temporary);
                        }
                    }
                } catch (IOException e) {
                    System.err.println(e.getMessage());
                }
            });
        }

        public void writeToFile(String filename) {
            FileWriter writer;
            try {
                writer = new FileWriter(filename);
                articles.forEach(a -> {
                    try {
                        String temp = "- Title: " + a.get(0) + " (link: " + a.get(1) + ")\n";
                        System.out.println(temp);
                        writer.write(temp);
                    } catch (IOException e) {
                        System.err.println(e.getMessage());
                    }
                });
                writer.close();
            } catch (IOException e) {
                System.err.println(e.getMessage());
            }
        }

        public static void main(String[] args) {
            WebCrawler bwc = new WebCrawler();
            bwc.getPageLinks("http://www.mkyong.com", 0);
            bwc.getArticles();
            bwc.writeToFile("Java 8 Articles");
        }

}
...