.contains () проблема / похоже, это не работает - PullRequest
0 голосов
/ 25 апреля 2020

Я работаю над веб-скребком и не могу решить проблему, с которой сталкиваюсь второй день подряд.

Проблема этого метода заключается в том, что бот должен посещать веб-сайт, собрать все URL и добавить те из них, которые он еще не посещал, в List "toVisit"

Problemati c code:

Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
for (Element e : temp) {
    String x = e.getAt("href");
    if(!visited.contains(x)) { 
            toVisit.add(x);
    }
}

Однако в операторе if не фильтрует (или фильтрует его так, как я не узнал) URL-адреса, и я понятия не имею, почему.

Я пытался удалить "!" в заявлении и создайте другую часть и вставьте туда toVisit.add (x), но это не помогло.

Когда я печатаю каждый URL, бот посещает одни и те же два или даже пять раз.

РЕДАКТИРОВАТЬ (посещено определено)

static List<String> visited = new ArrayList<String>();

РЕДАКТИРОВАТЬ2 (весь код)

import java.util.ArrayList;
import java.util.List;
import com.jaunt.*;

public class b03 {

    static String currentUrl = "https://stackoverflow.com";
    static String stayAt = currentUrl;
    static String searchingTerm = "";
    static int toSearch = 50;

    static List<String> toVisit = new ArrayList<String>();
    static List<String> visited = new ArrayList<String>();

    static UserAgent userAgent = new UserAgent();   

    public static void main(String[] args) {
        System.out.println("*started searching...*");

        while(visited.size() < toSearch)
            visitUrl(currentUrl);

        System.out.println("\n\n*done*\n\n");
    }

    public static void visitUrl(String url) {
            visited.add(url);
            evaluateUrls();
            searchTerm();
            toVisit.remove(0);
            currentUrl = toVisit.get(0);
    }

    public static void searchTerm() {
        //if(userAgent.doc.getTextContent().contains(searchingTerm)) 
            System.out.println(visited.size() +") "+ currentUrl);
    }

    public static void evaluateUrls() {
        try {
            Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
            for (Element e : temp) {
                String x = e.getAt("href");
                if(!visited.contains(x) && x.contains(stayAt)) { 
                        toVisit.add(x);
                }
            }
        }catch (Exception e) {
            System.out.println(e);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Ваш бот посещает некоторые URL несколько раз, потому что вы добавляете их несколько раз в список toVisit.

Чтобы проиллюстрировать это: предположим, что первые несколько ссылок, которые ваш бот обнаружил на сайте stackoverflow, являются ссылки на «home» (stackoverflow.com), теги (stackoverflow.com/tags), пользователей (stackoverflow.com/users) и задания (stackoverflow.jobs), и ваш бот добавляет три из них в список toVisit.

Затем он посещает страницу тегов (stackoverflow.com/tags). Эта страница снова содержит ссылки на те же четыре URL-адреса, что и раньше. Поскольку вы еще не посещали пользователей и подстраницу вакансий, они добавят их во второй раз в список toVisit.

Чтобы исправить это, вы должны добавить только URL-адреса в список toVisit, которые отсутствует в списке visited и отсутствует в списке toVisit:

        if (!visited.contains(x) && !toVisit.contains(x) && x.contains(stayAt)) { 
            toVisit.add(x);
        }
0 голосов
/ 25 апреля 2020

Я не могу попробовать этот код из-за jaunt lib

Разделите ваш код, сделайте его читабельным. Не используйте "stati c" как можно больше.

Надеюсь, это поможет

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.jaunt.*;

public class B03 {

    static String currentUrl = "https://stackoverflow.com";
    static String stayAt = currentUrl;
    static String searchingTerm = "";
    static int toSearch = 50;

    static List<String> toVisit = new ArrayList<String>();
    static List<String> visited = new ArrayList<String>();

    static UserAgent userAgent = new UserAgent();

    public static void main(String[] args) {
        System.out.println("*started searching...*");

        toVisit.add(currentUrl);

        while(toVisit.size() > 0 && visited.size() < toSearch){
            visitUrl(toVisit.get(0));
        }

        System.out.println("\n\n*done*\n\n");
    }

    public static void visitUrl(String url) {
        List<String> ee = evaluateUrls(url);
        searchTerm(url);

        visited.add(url);
        toVisit.remove(url);
        toVisit.addAll(ee.stream().filter( e -> !visited.contains(e)).collect(Collectors.toList()));

        toVisit.remove(0);
    }

    public static void searchTerm(String currentUrl) {
        //if(userAgent.doc.getTextContent().contains(searchingTerm))
        System.out.println(visited.size() +") "+ currentUrl);
    }

    public List<String> evaluateUrls(String currentUrl) {
        List<String> subUrls = new ArrayList<>();
        try {
            Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
            for (Element e : temp) {
                String x = e.getAt("href");
                subUrls.add(x);
            }
        }catch (Exception e) {
            System.out.println(e);
        }
        return subUrls;
    }
}
...