如何使用 geziyor 进行网页抓取

Anh Tuan
Data Science Expert
27-Sep-2024
Geziyor:一个功能强大的 Go Web 爬取框架
Geziyor 是一个现代的 Go Web 爬取框架,旨在提供强大的工具,以便高效地抓取网站和提取数据。与许多传统的爬取库不同,Geziyor 强调易用性,同时提供高度可定制的爬取工作流程。
主要功能:
- 并发支持: 支持异步操作,允许您同时抓取多个页面,从而提高性能。
- 请求定制: 轻松修改 HTTP 请求,包括标头、cookie 和自定义参数。
- 自动节流: 通过调整服务器的请求速度来帮助避免触发反爬取机制。
- 内置缓存和持久化: 支持缓存抓取的数据和响应,以避免冗余请求。
- 可扩展性: 提供挂钩来扩展功能或处理事件,例如请求/响应拦截、自定义中间件等。
- 支持代理: 轻松集成代理以轮换 IP 或绕过限制。
先决条件
要使用 Geziyor,请确保您已安装:
- 从 官方 Go 网站 安装 Go 1.12+。
- Go 语言基础知识。
安装
要安装 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()
}
在 Geziyor 中处理 cookie 和会话
您可能需要在爬取过程中管理 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% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

解决CAPTCHA 2026的最佳扩展是什么?
在日新月异的在线安全领域,CAPTCHA 挑战已成为互联网用户常见的障碍...

Nikolai Smirnov
12-Dec-2025

Lumiproxy:优质代理用于网络爬虫与数据收集
在本文中,我们将向您展示什么是Lumiproxy以及他们提供的服务。

Anh Tuan
12-Dec-2025

Genlogin:革新您的网页自动化体验
在本文中,我们将向您展示什么是Genlogin以及他们所提供的服务。

Lucas Mitchell
12-Dec-2025

Proxys.io:适用于任何任务的独立代理
在本文中,我们将向您介绍 Proxys.io 以及他们提供的服务。

Anh Tuan
12-Dec-2025

Tabproxy:高性价比海外住宅代理
在本文中,我们将向您展示什么是Tabproxy以及他们提供的服务。

Aloísio Vítor
12-Dec-2025

IP2World 住宅代理:领先的全球IP代理解决方案
在本文中,我们将向您展示什么是IP2World以及他们提供的服务。

Ethan Collins
12-Dec-2025

