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

引言

在网络爬虫的世界里,Web 服务器通常借助 User-Agent 字符串来识别访问其资源的客户端类型,如浏览器、机器人或爬虫。若爬虫在每次请求中都发送相同的 User-Agent,就极有可能被检测到并被阻止。因此,更改 User-Agent 字符串成为了防止爬虫被阻止或被标记为机器人的有效手段之一。本文将聚焦于在 Go Colly(Go 语言中一款流行的网络爬取框架)中更改 User-Agent 的方法,旨在让您的爬取工作更加高效和稳定。

1. 什么是 Colly?

1.1 Colly 是一款为 Gophers 打造的快速且优雅的爬取框架。它提供了简洁的接口,方便开发者编写各种类型的爬虫、抓取器或蜘蛛。借助 Colly,开发者能够轻松地从网站中提取结构化数据,这些数据可广泛应用于数据挖掘、数据处理或存档等领域。

2. 什么是 Colly User Agent?

2.1 User Agent 是请求标头中的特殊字符串,服务器可通过它识别客户端的操作系统和版本、浏览器类型和版本等详细信息。

2.2 对于普通浏览器,常见的 User Agent 字符串示例如下:

  • 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

  • Firefox:

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

2.3 然而,在 Colly 这个网络爬取框架中,默认的 User Agent 为:

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

2.4 在数据抓取场景下,网站常通过检查 User Agent 来判断请求是否来自普通浏览器,以此识别机器人。Colly 的默认 User Agent 就像直接向目标网站宣告"我是一个机器人",这使得网站很容易检测并阻止使用默认设置的 Colly 进行的抓取尝试。

3. 为什么更改 User-Agent?

3.1 避免检测:许多网站采用反机器人机制分析传入的 User-Agent 字符串,以检测可疑或重复模式。若爬虫每次请求都发送相同的 User-Agent,就极易被检测到。

3.2 模仿真实浏览器:通过更改 User-Agent 字符串,爬虫能够模仿 Chrome、Firefox 或 Safari 等真实浏览器,从而降低被标记为机器人的概率。

3.3 增强用户体验并解决 CAPTCHA:许多网站使用 CAPTCHA 挑战验证用户不是机器人,以确保更安全的浏览体验。但对于自动化任务,这些挑战会中断工作流程。若爬虫遇到此类 CAPTCHA 挑战,可集成相关工具自动解决,使自动化工作顺利进行。

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

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

  • Visit:访问目标网站

  • OnResponse:处理响应内容

  • OnError:处理请求错误

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

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

此代码将输出:

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

4.3 自定义 User Agent

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

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

4.4 使用 fake-useragent 库

我们也可以使用 fake-useragent 库来生成随机 User Agent,而无需维护自定义 User Agent 列表。以下是示例代码:

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

5. 关于验证码处理的说明

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

不过,有专门的工具可以处理这些验证码挑战。这些工具使用基于 AI 的自动网页解锁技术,能在几秒钟内成功解决复杂的验证码任务。同时,使用这些工具时需注意遵守相关法律法规和服务条款,确保抓取活动的合法性。

6. 结语

在 Go Colly 中更改 User-Agent 是实现高效、稳定网络抓取的关键技术。通过实现自定义 User Agent,可显著降低爬虫被目标网站检测和阻止的风险。本文主要涵盖了以下要点:

6.1 阐述了更改 User-Agent 对网络抓取项目的重要性。

6.2 探讨了在 Colly 中设置自定义 User Agent 的不同方法,包括使用预定义的 User Agent 列表、随机选择 User Agent 以及利用 fake-useragent 库。

6.3 说明了这些技术如何帮助模仿真实浏览器的行为,从而避免被检测。

6.4 提及了对于更高级的防机器人挑战,可使用专门工具处理验证码和其他复杂验证系统。

需要注意的是,更改 User Agent 只是负责任和有效网络抓取的一部分。在进行网络抓取时,务必尊重网站的服务条款和 robots.txt 文件,实施速率限制,并考虑抓取活动的道德影响。将这些技术与网络抓取的其他最佳实践相结合,才能使用 Go Colly 创建更强大、可靠的抓取器。随着网络技术的不断发展,掌握最新的抓取技术和工具是保持网络抓取项目有效性的关键。

7.关于合规性的说明

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

相关推荐
天渺工作室15 小时前
Chrome浏览器自带翻译的诡异Bug:ID翻译后竟然变化了
前端·chrome
pumpkin8451415 小时前
Docker 参考手册
chrome·docker·容器
私人珍藏库16 小时前
[Windows] Chrome_Win64_v142.0.7444.163 便携版
前端·chrome
HappRobot20 小时前
WebLogic服务器的JVM参数调整
服务器·jvm·chrome
Q688238861 天前
COMSOL 6.2激光熔覆和SLM增材制造仿真模型的优化与应用分析
chrome
守城小轩2 天前
基于Chrome140的X账号自动化(关键词浏览)——运行脚本(三)
自动化·rpa·浏览器自动化·playwright·浏览器开发
缘友一世2 天前
jupyter lab公开访问配置方法小记
chrome·jupyter
潇凝子潇2 天前
Linux 服务器实时监控Shell 脚本
linux·服务器·chrome
ClassOps2 天前
Chrome 插件记录
前端·chrome
蒋星熠2 天前
常见反爬策略与破解反爬方法:爬虫工程师的攻防实战指南
开发语言·人工智能·爬虫·python·网络安全·网络爬虫