DEV Community

Everton Tenorio
Everton Tenorio

Posted on • Edited on

1

Web Scraping em Go: 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.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay