Analisando um site de cinema em Golang

Olá pessoal, neste artigo, examinaremos um pequeno código de amostra escrito para coletar dados de um site na popular linguagem de programação Go today.

Este artigo será especialmente interessante para quem já ouviu muito sobre o Go, mas ainda não o tentou por conta própria.

Para um dos projetos internos, precisávamos coletar dados sobre os filmes que estão sendo alugados e a programação dos shows, agora consideraremos a primeira versão (mais simples) do analisador, com a qual tudo começou.

Para quem tem preguiça de ler o código do artigo, forneço imediatamente um link para o repositório .

Em sua primeira versão, o analisador conseguiu coletar apenas as seguintes informações:

  • Sobre sessões em um cinema,
  • Descrição detalhada,
  • Título,
  • Estúdio,

E salve-o em JSON. Inicialmente, você precisa selecionar a biblioteca apropriada para análise.

O Google oferece um grande número de opções para a consulta `golang web scraping`, muitas delas estão refletidas nesta lista , eu aconselho você a se familiarizar com ela, escolhi geziyor , pois suporta JS Rendering (que, a propósito, não usaremos neste Por exemplo, no entanto, esse recurso é muito útil ao analisar sites) e é bastante simples de usar.

Portanto, a biblioteca é selecionada, o próximo passo é instalá-lo e começar a usá-lo no código.
A instalação da biblioteca é extremamente simples:

go get -u github.com/geziyor/geziyor

Agora vamos escrever código.

Dentro do corpo da função principal, chamamos o analisador, fornecemos o URL da página a partir da qual começaremos a coletar dados e indicamos que queremos exportar o resultado para um arquivo JSON:


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

Foi iniciado, mas não há lógica suficiente para coletar dados; para isso, precisamos implementar a função parseMovies .

A lógica da coleção será a seguinte:

  • Procure um bloco contendo informações do filme,
  • Coleta de informações sobre todas as sessões dentro deste bloco,
  • Coleção do nome do filme e estúdio de cinema,
  • Reunindo um link para uma página com informações detalhadas sobre o filme,
  • Coleção de descrições desta página

Vamos seguir para a implementação desta função.


Aqui, todos os blocos que contêm informações sobre o filme são selecionados para processamento adicional.

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

Dessa maneira, as informações sobre as sessões são coletadas e, em seguida, trazidas para um formulário conveniente para uma pessoa (removemos espaços e recuos extras em uma nova linha).


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

Esse bloco de código é responsável por obter uma página com informações detalhadas sobre o filme e obter sua descrição.


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) 

Isso chama a API para exportar os resultados para um arquivo 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, 
}

Hooray, você está pronto! Resta apenas combinar os blocos de código gravados e começar a analisar.

É assim que o analisador funciona; vemos mensagens no recebimento bem-sucedido de páginas no terminal, isso é conveniente.



E é assim que o resultado da análise parece.



Obrigado por ler o artigo, adoro programar em Go.

All Articles