CAPSOLVER
Blog
Cómo usar geziyor para raspar la web

Cómo usar geziyor para raspar la web

Logo of CapSolver

Anh Tuan

Data Science Expert

27-Sep-2024

Geziyor: Un potente marco de raspado web para Go

Geziyor es un marco moderno de raspado web para Go, diseñado para ofrecer herramientas poderosas para raspar sitios web y extraer datos de manera eficiente. A diferencia de muchas bibliotecas de raspado tradicionales, Geziyor enfatiza la facilidad de uso al tiempo que proporciona flujos de trabajo de raspado altamente personalizables.

Características clave:

  • Soporte de concurrencia: Admite operaciones asíncronas, lo que le permite raspar varias páginas de forma concurrente, lo que aumenta el rendimiento.
  • Personalización de solicitudes: Modifique fácilmente las solicitudes HTTP, incluidos los encabezados, las cookies y los parámetros personalizados.
  • Aceleración automática: Ayuda a evitar activar los mecanismos antirraspado al espaciar las solicitudes a los servidores.
  • Almacenamiento en caché y persistencia integrados: Admite el almacenamiento en caché de los datos y las respuestas raspados para evitar solicitudes redundantes.
  • Extensibilidad: Ofrece ganchos para ampliar la funcionalidad o manejar eventos como la interceptación de solicitudes/respuestas, middleware personalizado y más.
  • Admite servidores proxy: Integre fácilmente servidores proxy para rotar direcciones IP o eludir restricciones.

Prerrequisitos

Para usar Geziyor, asegúrese de tener:

Instalación

Para instalar Geziyor, puede ejecutar:

bash Copy
go get -u github.com/geziyor/geziyor

Ejemplo básico: raspado web con Geziyor

Aquí hay un ejemplo simple para raspar un sitio web e imprimir los títulos de los artículos:

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs: []string{"https://news.ycombinator.com"},
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            r.HTMLDoc.Find(".storylink").Each(func(i int, s *goquery.Selection) {
                log.Println(s.Text())
            })
        },
    }).Start()
}

Ejemplo avanzado: raspado con encabezados personalizados y solicitudes POST

A veces, necesita simular una interacción más compleja con el servidor, como iniciar sesión o interactuar con sitios web dinámicos. En este ejemplo, mostraremos cómo enviar un encabezado personalizado y una solicitud POST.

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                Method: "POST",
                URL:    "https://httpbin.org/post",
                Body:   []byte(`{"username": "test", "password": "123"}`),
                Headers: map[string]string{
                    "Content-Type": "application/json",
                },
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println(string(r.Body))
        },
    }).Start()
}

Manejo de cookies y sesiones en Geziyor

Es posible que deba administrar cookies o mantener sesiones durante el raspado. Geziyor simplifica la administración de cookies al manejar automáticamente las cookies para cada solicitud, y también puede personalizar el proceso de manejo de cookies si es necesario.

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                URL: "https://httpbin.org/cookies/set?name=value",
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println("Cookies:", r.Cookies())
        },
    }).Start()
}

Uso de servidores proxy con Geziyor

Para raspar un sitio web evitando restricciones o bloqueos de IP, puede enrutar sus solicitudes a través de un servidor proxy. Aquí se explica cómo configurar el soporte de proxy con Geziyor:

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.Do(&client.Request{
                URL:    "https://httpbin.org/ip",
                Proxy:  "http://username:password@proxyserver:8080",
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println(string(r.Body))
        },
    }).Start()
}

Manejo de captchas con Geziyor

Si bien Geziyor no resuelve captchas de forma nativa, puede integrarlo con un servicio de resolución de captchas como CapSolver. Así es como puede usar CapSolver para resolver captchas junto con Geziyor.

Ejemplo: Resolviendo ReCaptcha V2 usando Geziyor y CapSolver

Primero, necesita integrar CapSolver y manejar las solicitudes de desafíos de captcha.

go Copy
package main

import (
    "encoding/json"
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
    "log"
    "time"
)

const CAPSOLVER_KEY = "YourKey"

func createTask(url, key string) (string, error) {
    payload := map[string]interface{}{
        "clientKey": CAPSOLVER_KEY,
        "task": map[string]interface{}{
            "type":        "ReCaptchaV2TaskProxyLess",
            "websiteURL":  url,
            "websiteKey":  key,
        },
    }

    response, err := client.NewRequest().
        Method("POST").
        URL("https://api.capsolver.com/createTask").
        JSON(payload).
        Do()

    if err != nil {
        return "", err
    }

    var result map[string]interface{}
    json.Unmarshal(response.Body, &result)
    return result["taskId"].(string), nil
}

func getTaskResult(taskId string) (string, error) {
    payload := map[string]interface{}{
        "clientKey": CAPSOLVER_KEY,
        "taskId":    taskId,
    }

    for {
        response, err := client.NewRequest().
            Method("POST").
            URL("https://api.capsolver.com/getTaskResult").
            JSON(payload).
            Do()

        if err != nil {
            return "", err
        }

        var result map[string]interface{}
        json.Unmarshal(response.Body, &result)

        if result["status"] == "ready" {
            return result["solution"].(string), nil
        }

        time.Sleep(5 * time.Second)
    }
}

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            taskId, _ := createTask("https://example.com", "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf")
            solution, _ := getTaskResult(taskId)

            g.Do(&client.Request{
                Method: "POST",
                URL:    "https://example.com/submit",
                Body:   []byte(`g-recaptcha-response=` + solution),
            })
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            log.Println("Captcha Solved:", string(r.Body))
        },
    }).Start()
}

Optimizaciones de rendimiento con Geziyor

Geziyor sobresale en el manejo de tareas de raspado de alto volumen, pero el rendimiento se puede optimizar aún más ajustando ciertas opciones:

  • Concurrencia: Aumente ConcurrentRequests para permitir varias solicitudes paralelas.
  • Retraso de la solicitud: Implemente un retraso entre las solicitudes para evitar la detección.

Ejemplo con concurrencia y retraso:

go Copy
package main

import (
    "github.com/geziyor/geziyor"
    "github.com/geziyor/geziyor/client"
)

func main() {
    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs:          []string{"https://example.com"},
        ParseFunc:          func(g *geziyor.Geziyor, r *client.Response) {},
        ConcurrentRequests: 10,
        RequestDelay:       2,
    }).Start()
}

Código de bonificación

Reclame su código de bonificación para las mejores soluciones de captcha en CapSolver: scrape. Después de canjearlo, obtendrá un bono adicional del 5% después de cada recarga, ilimitadas veces.

Conclusión

Geziyor es un marco de raspado web potente, rápido y flexible para Go, lo que lo convierte en una excelente opción para los desarrolladores que buscan crear sistemas de raspado escalables. Su soporte integrado para concurrencia, solicitudes personalizables y la capacidad de integrarse con servicios externos como CapSolver lo convierten en una herramienta ideal para tareas de raspado simples y avanzadas.

Ya sea que esté recopilando datos de blogs, sitios de comercio electrónico o creando canalizaciones de raspado personalizadas, Geziyor tiene las funciones que necesita para comenzar rápidamente y de manera eficiente.

Aviso de Cumplimiento: La información proporcionada en este blog es solo para fines informativos. CapSolver se compromete a cumplir con todas las leyes y regulaciones aplicables. El uso de la red de CapSolver para actividades ilegales, fraudulentas o abusivas está estrictamente prohibido y será investigado. Nuestras soluciones para la resolución de captcha mejoran la experiencia del usuario mientras garantizan un 100% de cumplimiento al ayudar a resolver las dificultades de captcha durante el rastreo de datos públicos. Fomentamos el uso responsable de nuestros servicios. Para obtener más información, visite nuestros Términos de Servicio y Política de Privacidad.

Máse