Skript: Mit ChatGPT gehts nicht....

xgame

Experte
Thread Starter
Mitglied seit
19.03.2017
Beiträge
90
Hat jemand eine Idee? Ich kriege immer nur 52-112 Zeilen ausgegeben. Lazy Scroll wird nicht korrekt benutzt.

Danke!

Code:
async function scrapeAllMembers() {
    let scrollContainer = document.querySelector('[role="table"], .list-container-class'); // Versuche, die Mitgliederliste zu finden
    let lastHeight = 0;
    let scrollAttempts = 0;
    const maxScrollAttempts = 100; // Max. Versuche, um sicherzustellen, dass alles geladen ist

    console.log("?? Starte Scroll-Vorgang...");

    while (scrollAttempts < maxScrollAttempts) {
        let currentHeight = scrollContainer ? scrollContainer.scrollHeight : document.body.scrollHeight;

        window.scrollTo(0, currentHeight);
        await new Promise(resolve => setTimeout(resolve, 2000)); // Wartezeit für das Nachladen

        if (currentHeight === lastHeight) {
            scrollAttempts++;
        } else {
            scrollAttempts = 0; // Zurücksetzen, falls sich die Höhe verändert
        }

        lastHeight = currentHeight;
        console.log(`?? Scrolle weiter... (Versuch ${scrollAttempts}/${maxScrollAttempts})`);

        if (scrollAttempts >= maxScrollAttempts) {
            console.log("? Alle Einträge geladen oder kein weiteres Wachstum festgestellt.");
            break;
        }
    }

    console.log("?? Sammle Mitglieder...");

    // Mitgliederliste gezielt durchsuchen
    let members = [...document.querySelectorAll('[role="row"] *, .member-name-class')]
        .map(el => el.innerText.trim())
        .filter(text => text.length > 0 && !text.toLowerCase().includes("user")); // "user" entfernen

    // Entferne doppelte Einträge
    let uniqueMembers = [...new Set(members)];

    // Nummerierung hinzufügen
    let numberedList = uniqueMembers.map((name, index) => `${index + 1}. ${name}`);

    console.log(`? Gesamtanzahl Mitglieder: ${numberedList.length}`);
    console.log(numberedList.join("\n"));

    return numberedList;
}

// Funktion starten
scrapeAllMembers();
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
1743335959879.png


versuch mal den code :

Code:
async function scrapeAllMembers() {
    // --- ANPASSBARE EINSTELLUNGEN ---
    // !! WICHTIG: Passe diese Selektoren genau an die Struktur der Webseite an!
    //    Benutze die Entwicklerwerkzeuge deines Browsers (Rechtsklick -> Untersuchen/Inspect),
    //    um die richtigen Elemente zu finden.

    // 1. Selektor für den Container, der gescrollt werden muss:
    //    Suche das Element, das den Scrollbalken für die Mitgliederliste hat.
    //    Wenn die ganze Seite scrollt, lasse es leer ('').
    const SCROLL_CONTAINER_SELECTOR = '[role="table"], .list-container-class'; // Beispiel, ggf. anpassen!

    // 2. Selektor für die Elemente, die die Namen der Mitglieder enthalten:
    //    Sei so spezifisch wie möglich, z.B. '.member-profile-link .username'
    const MEMBER_NAME_SELECTOR = '[role="row"] .specific-element-containing-name, .member-name-class'; // Beispiel, anpassen!

    // 3. Wartezeit zwischen Scroll-Versuchen in Millisekunden:
    //    Erhöhe diesen Wert bei langsamen Ladezeiten.
    const WAIT_TIME_MS = 3000; // Etwas mehr Zeit geben

    // 4. Maximale Anzahl von Scroll-Versuchen, bei denen sich die Höhe nicht ändert:
    //    Stoppt den Vorgang, wenn nach X Versuchen keine neuen Inhalte mehr geladen wurden.
    const MAX_STABLE_ATTEMPTS = 5; // Früher stoppen, wenn sich nichts mehr tut

    // --- SKRIPT-LOGIK ---

    console.log("?? Suche Scroll-Container...");
    let scrollContainer = SCROLL_CONTAINER_SELECTOR ? document.querySelector(SCROLL_CONTAINER_SELECTOR) : null;

    if (SCROLL_CONTAINER_SELECTOR && !scrollContainer) {
        console.warn(`? Warnung: Scroll-Container mit Selektor "${SCROLL_CONTAINER_SELECTOR}" nicht gefunden. Versuche, das Fenster zu scrollen.`);
    } else if (scrollContainer) {
        console.log("?? Scroll-Container gefunden:", scrollContainer);
    } else {
        console.log("?? Kein spezifischer Scroll-Container angegeben, scrolle das Fenster.");
    }

    let lastHeight = 0;
    let stableScrollAttempts = 0; // Zählt Versuche, bei denen sich die Höhe nicht änderte

    console.log("?? Starte Scroll-Vorgang...");

    while (stableScrollAttempts < MAX_STABLE_ATTEMPTS) {
        // Aktuelle Scroll-Höhe ermitteln (abhängig davon, ob ein Container oder das Fenster gescrollt wird)
        let currentHeight = scrollContainer ? scrollContainer.scrollHeight : document.body.scrollHeight;

        // Scrollen: Entweder den Container oder das Fenster
        if (scrollContainer) {
            console.log(`?? Scrolle Container auf Höhe: ${currentHeight}`);
            scrollContainer.scrollTop = currentHeight; // Scrolle den Container selbst
        } else {
            console.log(`?? Scrolle Fenster auf Höhe: ${currentHeight}`);
            window.scrollTo(0, currentHeight); // Scrolle das ganze Fenster
        }

        // Warten, bis neue Inhalte geladen sein könnten
        await new Promise(resolve => setTimeout(resolve, WAIT_TIME_MS));

        // Neue Höhe nach dem Warten ermitteln
        let newHeight = scrollContainer ? scrollContainer.scrollHeight : document.body.scrollHeight;

        console.log(`?? Höhe vorher: ${currentHeight}, Höhe nachher: ${newHeight}`);

        if (newHeight === lastHeight) {
            stableScrollAttempts++;
            console.log(`?? Höhe hat sich nicht geändert. Stabilitätsversuch ${stableScrollAttempts}/${MAX_STABLE_ATTEMPTS}.`);
        } else {
            stableScrollAttempts = 0; // Zurücksetzen, da sich etwas geändert hat
            console.log("?? Höhe hat sich geändert, scrolle weiter.");
        }

        lastHeight = newHeight; // Wichtig: Höhe *nach* dem Warten speichern

        // Sicherheitsausstieg (optional, aber empfohlen für Endlosschleifen)
        // if (some_condition_to_detect_failure) {
        //    console.error("?? Fehlerbedingung erkannt, breche ab.");
        //    break;
        // }
    }

    if (stableScrollAttempts >= MAX_STABLE_ATTEMPTS) {
        console.log(`? Scrollen beendet. Höhe blieb für ${MAX_STABLE_ATTEMPTS} Versuche stabil.`);
    }

    console.log("?? Sammle Mitglieder...");

    // Mitgliederliste gezielt durchsuchen
    // Passe MEMBER_NAME_SELECTOR oben an!
    let members = [...document.querySelectorAll(MEMBER_NAME_SELECTOR)]
        .map(el => el.innerText.trim())
        .filter(text => text && text.length > 0 && !text.toLowerCase().includes("user")); // Filtern von leeren Strings und "user"

    // Entferne doppelte Einträge (falls der Selektor ungenau war)
    let uniqueMembers = [...new Set(members)];

    // Nummerierung hinzufügen
    let numberedList = uniqueMembers.map((name, index) => `${index + 1}. ${name}`);

    console.log(`? Gesamtanzahl eindeutiger Mitglieder gefunden: ${uniqueMembers.length}`);
    if (numberedList.length > 0) {
        console.log("--- Mitgliederliste ---");
        console.log(numberedList.join("\n"));
        console.log("--- Ende der Liste ---");
    } else {
        console.log("? Keine Mitglieder gefunden. Überprüfe die Selektoren!");
    }


    return numberedList;
}

// Funktion starten (am besten in der Browser-Konsole)
scrapeAllMembers();
 
Ich möchte von einer Seite 2 Spalten als Ausgabe erhalten.

Die Selektoren passen eigentlich perfekt.
Rechtsklick - Untersuchen und ich lande genau da:
#row9607-365 > span > div > div:nth-child(1) > div > span
<span class="css-315">Name,Name</span>

#row9607-365 > span > div > div:nth-child(2) > div > span
<span class="css-301">E-Mail</span>
das kommt raus::

Code:
? Suche Scroll-Container...
VM18106:30 ? Warnung: Scroll-Container mit Selektor "[role="table"], .list-container-class" nicht gefunden. Versuche, das Fenster zu scrollen.
scrapeAllMembers @ VM18106:30
(anonymous) @ VM18106:112
VM18106:40 ?? Starte Scroll-Vorgang...
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
Promise {<pending>}
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:68 ?? Höhe hat sich geändert, scrolle weiter.
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:65 ?? Höhe hat sich nicht geändert. Stabilitätsversuch 1/5.
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:65 ?? Höhe hat sich nicht geändert. Stabilitätsversuch 2/5.
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:65 ?? Höhe hat sich nicht geändert. Stabilitätsversuch 3/5.
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:65 ?? Höhe hat sich nicht geändert. Stabilitätsversuch 4/5.
VM18106:51 ?? Scrolle Fenster auf Höhe: 1002
VM18106:61 ?? Höhe vorher: 1002, Höhe nachher: 1002
VM18106:65 ?? Höhe hat sich nicht geändert. Stabilitätsversuch 5/5.
VM18106:81 ? Scrollen beendet. Höhe blieb für 5 Versuche stabil.
VM18106:84 ?? Sammle Mitglieder...
VM18106:98 ? Gesamtanzahl eindeutiger Mitglieder gefunden: 0
VM18106:104 ? Keine Mitglieder gefunden. Überprüfe die Selektoren!
 

Anhänge

  • 1743339651226.png
    1743339651226.png
    6,9 KB · Aufrufe: 31
Zuletzt bearbeitet:
Und die Zeilen werden beim Scrollen gerendert wenn sie ins Blickfeld kommen?

Lädt die Seite die Daten dynamisch nach? Werden alle 1629 Elemente mit einmal geladen? Dann würde ich mal in die Netzwerk-Aktivitäten im Browser sehen, eventuell geht da das JSON oder was auch immer so durch die Leitung, dass du das direkt benutzen kannst.

Ansonsten musst du wohl

1) Seite laden
2) Daten speichern
3) Scrollen
4) warten, dass die neuen Daten angezeigt werden
5) -> 2)
 
Und die Zeilen werden beim Scrollen gerendert wenn sie ins Blickfeld kommen?
Wenn ich manuell scrolle, ja.

Lädt die Seite die Daten dynamisch nach?,
Ich denke ja.
Werden alle 1629 Elemente mit einmal geladen?
Nein. Sonst hätte ich alles kopiert und weiter bearbeitet. :)

Dann würde ich mal in die Netzwerk-Aktivitäten im Browser sehen, eventuell geht da das JSON oder was auch immer so durch die Leitung, dass du das direkt benutzen kannst.
Ich habe absolut keine Ahnung wie das geht.
1743340435949.png

So sieht das beim Scrollen aus. Ich vermute man sieht, dass etwas nachgeladen wird, aber ich wüsste nicht wohin ich als nächstes klicken muss :)


Das bedeutet bestimmt auch irgendwas...
1743340523072.png
 
Nein. Sonst hätte ich alles kopiert und weiter bearbeitet. :)
Na ja, nur weil etwas nicht angezeigt wird heißt das ja nicht, dass es der Browser noch nicht geladen hat ;) Sehr viel UI wird mittlerweile erst im Sichtfeld angezeigt

Wenn du den Netzwerk Tab im Auge behältst und geöffnet hast beim Laden der Seite, siehst du unterhalb dieses Graphen was durch die Leitung fliegt. Wenn du auf "Fetch/XHR" klickt nur das, was dynamisch nach kommt.
 
Das hat irgendwie geholfen. Danke! Mit ChatGPT schafft es jeder unfähige irgendwie etwas zu bekommen. Unglaublich. :d
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh