Java Selenium: Unendliche Liste, Scrollen/Pagination funktioniert nicht richtig

n/a

Banned
Registriert
Feb. 2025
Beiträge
673
Moin,

ich brauche alle Substantive der Stufe A1 (und dann später auch A2, B1, B2, C1 und C2)

Iwie wird ein großes Geheimnis um diese Wörter gemacht oder sind nicht frei zugänglich

Habe mir deshalb einen Crawler geschrieben, aber das Scrollen funktioniert nicht "smart/smooth" und ich komme immer nur bis "Ethik"... danach spinnt die Seite

Dependency:

Code:
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    implementation 'org.seleniumhq.selenium:selenium-java:4.33.0'

Beispiel:

Java:
import java.util.ArrayList;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.WheelInput;

public class Main {
  private static final int shortWait = 250;
  private static final int longWait = 5000;

  public static void main(String[] args) throws InterruptedException {
    String url = "https://www.verbformen.de/suche/deklination/substantive/?l=11&i=false";
    ArrayList<String> nouns = getNounsFromUrl(url);
    for (String noun : nouns) {
      System.out.println(noun);
    }
  }

  private static ArrayList<String> getNounsFromUrl(String url) throws InterruptedException {
    ArrayList<String> nouns = new ArrayList<>();
    WebDriver wd = new ChromeDriver();
    wd.get(url);
    Thread.sleep(longWait);
    wd.switchTo().frame(wd.findElement(By.xpath("//iframe[@title='SP Consent Message']")));
    wd.findElement(By.xpath("//button[@title='Zustimmen']")).click();
    Thread.sleep(longWait);
    wd.switchTo().defaultContent();
    boolean hasNextPage = true;
    while (hasNextPage) {
      hasNextPage = false;
      Thread.sleep(shortWait);
      List<WebElement> elements = wd.findElements(By.xpath("//q[starts-with(@class, 'w')]"));
      for (int j = 0; j < elements.size(); j++) {
        WebElement element = elements.get(j);
        String text = element.getText();
        if (!text.isBlank() && !nouns.contains(text)) {
          nouns.add(text);
          if (element.isDisplayed()) {
            WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(element);
            new Actions(wd).scrollFromOrigin(scrollOrigin, 0, element.getRect().y).perform();
            Thread.sleep(shortWait);
          }
          hasNextPage = true;
        }
      }
    }
    wd.quit();
    return nouns;
  }
}

Vielleicht habt ihr noch eine Idee, ich bin erst mal überfragt
 
Die Seite geht doch nur bis Ethik? Danach gibts nen Button unten den du drücken musst für mehr.
Das hat nichts mit Infinite Scrolling zu tun?

Und wie so eigentlich nen Crawler und nicht gleich ne fixe CSV liste, wie z.b. https://github.com/gambolputty/german-nouns
 
  • Gefällt mir
Reaktionen: n/a und madmax2010
Tornhoof schrieb:
Die Seite geht doch nur bis Ethik? Danach gibts nen Button unten den du drücken musst für mehr.
ah, thx... ich dachte, es lag an Selenium

Tornhoof schrieb:
Und wie so eigentlich nen Crawler und nicht gleich ne fixe CSV liste, wie z.b.
mir ist aufgefallen, dass viele Wörterlisten unvollständig sind... so fehlt zum Beispiel das Wort "Grube" oft... aber ich werde das mal ausprobieren, danke
 
Habs hinbekommen ... (Bitte aber das Snippet nicht ausführen, nur unnötige Last für GitHub)

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.WheelInput;

public class Main {
  private static final int shortWait = 250;
  private static final int longWait = 5000;

  public static void main(String[] args) throws Exception {
    @SuppressWarnings("unused")
    String url = "https://www.verbformen.de/suche/deklination/substantive/?l=11&i=false";
    ArrayList<String> nouns = getNounsFromGitHub();

    ArrayList<ArrayList<String>> nounsLists = new ArrayList<>();
    // with äöü, and with ß
    nounsLists.add(new ArrayList<>());
    // with äöü as ae, oe, ue, and with ß as ss
    nounsLists.add(new ArrayList<>());
    // without äöü, and without ß
    nounsLists.add(new ArrayList<>());

    for (String noun : nouns) {
      if (noun.length() == 5) {
        nounsLists.get(0).add(noun);
      }
      String noun2 =
          noun.replace("ä", "ae").replace("ö", "oe").replace("ü", "ue").replace("ß", "ß");
      if (noun2.length() == 5) {
        nounsLists.get(1).add(noun2);
      }
      String noun3 = noun.replaceAll("[ÄÖÜäöüß]", "");
      if (noun.length() == 5 && noun3.length() == 5) {
        nounsLists.get(2).add(noun3);
      }
    }

    // Not allowed characters:
    for (ArrayList<String> nounsList : nounsLists) {
      for (Iterator<String> it = nounsList.iterator(); it.hasNext(); ) {
        String noun = it.next();
        if (!noun.matches("[A-Za-zÄÖÜäöüß]{5}")) {
          it.remove();
          System.out.println("Removed invalid noun: " + noun);
        }
      }
    }

    System.out.println(
        "Nouns with äöü, and with ß:                     " + nounsLists.get(0).size());
    System.out.println(
        "Nouns with äöü as ae, oe, ue, and with ß as ss: " + nounsLists.get(1).size());
    System.out.println(
        "Nouns without äöü, and without ß:               " + nounsLists.get(2).size());

    // without duplicates:
    ArrayList<LinkedHashMap<String, Integer>> nounsMaps = new ArrayList<>();

    for (ArrayList<String> nounsList : nounsLists) {
      LinkedHashMap<String, Integer> nounsMap = new LinkedHashMap<>();
      for (String noun : nounsList) {
        nounsMap.putIfAbsent(noun, 0);
        nounsMap.put(noun, nounsMap.get(noun) + 1);
      }
      nounsMaps.add(nounsMap);
    }

    System.out.println(
        "Nouns with äöü, and with ß (without duplicates):                     "
            + nounsMaps.get(0).size());
    System.out.println(
        "Nouns with äöü as ae, oe, ue, and with ß as ss (without duplicates): "
            + nounsMaps.get(1).size());
    System.out.println(
        "Nouns without äöü, and without ß (without duplicates):               "
            + nounsMaps.get(2).size());

    ArrayList<ArrayList<Map.Entry<String, Integer>>> sortedNouns = new ArrayList<>();
    for (LinkedHashMap<String, Integer> nounsMap : nounsMaps) {
      ArrayList<Map.Entry<String, Integer>> sortedNoun = new ArrayList<>(nounsMap.entrySet());
      sortedNoun.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
      sortedNouns.add(sortedNoun);
    }
    for (ArrayList<Map.Entry<String, Integer>> sortedNoun : sortedNouns) {
      for (Map.Entry<String, Integer> entry : sortedNoun) {
        // System.out.println(entry.getKey() + " (" + entry.getValue() + ")");
      }
      System.out.println("----------------------------------------");
    }
  }

  private static ArrayList<String> getNounsFromUrl(String url) throws InterruptedException {
    ArrayList<String> nouns = new ArrayList<>();
    WebDriver wd = new ChromeDriver();
    wd.get(url);
    Thread.sleep(longWait);
    wd.switchTo().frame(wd.findElement(By.xpath("//iframe[@title='SP Consent Message']")));
    wd.findElement(By.xpath("//button[@title='Zustimmen']")).click();
    Thread.sleep(longWait);
    wd.switchTo().defaultContent();
    boolean hasNextPage = true;
    while (hasNextPage) {
      hasNextPage = false;
      Thread.sleep(shortWait);
      List<WebElement> elements = wd.findElements(By.xpath("//q[starts-with(@class, 'w')]"));
      for (int j = 0; j < elements.size(); j++) {
        WebElement element = elements.get(j);
        String text = element.getText();
        if (!text.isBlank() && !nouns.contains(text)) {
          nouns.add(text);
          if (element.isDisplayed()) {
            WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(element);
            new Actions(wd).scrollFromOrigin(scrollOrigin, 0, element.getRect().y).perform();
            Thread.sleep(shortWait);
            hasNextPage = true;
          }
        }
      }
    }
    wd.quit();
    return nouns;
  }

  private static ArrayList<String> getNounsFromGitHub() throws Exception {
    ArrayList<String> nouns = new ArrayList<>();
    try (BufferedReader br =
        new BufferedReader(
            new InputStreamReader(
                new URL(
                        "https://raw.githubusercontent.com/gambolputty/german-nouns/refs/heads/main/german_nouns/nouns.csv")
                    .openStream(),
                StandardCharsets.UTF_8))) {
      String line;
      while ((line = br.readLine()) != null) {
        String[] parts = line.split(",");
        if (parts.length > 0 && !parts[0].isBlank() && !nouns.contains(parts[0])) {
          nouns.add(parts[0]);
        }
      }
    }
    return nouns;
  }
}

Aber jetzt fehlen mir noch alle Verben (Tuwörter) 😩

Gibt es vielleicht ein komplettes Wörterbuch als CSV-Liste i-wö?
 
Nur zur Info: Die Sprachniveaus sind nur abstrakt definiert. Es gibt keine allgemein gültigen Wortlisten zu jedem Sprachniveau. Die Wörter eines Sprachniveaus können von den jeweiligen Bildungseinrichtungen selbst definiert werden. Aus naheliegenden Gründen werden diese Listen, wenn sie veröffentlicht werden, ähnlich sein, können aber auch je nach Institution voneinander abweichen. Außerdem ändert sich Sprache laufend, sodass solche Listen angepasst werden. Aber A1 wohl weniger.
 
  • Gefällt mir
Reaktionen: n/a
@r0b0t Sinn der ganzen Sache ist, ein Rätsel in möglichst wenigen Zügen zu lösen:

https://www.spiegel.de/games/wordle...pielen-a-cbfa309d-a8ad-4d7d-9234-28b09b945834

Das geht jedoch nicht ohne eine Wörterliste, mit Wörtern, die im Spiel vorkommen dürfen ...

Ich habe jetzt 3756 Substantive mit äöü und ß, 3585 Substantive mit äöü und ß als ae, oe, ue und ss - und 3460 Substative ohne äöü und ß, wobei die einzelnen Substantive jeweils 5 Zeichen lang sind

Das sollte genügen, auch wenn ich nicht ausschließen kann, dass ggf. auch Verben oder Adjektive im Spiel gesucht werden könnten

---

Wordle spielen

⬜🟨⬜⬜⬜
🟩🟩🟩⬜⬜
🟩🟩🟩🟩🟩

Wie viele Versuche brauchst Du?

https://www.spiegel.de/games/wordle...pielen-a-cbfa309d-a8ad-4d7d-9234-28b09b945834
 
Zurück
Oben