Compare commits
No commits in common. "77d6e3bcd77f852332ca298cb3563e4a29d0c5a4" and "4f394e39256b7f8bae99098ef3389d93dd2cfab6" have entirely different histories.
77d6e3bcd7
...
4f394e3925
2 changed files with 35 additions and 151 deletions
64
README.md
64
README.md
|
@ -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
|
||||||
|
|
122
scraper.go
122
scraper.go
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue