Analizando un sitio de cine en Golang

Hola a todos, en este art铆culo veremos un peque帽o c贸digo de muestra escrito para recopilar datos de un sitio en el popular lenguaje de programaci贸n Go today.

Este art铆culo ser谩 especialmente interesante para aquellos que han escuchado mucho sobre Go, pero a煤n no lo han probado por su cuenta.

Para uno de los proyectos internos, necesit谩bamos recopilar datos sobre las pel铆culas que se alquilan y el calendario de espect谩culos, ahora consideraremos la primera versi贸n (m谩s simple) del analizador, con la que todo comenz贸.

Para aquellos que son demasiado vagos para leer el c贸digo del art铆culo, les proporciono inmediatamente un enlace al repositorio .

En su primera versi贸n, el analizador pudo recopilar solo la siguiente informaci贸n:

  • Sobre sesiones en un cine,
  • Descripci贸n detallada,
  • T铆tulo,
  • Estudio,

Y gu谩rdelo en JSON. Inicialmente, debe seleccionar la biblioteca adecuada para el an谩lisis.

Google ofrece una gran cantidad de opciones para la consulta `raspado web de golang`, muchas de ellas se reflejan en esta lista , le aconsejo que la lea, eleg铆 geziyor , ya que admite JS Rendering (que, por cierto, no usaremos en este Sin embargo, esta caracter铆stica es muy 煤til al analizar sitios) y es bastante simple de usar.

Entonces, la biblioteca est谩 seleccionada, el siguiente paso es instalarla y comenzar a usarla en el c贸digo.
Instalar la biblioteca es extremadamente simple:

go get -u github.com/geziyor/geziyor

Ahora pasemos a escribir c贸digo.

Dentro del cuerpo de la funci贸n principal, llamamos al analizador, le damos la URL de la p谩gina desde la que comenzaremos a recopilar datos e indicamos que queremos exportar el resultado a un archivo JSON:


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

Se ha comenzado, pero no hay suficiente l贸gica para recopilar datos, para esto necesitamos implementar la funci贸n parseMovies .

La l贸gica de recopilaci贸n ser谩 la siguiente:

  • Busque un bloque que contenga informaci贸n de la pel铆cula,
  • Recopilaci贸n de informaci贸n sobre todas las sesiones dentro de este bloque,
  • Colecci贸n del nombre de la pel铆cula y estudio de cine,
  • Recopilando un enlace a una p谩gina con informaci贸n detallada sobre la pel铆cula,
  • Colecci贸n de descripciones de esta p谩gina.

Pasemos a la implementaci贸n de esta funci贸n.


Aqu铆, todos los bloques que contienen informaci贸n sobre la pel铆cula se seleccionan para su posterior procesamiento.

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

De esta manera, se recopila informaci贸n sobre las sesiones y luego se lleva a una forma conveniente para una persona (eliminamos espacios y sangr铆as adicionales en una nueva l铆nea).


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

Este bloque de c贸digo es responsable de obtener una p谩gina con informaci贸n detallada sobre la pel铆cula y obtener su descripci贸n.


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) 

Esto llama a la API para exportar los resultados a un archivo 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, 
}

隆Hurra, ya terminaste! Solo queda combinar los bloques de c贸digo escritos y comenzar a analizar.

As铆 es como funciona el analizador, vemos mensajes en la recepci贸n exitosa de p谩ginas en el terminal, esto es conveniente.



Y as铆 es como se ve el resultado del an谩lisis.



Gracias por leer el art铆culo, me encanta programar en Go.

All Articles