CAPSOLVER
博客
使用 Go Colly 更改用户代理以进行网页抓取

使用 Go Colly 更改用户代理以进行网络抓取

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

27-Sep-2024

在进行网络爬取项目时,更改 User-Agent 字符串是防止爬虫被阻止或被标记为机器人的最有效方法之一。 Web 服务器通常使用 User-Agent 字符串来识别访问其资源的客户端类型(例如浏览器、机器人或爬虫)。 如果您的爬虫在每次请求中发送相同的 User-Agent,则您有被检测到并可能被阻止的风险。 在本文中,我们将探讨如何在 Go Colly(Go 中流行的网络爬取框架)中更改 User-Agent,以使您的爬取工作更有效和更具弹性。

什么是 Colly?

Colly 是一个快速而优雅的 Gophers 爬取框架。Colly 提供了一个干净的界面来编写任何类型的爬虫/抓取器/蜘蛛。使用 Colly,您可以轻松地从网站中提取结构化数据,这些数据可用于广泛的应用程序,如数据挖掘、数据处理或存档。

什么是 Colly User Agent?

User Agent 是请求标头中的一种特殊字符串,允许服务器识别客户端的操作系统和版本、浏览器类型和版本以及其他详细信息。

对于普通浏览器,User Agent 字符串如下所示:

  1. Windows 操作系统上的 Google Chrome 版本 128:

    复制代码
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
  2. Firefox:

    复制代码
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0

但是,在 Colly(一个网络爬取框架)中,默认的 User Agent 为:

复制代码
colly - https://github.com/gocolly/colly

在数据抓取的背景下,最常见的反抓取措施之一是通过检查 User Agent 来确定请求是否来自普通浏览器。 这有助于识别机器人。

Colly 的默认 User Agent 显然等同于直接告诉目标网站:“我是一个机器人。” 这使得网站很容易检测到并可能阻止使用其默认设置的 Colly 进行的抓取尝试。

奖励代码

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

为什么更改 User-Agent?

在深入研究代码之前,让我们快速了解一下为什么更改 User-Agent 至关重要:

  1. 避免检测: 许多网站使用反机器人机制来分析传入的 User-Agent 字符串,以检测可疑或重复的模式。 如果您的爬虫在每个请求中发送相同的 User-Agent,它将成为检测的容易目标。
  2. 模仿真实浏览器: 通过更改 User-Agent 字符串,您的爬虫可以模仿 Chrome、Firefox 或 Safari 等真实浏览器,从而降低被标记为机器人的可能性。
  3. 增强用户体验并解决 CAPTCHA: 许多网站使用 CAPTCHA 挑战来验证用户不是机器人,以确保更安全的浏览体验。 但是,对于自动化任务,这些挑战会中断工作流程。 如果您的爬虫遇到此类 CAPTCHA 挑战,您可以集成 CapSolver 等工具来自动解决它们,从而使您的自动化能够在没有中断的情况下顺利继续。

如何在 Colly 中设置自定义 User Agent

当然可以!我会将文本翻译成英文并适当地格式化它。以下是翻译和格式化的版本:

在 Colly 中处理 User Agent

我们可以通过访问 https://httpbin.org/user-agent 来检查 User Agent 的值。Colly 主要提供三种方法来处理请求:

  • Visit: 访问目标网站
  • OnResponse: 处理响应内容
  • OnError: 处理请求错误

以下是一个完整的代码示例,用于访问 httpbin 并打印 User Agent:

go 复制代码
package main

import (
    "github.com/gocolly/colly"
    "log"
)

func main() {
    // 创建一个新的收集器
    c := colly.NewCollector()

    // 调用 onResponse 回调并打印 HTML 内容
    c.OnResponse(func(r *colly.Response) {
       log.Println(string(r.Body))
    })

    // 处理请求错误
    c.OnError(func(e *colly.Response, err error) {
       log.Println("请求失败,err:", err)
    })

    // 开始抓取
    err := c.Visit("https://httpbin.org/user-agent")
    if err != nil {
       log.Fatal(err)
    }
}

这将输出:

json 复制代码
{
  "user-agent": "colly - https://github.com/gocolly/colly"
}

自定义 User Agent

Colly 提供了 colly.UserAgent 方法来自定义 User Agent。 如果您想为每个请求使用不同的 User Agent,您可以定义一个 User Agent 列表并从中随机选择。 以下是一个示例:

go 复制代码
package main

import (
    "github.com/gocolly/colly"
    "log"
    "math/rand"
)

var userAgents = []string{
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 OPR/113.0.0.0",
}

func main() {
    // 创建一个新的收集器
    c := colly.NewCollector(
       // 设置 user agent
       colly.UserAgent(userAgents[rand.Intn(len(userAgents))]),
    )

    // 调用 onResponse 回调并打印 HTML 内容
    c.OnResponse(func(r *colly.Response) {
       log.Println(string(r.Body))
    })

    // 处理请求错误
    c.OnError(func(e *colly.Response, err error) {
       log.Println("请求失败,err:", err)
    })

    // 开始抓取
    err := c.Visit("https://httpbin.org/user-agent")
    if err != nil {
       log.Fatal(err)
    }
}

使用 fake-useragent 库

与其维护自定义 User Agent 列表,我们可以使用 fake-useragent 库来生成随机 User Agent。 以下是一个示例:

go 复制代码
package main

import (
    browser "github.com/EDDYCJY/fake-useragent"
    "github.com/gocolly/colly"
    "log"
)

func main() {
    // 创建一个新的收集器
    c := colly.NewCollector(
       // 设置 user agent
       colly.UserAgent(browser.Random()),
    )

    // 调用 onResponse 回调并打印 HTML 内容
    c.OnResponse(func(r *colly.Response) {
       log.Println(string(r.Body))
    })

    // 处理请求错误
    c.OnError(func(e *colly.Response, err error) {
       log.Println("请求失败,err:", err)
    })

    // 开始抓取
    err := c.Visit("https://httpbin.org/user-agent")
    if err != nil {
       log.Fatal(err)
    }
}

集成 CapSolver

虽然在 Colly 中随机化 User Agent 有助于在一定程度上避免被识别为机器人,但这可能不足以应对更复杂的防机器人挑战。 此类挑战的示例包括 reCAPTCHA、Cloudflare Turnstile 等。 这些系统会检查您的请求标头的有效性,验证您的浏览器指纹,评估您的 IP 风险,并且可能需要复杂的 JS 加密参数或困难的图像识别任务。

这些挑战会严重阻碍您的数据抓取工作。 但是,不用担心 - CapSolver 可以处理所有上述机器人挑战。 CapSolver 使用基于 AI 的自动网页解锁技术来自动解决验证码。 所有复杂的任务都可以在几秒钟内成功解决。

官方网站提供多种语言的 SDK,使其易于集成到您的项目中。 您可以参考 CapSolver 文档 了解如何在您的抓取项目中实施此解决方案。

当然可以!以下是有关在 Go Colly 中更改 User Agent 的文章的结论:

结论

在 Go Colly 中更改 User-Agent 是有效和弹性网络抓取的关键技术。 通过实现自定义 User Agent,您可以显着降低您的爬虫被目标网站检测和阻止的风险。 以下是我们已经涵盖的关键要点摘要:

  1. 我们已经了解了为什么更改 User-Agent 对网络抓取项目很重要。

  2. 我们已经探索了在 Colly 中设置自定义 User Agent 的不同方法,包括:

    • 使用预定义的 User Agent 列表
    • 从此列表中实现随机选择
    • 利用 fake-useragent 库获得更多多样化选项
  3. 我们已经讨论了这些技术如何帮助模仿真实浏览器的行为并避免检测。

  4. 对于更高级的防机器人挑战,我们介绍了使用 CapSolver 等专用工具来处理 CAPTCHA 和其他复杂验证系统的概念。

请记住,虽然更改 User Agent 是一种有效的策略,但它只是负责任和有效网络抓取的一部分。 始终尊重网站的服务条款和 robots.txt 文件,实施速率限制,并考虑您的抓取活动的道德影响。

通过将这些技术与网络抓取的其他最佳实践相结合,您可以使用 Go Colly 创建更强大和可靠的抓取器。 随着网络技术的不断发展,掌握最新的抓取技术和工具将是保持网络抓取项目有效性的关键。

关于合规性的说明

重要: 在进行网络抓取时,遵守法律和道德准则至关重要。 始终确保您有权抓取目标网站,并尊重网站的 robots.txt 文件和服务条款。 CapSolver 强烈反对将我们的服务误用于任何不合规的活动。 未经授权使用自动化工具绕过验证码可能会导致法律后果。 确保您的抓取活动符合所有适用的法律法规,以避免潜在的问题。

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

更多