DEV Community

Everton Tenorio
Everton Tenorio

Posted on • Edited on

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.

Top comments (0)