Compare commits

..

No commits in common. "77d6e3bcd77f852332ca298cb3563e4a29d0c5a4" and "4f394e39256b7f8bae99098ef3389d93dd2cfab6" have entirely different histories.

2 changed files with 35 additions and 151 deletions

View file

@ -1,16 +1,18 @@
# Pad Stratum0 Link Extractor # iFrame Link Extractor
## Beschreibung ## Beschreibung
Dieses Go-Programm ist ein spezialisierter Web Scraper, der entwickelt wurde, um Links von der Pad Stratum0 Plattform zu extrahieren. Es navigiert durch verschachtelte iFrames und sammelt alle URLs, die mit "https://pad.stratum0.org/p/dc" beginnen. Dieses Go-Programm verwendet die go-rod Bibliothek, um den Inhalt von verschachtelten iFrames auf einer Webseite zu extrahieren und alle darin enthaltenen HTTPS-Links zu identifizieren und auszugeben. Es ist besonders nützlich für Webseiten mit komplexen iFrame-Strukturen, bei denen der Zugriff auf den Inhalt tiefer verschachtelter iFrames erforderlich ist.
## Funktionen ## Funktionen
- Extrahiert Links von einer initialen URL und folgt diesen rekursiv bis zu einer konfigurierbaren maximalen Tiefe. - Navigiert zu einer angegebenen URL
- Navigiert durch verschachtelte iFrames, um versteckte Links zu finden. - Wartet auf das Laden der Hauptseite
- Vermeidet doppelte Besuche von URLs. - Findet und wechselt in den Kontext eines äußeren iFrames
- Bietet detaillierte Konsolenausgaben über den Fortschritt des Scrapings. - Findet und wechselt in den Kontext eines inneren iFrames innerhalb des äußeren iFrames
- Sammelt Statistiken über gefundene und besuchte Links. - Extrahiert den Textinhalt des inneren iFrames
- Identifiziert alle HTTPS-Links im extrahierten Text
- Gibt die gefundenen Links aus
## Voraussetzungen ## Voraussetzungen
@ -23,8 +25,8 @@ Dieses Go-Programm ist ein spezialisierter Web Scraper, der entwickelt wurde, um
2. Klonen Sie das Repository: 2. Klonen Sie das Repository:
``` ```
git clone https://github.com/yourusername/pad-stratum0-link-extractor.git git clone https://github.com/yourusername/iframe-link-extractor.git
cd pad-stratum0-link-extractor cd iframe-link-extractor
``` ```
3. Installieren Sie die erforderlichen Abhängigkeiten: 3. Installieren Sie die erforderlichen Abhängigkeiten:
@ -32,43 +34,26 @@ Dieses Go-Programm ist ein spezialisierter Web Scraper, der entwickelt wurde, um
go mod tidy go mod tidy
``` ```
## Konfiguration
Sie können die maximale Suchtiefe anpassen, indem Sie den Wert der `maxDepth` Variable am Anfang der `main.go` Datei ändern:
```go
maxDepth = 3 // Ändern Sie diesen Wert nach Bedarf
```
## Verwendung ## Verwendung
1. Führen Sie das Programm aus: 1. Öffnen Sie die `main.go` Datei und passen Sie die URL und iFrame-Selektoren an Ihre Zielwebseite an.
2. Führen Sie das Programm aus:
``` ```
go run main.go go run main.go
``` ```
2. Das Programm wird mit der Extraktion von Links beginnen und den Fortschritt in der Konsole ausgeben. 3. Das Programm wird die gefundenen HTTPS-Links in der Konsole ausgeben.
3. Nach Abschluss wird eine Liste aller gefundenen Links sowie Statistiken angezeigt.
## Ausgabe
Das Programm gibt folgende Informationen aus:
- Fortschrittsmeldungen für jede verarbeitete URL
- Informationen über gefundene und geladene iFrames
- Eine Liste aller gefundenen einzigartigen Links
- Statistiken über die Gesamtanzahl der gefundenen Links, besuchten URLs und die Gesamtlaufzeit
## Anpassung ## Anpassung
- Um andere Websites zu scrapen, passen Sie die initiale URL und den regulären Ausdruck für die Link-Erkennung an. - Um auf spezifische Elemente innerhalb der iFrames zu warten, können Sie zusätzliche `MustElement().MustWaitVisible()` Aufrufe hinzufügen.
- Für komplexere Scraping-Logik können Sie die `extractLinks` Funktion modifizieren. - Der reguläre Ausdruck für die Link-Erkennung kann angepasst werden, um spezifischere URL-Muster zu erfassen.
## Fehlerbehebung ## Fehlerbehebung
- Wenn Sie Probleme mit dem Laden von iFrames haben, überprüfen Sie die CSS-Selektoren in der `processNestedIframes` Funktion. - Wenn Sie Probleme mit Timeouts haben, erhöhen Sie die Wartezeiten mit `page.Timeout()` oder `MustElement().WaitVisible()`.
- Bei Timeout-Problemen können Sie die `MustWaitLoad` Aufrufe anpassen oder zusätzliche Wartezeiten einbauen. - Bei Problemen mit dem Zugriff auf iFrames aufgrund von Sicherheitseinstellungen, erwägen Sie die Verwendung zusätzlicher Browser-Optionen wie im Kommentar im Code beschrieben.
## Beitrag ## Beitrag
@ -77,16 +62,15 @@ Beiträge zum Projekt sind willkommen. Bitte öffnen Sie ein Issue oder einen Pu
## Lizenz ## Lizenz
[Fügen Sie hier Ihre gewählte Lizenz ein, z.B. MIT, GPL, etc.] [Fügen Sie hier Ihre gewählte Lizenz ein, z.B. MIT, GPL, etc.]
``` ```
Diese README.md bietet eine umfassende Übersicht über Ihr Projekt und enthält Abschnitte für: Diese README.md bietet eine umfassende Übersicht über Ihr Projekt und enthält Abschnitte für:
1. Eine Beschreibung des Projekts und seiner Hauptfunktionen 1. Eine kurze Beschreibung des Projekts
2. Installationsanweisungen 2. Die Hauptfunktionen
3. Konfigurationsmöglichkeiten 3. Voraussetzungen für die Nutzung
4. Verwendungshinweise 4. Installationsanweisungen
5. Erklärung der Ausgabe 5. Verwendungshinweise
6. Anpassungsmöglichkeiten 6. Anpassungsmöglichkeiten
7. Tipps zur Fehlerbehebung 7. Tipps zur Fehlerbehebung
8. Informationen zum Beitragen zum Projekt 8. Informationen zum Beitragen zum Projekt

View file

@ -3,96 +3,18 @@ package main
import ( import (
"fmt" "fmt"
"regexp" "regexp"
"time"
"github.com/go-rod/rod" "github.com/go-rod/rod"
) )
var (
visitedURLs = make(map[string]bool)
allLinks = make(map[string]bool)
maxDepth = 3 // Hier können Sie die maximale Tiefe festlegen
)
func main() { func main() {
fmt.Println("Starte das Programm...")
startTime := time.Now()
browser := rod.New().MustConnect() browser := rod.New().MustConnect()
defer browser.MustClose() defer browser.MustClose()
initialURL := "https://pad.stratum0.org/p/dc" page := browser.MustPage("https://pad.stratum0.org/p/dc") // URL der Hauptseite
fmt.Printf("Beginne mit der initialen URL: %s\n", initialURL)
fmt.Printf("Maximale Tiefe: %d\n", maxDepth)
toVisit := []struct {
url string
depth int
}{{initialURL, 0}}
for len(toVisit) > 0 {
current := toVisit[0]
toVisit = toVisit[1:]
newLinks := extractLinksFromPage(browser, current.url, current.depth)
for _, link := range newLinks {
if !visitedURLs[link] && current.depth < maxDepth {
toVisit = append(toVisit, struct {
url string
depth int
}{link, current.depth + 1})
}
}
}
fmt.Println("\nAlle gefundenen Links:")
for link := range allLinks {
fmt.Println(link)
}
fmt.Printf("\nStatistik:\n")
fmt.Printf("Gesamtanzahl der gefundenen Links: %d\n", len(allLinks))
fmt.Printf("Anzahl der besuchten URLs: %d\n", len(visitedURLs))
fmt.Printf("Gesamtzeit: %v\n", time.Since(startTime))
}
func extractLinksFromPage(browser *rod.Browser, url string, depth int) []string {
fmt.Printf("\nVerarbeite URL: %s (Tiefe: %d)\n", url, depth)
if depth > maxDepth {
fmt.Printf("Maximale Tiefe erreicht für URL: %s\n", url)
return nil
}
if visitedURLs[url] {
fmt.Printf("URL bereits besucht: %s\n", url)
return nil
}
visitedURLs[url] = true
page := browser.MustPage(url)
defer page.MustClose()
page.MustWaitLoad() page.MustWaitLoad()
fmt.Printf("Seite geladen: %s\n", url)
var newLinks []string
// Verarbeite die Hauptseite
newLinks = append(newLinks, extractLinks(page, url)...)
// Verarbeite die verschachtelten iFrames
newLinks = append(newLinks, processNestedIframes(page, url)...)
return newLinks
}
func processNestedIframes(page *rod.Page, sourceURL string) []string {
fmt.Printf("Suche nach äußerem iFrame auf %s\n", sourceURL)
// Finden Sie das erste iFrame-Element // Finden Sie das erste iFrame-Element
outerIframeElement := page.MustElement("#editorcontainer > iframe:nth-child(1)") outerIframeElement := page.MustElement("#editorcontainer > iframe:nth-child(1)") // Passen Sie den Selektor an
// Wechseln Sie zum Kontext des ersten iFrames // Wechseln Sie zum Kontext des ersten iFrames
outerFrame := outerIframeElement.MustFrame() outerFrame := outerIframeElement.MustFrame()
@ -100,44 +22,22 @@ func processNestedIframes(page *rod.Page, sourceURL string) []string {
// Warten Sie, bis der Inhalt des ersten iFrames geladen ist // Warten Sie, bis der Inhalt des ersten iFrames geladen ist
outerFrame.MustWaitLoad() outerFrame.MustWaitLoad()
fmt.Printf("Äußeres iFrame geladen auf %s\n", sourceURL)
// Extrahiere Links aus dem äußeren iFrame
outerLinks := extractLinks(outerFrame, sourceURL+" (äußeres iFrame)")
fmt.Printf("Suche nach innerem iFrame auf %s\n", sourceURL)
// Finden Sie das zweite iFrame-Element innerhalb des ersten iFrames // Finden Sie das zweite iFrame-Element innerhalb des ersten iFrames
innerIframeElement := outerFrame.MustElement("#outerdocbody > iframe:nth-child(1)") innerIframeElement := outerFrame.MustElement("#outerdocbody > iframe:nth-child(1)") // Passen Sie den Selektor an
// Wechseln Sie zum Kontext des zweiten iFrames // Wechseln Sie zum Kontext des zweiten iFrames
innerFrame := innerIframeElement.MustFrame() innerFrame := innerIframeElement.MustFrame()
innerFrame.MustWaitLoad() innerFrame.MustWaitLoad()
fmt.Printf("Inneres iFrame geladen auf %s\n", sourceURL) // Extrahieren Sie den Text aus dem zweiten iFrame (Benutze statt #innderdocbody auch body für jedes Element)
text := innerFrame.MustElement("#innerdocbody").MustText()
// Extrahiere Links aus dem inneren iFrame // Regex zum Finden von Links, die mit https beginnen
innerLinks := extractLinks(innerFrame, sourceURL+" (inneres iFrame)") re := regexp.MustCompile(`https://[\w\.-]+(?:/[\w\.-]*)*`)
httpsLinks := re.FindAllString(text, -1)
return append(outerLinks, innerLinks...) fmt.Println("Gefundene https-Links:")
} for _, link := range httpsLinks {
fmt.Println(link)
func extractLinks(page *rod.Page, sourceURL string) []string {
text := page.MustElement("body").MustText()
re := regexp.MustCompile(`https://pad\.stratum0\.org/p/dc[^\s"']+`)
links := re.FindAllString(text, -1)
fmt.Printf("Gefundene Links auf %s: %d\n", sourceURL, len(links))
var newLinks []string
for _, link := range links {
if !allLinks[link] {
allLinks[link] = true
fmt.Printf("Neuer Link gefunden: %s\n", link)
newLinks = append(newLinks, link)
} }
} }
return newLinks
}