Pular para o conteúdo principal

victorstein.dev

67/100 Dias de Golang - Webscrapping com Colly

Table of Contents

# Webscrapping com Colly

Colly é uma biblioteca de scraping para usar em golang. Com ela, conseguimos navegar por páginas HTML, capturar informações específicas, preencher formulários e até mesmo simular interações de usuário. Vamos fazer um script para pegar todos os dados do blog. Vamos iniciar um projeto e instalar a lib

go get -u github.com/gocolly/colly/v2

A arquitetura do colly é toda baseada em callbacks. Veja a documentação do Colly para saber mais. Sempre temos que inicial um collector c := colly.NewCollector() o Collector gerencia a comunicação de rede e é responsável pela execução dos callbacks associados enquanto o scraping está em execução.

E o nosso callback principal, nesse caso, é o c.OnHTML ele registra um evento para ser executado sempre que um elemento correspondente ao seletor seja encontrado durante o scraping. O seletor article h1 a significa: dentro de um elemento <article>, encontre um <h1> que tenha um link <a>. No nosso caso essa estrutura:

Estrutura de tags html do blog

package main

import (
    "fmt"
    "github.com/gocolly/colly/v2"
)

func main() {
    c := colly.NewCollector()

    c.OnHTML("article h1 a", func(e *colly.HTMLElement) {
        fmt.Println("Título encontrado:", e.Text)
    })

    c.OnError(func(_ *colly.Response, err error) {
        fmt.Println("Erro ao acessar o site:", err)
    })

    c.Visit("https://victorstein.dev/")
}

Se rodarmos o script teremos a seguinte saída:

Título encontrado: 66/100 Dias de Golang - Jogo usando bubbletea e lipgloss - Parte 2
Título encontrado: 65/100 Dias de Golang - Jogo usando bubbletea e lipgloss
Título encontrado: 64/100 Dias de Golang - Iniciando uma TUI - Terminal User Interface
Título encontrado: 63/100 Dias de Golang - Gerando dados com Faker
Título encontrado: 62/100 Dias de Golang - Testes - Mockgen
Título encontrado: 61/100 Dias de Golang - Testes - Mocks
Título encontrado: 60/100 Dias de Golang - Jogo em UDP - Parte 6
Título encontrado: 59/100 Dias de Golang - Jogo em UDP - Parte 5
Título encontrado: 58/100 Dias de Golang - Jogo em UDP - Parte 4
Título encontrado: 57/100 Dias de Golang - Jogo em UDP - Parte 3

Vamos adicionar uma lógica para fazer ele visitar todas as páginas do blog e pegar a lista completa de posts. Para isso temos que faze um for no c.Visit:

for i := 1; i < 8; i++ {
	url := fmt.Sprintf("https://victorstein.dev/page/%d/", i)
	c.Visit(url)

}

Dessa forma teremos visitado todas as páginas do blog!