如何在 Debian 上使用 Golang 搭建 Web 爬虫

山间有风
山间有风
发布时间:2026-08-23| 96人浏览过
原创

前言

想在 Debian 上快速搭一个可运行的 Go 爬虫,核心并不在“代码有多复杂”,而在于先把环境、项目结构和最小抓取流程跑通。下面按“安装环境、创建项目、完成首次请求、解析页面、再看扩展与规范”的顺序整理一遍,读完你可以判断自己当前更适合停在基础抓取,还是继续往并发和数据处理方向扩展。

想在 Debian 上快速搭一个可运行的 Go 爬虫,核心并不在“代码有多复杂”,而在于先把环境、项目结构和最小抓取流程跑通。下面按“安装环境、创建项目、完成首次请求、解析页面、再看扩展与规范”的顺序整理一遍,读完你可以判断自己当前更适合停在基础抓取,还是继续往并发和数据处理方向扩展。

在 Debian 上安装 Go 环境

第一步先确认系统里是否已经具备 Go 运行环境。如果还没安装,可以直接使用 Debian 的软件包完成部署:

sudo apt update
sudo apt install golang-go

安装完成后,再用下面的命令确认 Go 是否已经可用:

go version

如果命令能正常返回版本信息,说明基础运行环境已经准备好,可以继续创建爬虫项目。

创建项目并初始化 Go 模块

爬虫即使只是一个小脚本,也建议放进独立目录,并使用 Go Modules 管理依赖。这样后续引入解析库或拆分代码时会更清晰。

mkdir my-crawler
cd my-crawler
go mod init my-crawler

执行完以后,当前目录就是一个标准的 Go 项目。接下来只需要添加 main.go,就能开始写最小可运行的抓取逻辑。

先写一个最基础的 HTTP 抓取程序

对于入门场景,先不要急着上并发或复杂解析,先验证“能否成功请求网页并读出返回内容”。下面这段代码就是最小可运行示例,直接抓取指定 URL 的 HTML 内容:

展示 Debian 上从安装 Go 到运行首个抓取程序的最小上手流程信息图
Go 爬虫最小可运行链路先把环境、模块初始化和首次抓取跑通,再进入解析阶段。
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://example.com"
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println("Error fetching URL:", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }
    fmt.Println(string(body))
}

这段程序完成了几个关键动作:向目标地址发起 GET 请求、读取响应体、输出 HTML 字符串,并对请求失败和读取失败分别做了错误处理。对于初次搭建环境的人来说,只要这一步能跑通,后面的解析与存储基本就是在此基础上叠加能力。

运行程序并确认抓取结果

在项目目录里执行下面的命令:

go run main.go

如果程序正常工作,终端里会打印出目标页面的 HTML 内容。这一步的重点不是“输出是否好看”,而是确认整个链路已经打通:Go 环境可用、依赖正常、网络请求成功、响应体能够被读取。

一旦这里出现错误,排查顺序通常也很明确:先看 Go 是否安装成功,再看代码文件是否在当前目录,最后检查目标 URL 是否能访问。

用 goquery 解析 HTML 并提取链接

只拿到整页 HTML 往往还不够,实际爬虫通常需要从页面里提取结构化信息。这里可以引入 goquery,它的使用方式接近前端常见的 DOM 选择器,适合做初步页面解析。

展示 goquery 解析 HTML 时从响应体到链接提取的处理关系信息图
goquery 链接提取过程从响应体到 DOM,再到 a 标签和 href 属性,适合用关系图解释 goquery。

安装 goquery

go get github.com/PuerkitoBio/goquery

提取页面中所有 a 标签的 href

安装完成后,可以把 main.go 改成下面这样,直接遍历页面中的链接地址:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    url := "https://example.com"
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    doc.Find("a").Each(func(i int, s *goquery.Selection) {
        href, exists := s.Attr("href")
        if exists {
            fmt.Println(href)
        }
    })
}

这段代码与前面的基础版本相比,变化主要在两点:一是把响应体交给 goquery.NewDocumentFromReader 解析成文档对象;二是通过 doc.Find("a") 定位所有链接节点,再逐个输出 href 属性。

如果你的目标是采集文章链接、分页地址或导航入口,这种写法已经足够作为第一版原型。

从入门脚本到可用爬虫,还要补哪些能力

当基础抓取和 HTML 解析都能正常工作后,爬虫通常会继续往下面几个方向扩展:

展示 Go 爬虫从基础脚本扩展到并发、存储与合规控制的能力分层信息图
爬虫进阶能力与边界当单页抓取稳定后,扩展重点通常集中在效率、数据落地和访问规范三条线,不必一开始全部堆上。
  • 并发请求:利用 Go 的 goroutine 和 channel 同时抓取多个页面,可以明显提升吞吐效率。
  • 数据存储:把抓到的结果写入文件、数据库,或者先做清洗再进入后续处理流程。
  • 结构化抽取:除了链接,还可以提取标题、正文、时间、分页信息等具体字段。

这部分并不要求一开始就全部完成。更实际的做法是:先保证单页抓取稳定,再按业务需求逐项增加复杂度。这样出现问题时,也更容易判断是请求、解析还是存储环节出了偏差。

抓取前别忽略 robots.txt 和请求频率

技术上能抓,不代表就应该无节制地抓。正式运行前,至少要检查目标站点的 robots.txt,确认允许访问的范围;同时控制请求频率,避免对对方服务器造成不必要的压力。

这不仅是常见的爬虫礼仪,也是实际项目里减少封禁、限流和访问失败的重要前提。尤其在并发抓取场景下,请求速度一旦放开,很容易把原本可用的脚本变成高风险程序。

小结

在 Debian 上搭建一个 Golang 爬虫,起步流程可以压缩成几件事:安装 Go、初始化模块、完成一次 HTTP 请求、读取页面内容,再根据需求引入 goquery 做 HTML 解析。把这条基础链路跑通后,你再去增加并发、抽取规则和数据存储,整体会顺畅得多,也更容易定位问题。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。