CAPSOLVER
博客
如何使用 geziyor 进行网页抓取

如何使用 geziyor 进行网页抓取

Logo of CapSolver

Anh Tuan

Data Science Expert

27-Sep-2024

Geziyor:一个功能强大的 Go Web 爬取框架

Geziyor 是一个现代的 Go Web 爬取框架,旨在提供强大的工具,以便高效地抓取网站和提取数据。与许多传统的爬取库不同,Geziyor 强调易用性,同时提供高度可定制的爬取工作流程。

主要功能:

  • 并发支持: 支持异步操作,允许您同时抓取多个页面,从而提高性能。
  • 请求定制: 轻松修改 HTTP 请求,包括标头、cookie 和自定义参数。
  • 自动节流: 通过调整服务器的请求速度来帮助避免触发反爬取机制。
  • 内置缓存和持久化: 支持缓存抓取的数据和响应,以避免冗余请求。
  • 可扩展性: 提供挂钩来扩展功能或处理事件,例如请求/响应拦截、自定义中间件等。
  • 支持代理: 轻松集成代理以轮换 IP 或绕过限制。

先决条件

要使用 Geziyor,请确保您已安装:

安装

要安装 Geziyor,您可以运行:

bash 复制代码
go get -u github.com/geziyor/geziyor

基本示例:使用 Geziyor 进行 Web 爬取

以下是一个简单的示例,用于抓取网站并打印文章的标题:

go 复制代码
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()
}

高级示例:使用自定义标头和 POST 请求进行爬取

有时,您需要模拟与服务器的更复杂交互,例如登录或与动态网站交互。在本示例中,我们将展示如何发送自定义标头和 POST 请求。

go 复制代码
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()
}

您可能需要在爬取过程中管理 cookie 或维护会话。Geziyor 通过自动处理每个请求的 cookie 来简化 cookie 管理,您也可以在需要时自定义 cookie 处理过程。

go 复制代码
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()
}

使用 Geziyor 的代理

为了在避免 IP 限制或封锁的情况下抓取网站,您可以将请求通过代理路由。以下是如何使用 Geziyor 配置代理支持:

go 复制代码
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()
}

使用 Geziyor 处理验证码

虽然 Geziyor 本身不解决验证码,但您可以将其与验证码求解服务(如 CapSolver)集成。以下是如何将 CapSolver 与 Geziyor 一起使用来解决验证码。

示例:使用 Geziyor 和 CapSolver 解决 ReCaptcha V2

首先,您需要集成 CapSolver 并处理验证码挑战请求。

go 复制代码
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()
}

使用 Geziyor 进行性能优化

Geziyor 在处理大量爬取任务方面表现出色,但可以通过调整某些选项来进一步优化性能:

  • 并发性: 增加 ConcurrentRequests 以允许多个并行请求。
  • 请求延迟: 在请求之间实现延迟以避免检测。

带有并发性和延迟的示例:

go 复制代码
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()
}

附加代码

CapSolver 获取顶级验证码解决方案的奖励代码scrape。兑换后,每次充值后将获得额外的 5% 奖励,无限次。

结论

Geziyor 是一个功能强大、快速且灵活的 Go Web 爬取框架,对于希望构建可扩展的爬取系统的开发人员来说,它是最佳选择。它内置的并发支持、可定制的请求以及与 CapSolver 等外部服务集成的能力,使其成为简单和高级爬取任务的理想工具。

无论您是从博客、电子商务网站收集数据,还是构建自定义爬取管道,Geziyor 都拥有您快速高效地入门所需的功能。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多