Analyser un site de cinéma sur Golang

Bonjour à tous, dans cet article, nous allons examiner un petit exemple de code écrit pour collecter des données à partir d'un site dans le langage de programmation populaire Go.

Cet article sera particulièrement intéressant pour ceux qui ont beaucoup entendu parler de Go, mais ne l'ont pas encore essayé par eux-mêmes.

Pour l'un des projets internes, nous devions collecter des données sur les films loués et le calendrier des émissions.Nous allons maintenant considérer la première version (la plus simple) de l'analyseur, avec laquelle tout a commencé.

Pour ceux qui sont trop paresseux pour lire le code de l'article, je fournis immédiatement un lien vers le référentiel .

Dans sa première version, l'analyseur n'a pu collecter que les informations suivantes:

  • À propos des séances dans un cinéma,
  • Description détaillée,
  • Titre,
  • Studio,

Et enregistrez-le dans JSON. Au départ, vous devez sélectionner la bibliothèque appropriée pour l'analyse.

Google offre un grand nombre d'options pour la requête `` grattage web golang '', beaucoup d'entre elles sont reflétées dans cette liste , je vous conseille de vous familiariser avec elle, j'ai choisi geziyor , car il prend en charge JS Rendering (que, d'ailleurs, nous n'utiliserons pas dans ce exemple, cependant, cette fonctionnalité est très utile lors de l'analyse de sites) et est assez simple à utiliser.

Ainsi, la bibliothèque est sélectionnée, l'étape suivante consiste à l'installer et à commencer à l'utiliser dans le code.
L'installation de la bibliothèque est extrêmement simple:

go get -u github.com/geziyor/geziyor

Passons maintenant à l'écriture de code.

Dans le corps de la fonction principale, nous appelons l'analyseur, lui donnons l'URL de la page à partir de laquelle nous allons commencer à collecter les données et indiquons que nous voulons exporter le résultat vers un fichier JSON:


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

Un début a été fait, mais il n'y a pas assez de logique pour collecter des données, pour cela nous devons implémenter la fonction parseMovies .

La logique de collecte sera la suivante:

  • Recherchez un bloc contenant des informations sur le film,
  • Collecte d'informations sur toutes les sessions à l'intérieur de ce bloc,
  • Collection du nom du film et du studio de cinéma,
  • Rassembler un lien vers une page contenant des informations détaillées sur le film,
  • Collection de descriptions de cette page

Passons à l'implémentation de cette fonction.


Ici, tous les blocs contenant des informations sur le film sont sélectionnés pour un traitement ultérieur.

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

De cette façon, les informations sur les sessions sont collectées, puis elles sont présentées sous une forme pratique pour une personne (nous supprimons les espaces et les retraits supplémentaires sur une nouvelle ligne).


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 ") 
}

Ce bloc de code est chargé d'obtenir une page contenant des informations détaillées sur le film et d'obtenir sa description.


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) 

Cela appelle l'API pour exporter les résultats dans un fichier JSON.


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, 
}

Hourra, vous avez terminé! Il ne reste plus qu'à combiner les blocs de code écrits et à commencer l'analyse.

C'est ainsi que fonctionne l'analyseur, nous voyons des messages sur la réception réussie des pages dans le terminal, c'est pratique.



Et voici à quoi ressemble le résultat de l'analyse.



Merci d'avoir lu l'article, adorez programmer sur Go.

All Articles