Coletando informações de sites com Golang
Salve, salve Devs!
Para quem já se perguntou como o Google descobre sites para colocar nos resultados de busca quando pesquisamos algo por lá, esse post é para você! Vamos usar Golang para fazermos um exemplo de busca de todas os links do site de notícias G1.
Bora lá.
Primeiramente é preciso ter o Golang na sua máquina, então já indico aqui o link oficial de instalação do Golang.
Outra coisa importante é que usaremos aqui um módulo do Golang chamado Colly, que é destinado à web scraping, crawler e web spider.
Web Scraping é, traduzindo, um coletor de dados da web. O Web Spider é um algoritmo que busca informações baseadas em conteúdo, palavras ou qualque informação literal. O termo Crawler é similar, sendo também baseado em algoritmo para buscar algo, conforme instruções à ele indicadas.
Feitas as considerações, vamos codar.
Iniciamos o nosso programa em Golang (ou simplesmente “Go”), usando o comando go init e podemos já sinalizar nele o nome do nosso repositório, por exemplo, gerando o módulo para reuso por outros devs futuramente.
go mod init github.com/felipebmart/crawler-go
Teremos então o nosso arquivo de módulo. Agora vamos criar nosso arquivo com extensão .go que terá o nosso código (chamei neste exemplo de crawler.go). Lembre-se que estamos usando o Colly, então precisamos importar esse módulo para o nosso código. Iniciamos nomeando nosso pacote principal na primeira linha e, após, importaremos os módulos fmt (necessário para termos o output do programa na tela, veremos quando executarmos o programa) e o Colly, que está referenciado no Github.
package main
import (
"fmt"
"github.com/gocolly/colly"
)
Em seguida precisaremos da nossa função principal, onde instanciaremos o Colly e passaremos as instruções para ele, para que execute o que precisamos.
func main() {
c := colly.NewCollector(
colly.AllowedDomains("g1.globo.com"),
)
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
fmt.Printf("Link found: %q -> %s\n", e.Text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Acessei o link", r.URL.String())
})
c.Visit("https://g1.globo.com/")
}
Vamos aos detalhes. Logo no começo da função main instaciamos o Colly com o nome de objeto “c”. O Colly possui o construtor “NewCollector” e, como queremos realizar uma coleta de informações, indicamos à ele a limitação dos domínios que queremos que ele busque informações, como notícias por exemplo.
Em seguida, indicaremos que desejamos buscar informações no HTML das páginas, mais precisamente pelos links, indicados no HTML com a tag “<a href=[os links queremos]… >”. Durante as requisições, usando o método “OnRequest” indicaremos ao módulo fmt para imprimir em tela os links que o Colly encontrou. E, finalmente, na última linha, usando o método “Visit” indicamos ao Colly de onde ele partirá para buscar os links.
Nosso código final, no arquivo crawler.go será este:
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
c := colly.NewCollector(
colly.AllowedDomains("g1.globo.com"),
)
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
fmt.Printf("Link encontrado: %q -> %s\n", e.Text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Acessei o link", r.URL.String())
})
c.Visit("https://g1.globo.com/")
}
Agora vamos compilar para gerar nosso binário executável. Para isso, usamos o comando go build.
go build
Teremos então um arquivo executável.
Agora é o momento de vermos o resultado do nosso trabalho! Vamos executar o programa. Lembrando que podemos fazer este processo no Linux, Windows ou Mac. Aqui estamos usando Linux, mas no Windows, por exemplo, será gerado um arquivo executável também, que pode ser executado no Powershell ou no CMD.
Para executar, utilizaremos então o comando “./crawler-go”, indicando que a execução ocorre na pasta em que está o executável.
Notem que a saída é impressa pelo módulo fmt como vimos no código, e todo link encontrado é obtida a manchete da notícia e o link dela no site do G1. Pensando em possibilidades, se gravarmos em um banco de dados essas informações, executando diariamente nosso programa, com o tempo teríamos por exemplo, todo o histórico de notícia desde o primeiro dia que executamos essa coleta. Isso lembra o Google? Vale lembra que o Golang, ou simplesmente Go é uma linguagem do Google. Esperamos que gostem!
O código utilizado aqui está disponível no Github.
Bora codar?
Mais informações do Colly no endereço http://go-colly.org/.
Showwww demais , super interessante gostei, parabéns .
Show demais!! Go tá crescendo muito, em breve será a nova linguagem “indie” da programação, haha, ficando no nível de Python