DEV Community

Everton Tenorio
Everton Tenorio

Posted on • Updated on

Web Scraping com Go: Coletando Notícias do Flamengo

Quando o assunto é Web Scraping geralmente tem alguma coisa a ver com Python e suas bibliotecas populares como BeautifulSoup e Scrapy.

Realizar web scraping eficientemente com Go também é possível. Neste artigo, um exemplo prático de um scraping utilizando a biblioteca Colly para coletar as notícias do site oficial do Flamengo.

Site do Flamengo

Disclaimer Importante:

Este exemplo prático de web scraping tem como único propósito educacional e de demonstração técnica. A coleta de dados foi realizada para fins de estudo.

É crucial respeitar os termos de serviço e políticas de privacidade dos sites ao realizar atividades de web scraping. Todo o conteúdo, marcas, e propriedades intelectuais mencionadas no exemplo pertencem ao C.R. do Flamengo.

Go!

Setup Inicial

O código começa importando além das mais comuns, algumas bibliotecas essenciais para o projeto:

  • github.com/gocolly/colly é usado para o scraping em si
  • github.com/go-telegram-bot-api/telegram-bot-api é para enviar as notícias via Telegram
  • github.com/joho/godotenv é utilizado para carregar variáveis de ambiente

O código completo está disponível no github.


Struct e Funções Auxiliares

Uma estrutura MengaoNews é definida para armazenar os dados de cada notícia. Além disso, a função contains é usada para verificar se um elemento está presente em uma lista de strings.

type MengaoNews struct {
    url, image, title, desc, date string
}

func contains(s []string, str string) bool {
    for _, v := range s {
        if v == str {
            return true
        }
    }
    return false
}
Enter fullscreen mode Exit fullscreen mode

Inicializando o Coletor

Um novo coletor Colly é iniciado e é configurado um agente para simular uma requisição de um navegador.

c := colly.NewCollector()
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
Enter fullscreen mode Exit fullscreen mode

Manipuladores Colly - manipulando os elementos HTML


c.OnHTML("ul.pagination li a", func(e *colly.HTMLElement) {
    // Manipulador para descobrir novas páginas
})

c.OnHTML("ul.list-unstyled li", func(e *colly.HTMLElement) {
    // Manipulador para coletar dados das notícias
})
Enter fullscreen mode Exit fullscreen mode

c.OnHTML Registra um manipulador de função para ser executado quando encontrar elementos HTML que correspondam ao seletor CSS fornecido.

O Seletor CSS ul.pagination li a especifica que o manipulador será chamado para cada elemento âncora <a> dentro de um item de lista <li> em uma lista não ordenada <ul>.

Coleta de Dados das notícias

Em c.OnHTML("ul.list-unstyled li",...) é extraído os dados específicos das notícias, como URL, imagem, título, descrição e data.


mengoPost.url = e.ChildAttr("a", "href")
mengoPost.image = e.ChildAttr("img", "src")
mengoPost.title = e.ChildText("h4.text-uppercase")
mengoPost.desc = e.ChildText("p.paragraph")
mengoPost.date = e.ChildText("span.destaque-span")
Enter fullscreen mode Exit fullscreen mode

e.ChildAttr(tag, attr): Obtém o valor de um atributo (attr) de um elemento filho especificado (tag).
e.ChildText(tag): Obtém o texto de um elemento filho especificado (tag).


OnScraped - Ação que ocorre após Scraping de uma Página


c.OnScraped(func(response *colly.Response) {
    // ...
})
Enter fullscreen mode Exit fullscreen mode

c.OnScraped Registra um manipulador de função para ser executado após o scraping de uma página.
response *colly.Response Fornece acesso ao objeto de resposta da página que foi totalmente raspada.

Este método é útil para realizar operações que dependem do conteúdo completo da página, como armazenar os dados em um banco de dados, processar os resultados, ou qualquer ação pós-scraping necessária.


c.Visit - Iniciando o Scraping de uma Página

Aqui é iniciado o scraping de uma página específica, seguindo os links e posteriormente executando os manipuladores registrados.

O método c.Visit é crucial para iniciar o processo de web scraping. Pode ser chamado uma vez para iniciar o scraping de uma página inicial, e durante o processo, pode ser chamado novamente para seguir links e continuar coletando dados de páginas subsequentes.


c.Visit(pageToScrape)
Enter fullscreen mode Exit fullscreen mode

Telegram Bot Integration

Além do scraping, o bot do Telegram é integrado para enviar as notícias coletadas, facilitando a visualização das mesmas. O bot é configurado com o token e ID do chat, e as mensagens são formatadas para serem enviadas em formato HTML.



bot, err := tgbotapi.NewBotAPI(telegramToken)
// ...

formatMessage := fmt.Sprintf("<a href='%s'>&#8205;</a><a href='%s'><b>%s</b></a>\n<code>%s</code>\n\n%s",
    mengoPost.image,
    mengoPost.url,
    mengoPost.title,
    mengoPost.date,
    mengoPost.desc)
message := tgbotapi.NewMessageToChannel(chatID, formatMessage)
message.ParseMode = "HTML"
_, err = bot.Send(message)
// ...
Enter fullscreen mode Exit fullscreen mode

Conclusão

Com a biblioteca Colly, é possível realizar um web scraping de maneira eficaz e estruturada. Neste exemplo, foi feita a exploração desde a inicialização do coletor até a integração com um bot do Telegram.

Top comments (0)