以下是基于 Go 1.19 的站点模板爬虫的详细实现教程。
一、环境准备
-
安装 Go 1.19
- 从 Go 官网 下载并安装 Go 1.19。
- 配置环境变量,确保
go
命令可以在命令行中使用。
-
创建工作目录
bash复制代码
mkdir go-web-scraper cd go-web-scraper
二、项目结构
在项目目录下,创建以下文件结构:
go
复制代码
go-web-scraper/ ├── go.mod ├── go.sum └── main.go
三、初始化 Go 模块
在项目目录下运行以下命令以初始化 Go 模块:
bash
复制代码
go mod init go-web-scraper
四、安装依赖
我们将使用 colly
库作为爬虫框架。运行以下命令安装:
bash
复制代码
go get -u github.com/gocolly/colly/v2
五、编写爬虫代码
打开 main.go
,并添加以下代码:
go
复制代码
package main import ( "fmt" "log" "github.com/gocolly/colly/v2" ) func main() { // 创建一个新的爬虫实例 c := colly.NewCollector() // 设置请求前的回调 c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL) }) // 设置元素的回调 c.OnHTML("a[href]", func(e *colly.HTMLElement) { link := e.Attr("href") fmt.Println("Found link:", link) // 可以选择只抓取特定域名的链接 if e.Request.AbsoluteURL(link) != "" { e.Request.Visit(link) } }) // 设置结束后的回调 c.OnScraped(func(r *colly.Response) { fmt.Println("Finished scraping", r.Request.URL) }) // 启动爬虫,爬取指定网站 err := c.Visit("https://example.com") if err != nil { log.Fatal(err) } }
六、运行爬虫
在命令行中,运行以下命令启动爬虫:
bash
复制代码
go run main.go
七、功能扩展
-
抓取数据并保存:
- 可以将抓取的数据保存到数据库或文件中。修改
OnHTML
回调以提取更多信息并存储。
- 可以将抓取的数据保存到数据库或文件中。修改
-
处理分页:
- 如果网站有分页,利用
e.Request.Visit()
方法递归访问所有页。
- 如果网站有分页,利用
-
设置爬虫延迟:
- 为了避免对目标网站造成压力,可以设置请求延迟:
复制代码
c.Limit(&colly.LimitRule{ DomainGlob: "*", Parallelism: 2, Delay: 1 * time.Second, })
-
错误处理:
- 在
OnError
回调中处理请求错误。
- 在
八、总结
通过以上步骤,你可以创建一个简单的 Go 爬虫,抓取网页链接并输出。在此基础上,你可以根据需求扩展功能,比如抓取特定数据、处理表单提交等。
如果你对某些部分有更深入的疑问或需要更复杂的示例,随时可以询问!