Analyse einer Kinoseite auf Golang

Hallo allerseits, in diesem Artikel sehen wir uns einen kleinen Beispielcode an, der geschrieben wurde, um Daten von einer Site in der beliebten Programmiersprache Go today zu sammeln.

Dieser Artikel ist besonders interessant für diejenigen, die viel über Go gehört haben, es aber noch nicht selbst ausprobiert haben.

Für eines der internen Projekte mussten wir Daten über die ausgeliehenen Filme und den Zeitplan der Shows sammeln. Jetzt werden wir die erste (einfachste) Version des Parsers betrachten, mit der alles begann.

Für diejenigen, die zu faul sind, um den Artikelcode zu lesen, stelle ich sofort einen Link zum Repository bereit .

In seiner ersten Version konnte der Parser nur die folgenden Informationen sammeln:

  • Über Sessions in einem Kino,
  • Detaillierte Beschreibung,
  • Titel,
  • Studio,

Und speichern Sie es in JSON. Zunächst müssen Sie die entsprechende Bibliothek zum Parsen auswählen.

Google bietet eine große Anzahl von Optionen für die Abfrage "Golang Web Scraping", viele davon sind in dieser Liste enthalten . Ich rate Ihnen, sie zu lesen. Ich habe geziyor gewählt , da es JS-Rendering unterstützt (das wir übrigens hier nicht verwenden werden Diese Funktion ist jedoch beispielsweise beim Parsen von Websites sehr nützlich und recht einfach zu verwenden.

Wenn die Bibliothek ausgewählt ist, besteht der nächste Schritt darin, sie zu installieren und im Code zu verwenden.
Die Installation der Bibliothek ist äußerst einfach:

go get -u github.com/geziyor/geziyor

Fahren wir nun mit dem Schreiben von Code fort.

Im Hauptteil der Hauptfunktion rufen wir den Parser auf, geben ihm die URL der Seite, von der aus wir mit der Datenerfassung beginnen, und geben an, dass das Ergebnis in eine JSON-Datei exportiert werden soll:


func main() { 
    geziyor.NewGeziyor(&geziyor.Options{ 
        StartURLs: []string{"https://kinoteatr.ru/raspisanie-kinoteatrov/city/#"}, 
        ParseFunc: parseMovies, 
        Exporters: []export.Exporter{&export.JSON{}}, 
    }).Start() 
}

Es wurde begonnen, aber es gibt nicht genügend Logik zum Sammeln von Daten. Dazu müssen wir die Funktion parseMovies implementieren .

Die Erfassungslogik lautet wie folgt:

  • Suchen Sie nach einem Block mit Filminformationen.
  • Sammlung von Informationen zu allen Sitzungen in diesem Block,
  • Sammlung des Namens des Films und des Filmstudios,
  • Sammeln eines Links zu einer Seite mit detaillierten Informationen zum Film,
  • Sammlung von Beschreibungen von dieser Seite

Fahren wir mit der Implementierung dieser Funktion fort.


Hier werden alle Blöcke, die Informationen über den Film enthalten, zur weiteren Verarbeitung ausgewählt.

func parseMovies(g *geziyor.Geziyor, r *client.Response) {
    r.HTMLDoc.Find("div.shedule_movie").Each(func(i int, s *goquery.Selection) { 

Auf diese Weise werden Informationen zu den Sitzungen gesammelt und dann in eine für eine Person geeignete Form gebracht (wir entfernen zusätzliche Leerzeichen und Einrückungen in einer neuen Zeile).


var sessions = strings.Split(s.Find(".shedule_session_time").Text(), " \n ") 
sessions = sessions[:len(sessions)-1] 

for i := 0; i < len(sessions); i++ { 
    sessions[i] = strings.Trim(sessions[i], "\n ") 
}

Dieser Codeblock ist dafür verantwortlich, eine Seite mit detaillierten Informationen zum Film und dessen Beschreibung zu erhalten.


if href, ok := s.Find("a.gtm-ec-list-item-movie").Attr("href"); ok {
    g.Get(r.JoinURL(href), func(_g *geziyor.Geziyor, _r *client.Response) {
        description = _r.HTMLDoc.Find("span.announce p.movie_card_description_inform").Text() 
        description = strings.ReplaceAll(description, "\t", "") 
        description = strings.ReplaceAll(description, "\n", "") 
        description = strings.TrimSpace(description) 

Dadurch wird die API aufgerufen, um die Ergebnisse in eine JSON-Datei zu exportieren.


g.Exports <- map[string]interface{}{ 
    "title":        strings.TrimSpace(s.Find("span.movie_card_header.title").Text()), 
    "subtitle":    strings.TrimSpace(s.Find("span.sub_title.shedule_movie_text").Text()), 
    "sessions":    sessions, 
    "description": description, 
}

Hurra, du bist fertig! Es bleibt nur, die geschriebenen Codeblöcke miteinander zu kombinieren und mit dem Parsen zu beginnen.

So funktioniert der Parser, wir sehen Meldungen über den erfolgreichen Empfang von Seiten im Terminal, das ist praktisch.



Und so sieht das Ergebnis des Parsens aus.



Vielen Dank für das Lesen des Artikels, liebe das Programmieren auf Go.

All Articles