DEV Community

Cover image for Web Scraping en Go
Eduardo Gonz谩lez
Eduardo Gonz谩lez

Posted on

Web Scraping en Go

Primeros pasos

En primer lugar debemos de tener instalado Go (1.22.0 o superior), Instrucciones para descargar e instalar Go.

Creamos una nueva carpeta para el proyecto, nos movemos al directorio y ejecutamos el siguiente comando:

go mod init scraper
Enter fullscreen mode Exit fullscreen mode

馃挕 El comando go mod init se utiliza para inicializar un nuevo m贸dulo Go en el directorio donde se ejecuta y crea un archivo go.mod para rastrear las dependencias del c贸digo. Gesti贸n de dependencias

Ahora instalemos Colibri:

go get github.com/gonzxlez/colibri
Enter fullscreen mode Exit fullscreen mode

馃挕 Colibri es un paquete Go que nos permite rastrear y extraer datos estructurados en la web usando un conjuntos de reglas definidas en JSON. Repositorio


Reglas de extracci贸n

Definimos las reglas que usara colibri para extraer los datos que necesitamos. Documentaci贸n

Vamos a realizar una petici贸n HTTP a la URL https://pkg.go.dev/search?q=xpath la cual contiene los resultados de una consulta de paquetes Go relacionados con xpath en Go Packages.

Usando las herramientas de desarrollo incluidas en nuestro navegador web, podemos inspeccionar la estructura HTML de la p谩gina. 驴Cu谩les son las herramientas de desarrollo del navegador?

Captura de pantalla

<div class="SearchSnippet">
   <div class="SearchSnippet-headerContainer">
      <h2>
         <a href="/github.com/antchfx/xpath" data-gtmc="search result" data-gtmv="0" data-test-id="snippet-title">
         xpath
         <span class="SearchSnippet-header-path">(github.com/antchfx/xpath)</span>
         </a>
      </h2>
   </div>
   <div class="SearchSnippet-infoLabel">
      <a href="/github.com/antchfx/xpath?tab=importedby" aria-label="Go to Imported By">
      <span class="go-textSubtle">Imported by </span><strong>143</strong>
      </a>
      <span class="go-textSubtle">|</span>
      <span class="go-textSubtle">
      <strong>v1.2.5</strong> published on <span data-test-id="snippet-published"><strong>Oct 26, 2023</strong></span>
      </span>
      <span class="go-textSubtle">|</span>
      <span data-test-id="snippet-license">
      <a href="/github.com/antchfx/xpath?tab=licenses" aria-label="Go to Licenses">
      MIT
      </a>
      </span>
   </div>
</div>
Enter fullscreen mode Exit fullscreen mode

Fragmento de la estructura HTML que representa un resultado de la consulta.

Entonces necesitamos un selector 鈥packages鈥 que encontrar谩 todos los elementos div en el HTML con la clase SearchSnippet, de esos elementos un selector 鈥name鈥 tomar谩 el texto del elemento a dentro de un elemento h2 y un selector 鈥path鈥 tomar谩 el valor del atributo href del elemento a dentro de un elemento h2. En otras palabras, 鈥name鈥 tomar谩 el nombre del paquete Go y 鈥path鈥 la ruta del paquete :)

{
    "method": "GET",
    "url":    "https://pkg.go.dev/search?q=xpath",
    "timeout": 10000,
    "selectors": {
        "packages": {
            "expr": "div.SearchSnippet",
            "all": true,
            "type": "css",
            "selectors": {
                "name": "//h2/a/text()",
                "path": "//h2/a/@href"
            }
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
  • method: especifica el m茅todo HTTP (GET, POST, PUT, ...).
  • url: URL de la solicitud.
  • timeout: l铆mite de tiempo en milisegundos para la solicitud HTTP.
  • selectors: selectores.
    • 鈥減ackages鈥: es el nombre del selector.
      • expr: expresi贸n del selector.
      • all: especifica que se deben encontrar todos los elementos que coincidan con la expresi贸n.
      • type: el tipo de expresi贸n, en este caso un selector CSS.
      • selectors: selectores anidados.
        • 鈥渘ame鈥 y 鈥減ath鈥 son los nombre de los selectores y sus valores son expresiones, en este caso expresiones XPath.

C贸digo en Go

Estamos listos para crear un archivo scraper.go, importar los paquetes necesarios y definir la funci贸n main:

package main

import (
    "encoding/json"
    "fmt"

    "github.com/gonzxlez/colibri"
    "github.com/gonzxlez/colibri/webextractor"
)

var rawRules = `{
    "method": "GET",
    "url":    "https://pkg.go.dev/search?q=xpath",
    "timeout": 10000,
    "selectors": {
        "packages": {
            "expr": "div.SearchSnippet",
            "all": true,
            "type": "css",
            "selectors": {
                "name": "//h2/a/text()",
                "path": "//h2/a/@href"
            }
        }
    }
}`

func main() {
    we, err := webextractor.New()
    if err != nil {
        panic(err)
    }

    var rules colibri.Rules
    err = json.Unmarshal([]byte(rawRules), &rules)
    if err != nil {
        panic(err)
    }

    output, err := we.Extract(&rules)
    if err != nil {
        panic(err)
    }

    fmt.Println("URL:", output.Response.URL())
    fmt.Println("Status code:", output.Response.StatusCode())
    fmt.Println("Content-Type", output.Response.Header().Get("Content-Type"))
    fmt.Println("Data:", output.Data)
}
Enter fullscreen mode Exit fullscreen mode

馃挕 WebExtractor son interfaces predeterminadas para Colibri listas para comenzar a rastrear o extraer datos en la web.

Usando la funci贸n New de webextractor, generamos una estructura Colibri con lo necesario para comenzar a extraer datos.

Luego convertimos nuestras reglas en JSON a una estructura Rules y llamamos al m茅todo Extract enviando como argumento las reglas.

Obtenemos la salida y se imprimen en pantalla la URL de la respuesta HTTP, el c贸digo de estado HTTP, el tipo de contenido de la respuesta y los datos extra铆dos con los selectores. Consulte la documentaci贸n de la estructura Output.

Ejecutamos el siguiente comando:

go mod tidy
Enter fullscreen mode Exit fullscreen mode

馃挕 El comando go mod tidy se asegura de que las dependencias en el go.mod coinciden con el c贸digo fuente del m贸dulo.

Finalmente compilamos y ejecutamos nuestro c贸digo en Go con el comando:

go run scraper.go
Enter fullscreen mode Exit fullscreen mode

Conclusi贸n

En este post, hemos aprendido c贸mo realizar Web Scraping en Go utilizando el paquete Colibri, definiendo reglas de extracci贸n con selectores CSS y XPath. Colibri emerge como una herramienta para aquellos que buscan automatizar la recopilaci贸n de datos web en Go. Su enfoque basado en reglas y su facilidad de uso la convierten en una opci贸n atractiva para desarrolladores de todos los niveles de experiencia.

En definitiva, el Web Scraping en Go es una t茅cnica poderosa y vers谩til que puede utilizarse para extraer informaci贸n de una amplia gama de sitios web. Es importante destacar que el Web Scraping debe realizarse de manera 茅tica, respetando los t茅rminos y condiciones de los sitios web y evitando sobrecargar sus servidores.

Top comments (0)