基于Go 1.19的站点模板爬虫案例的详细实现:
go
package main
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"strings"
)
func main() {
// 目标站点URL
targetURL := "https://example.com"
// 创建保存页面内容的目录
pageDir := "pages"
if err := os.MkdirAll(pageDir, 0755); err != nil {
fmt.Println("创建目录失败:", err)
return
}
// 爬取页面
crawlPages(targetURL, pageDir)
}
func crawlPages(url, dir string) {
// 发送HTTP请求
resp, err := http.Get(url)
if err != nil {
fmt.Println("请求页面失败:", err)
return
}
defer resp.Body.Close()
// 获取页面内容
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取页面内容失败:", err)
return
}
// 构建页面文件路径
filePath := filepath.Join(dir, getFileName(url))
// 保存页面内容到文件
if err := os.WriteFile(filePath, body, 0644); err != nil {
fmt.Println("保存页面失败:", err)
return
}
fmt.Println("保存页面成功:", filePath)
// 解析页面中的链接
links := parseLinks(string(body))
// 递归爬取链接页面
for _, link := range links {
crawlPages(link, dir)
}
}
func getFileName(url string) string {
// 从URL中提取文件名
fileName := filepath.Base(url)
if fileName == "/" {
fileName = "index.html"
} else if !strings.HasSuffix(fileName, ".html") {
fileName += ".html"
}
return fileName
}
func parseLinks(html string) []string {
var links []string
// 使用字符串操作解析HTML中的链接
for _, line := range strings.Split(html, "\n") {
if strings.Contains(line, "<a href=") {
start := strings.Index(line, "<a href=") + len("<a href=")
end := strings.Index(line, ">")
link := line[start:end]
link = strings.Trim(link, "\"")
links = append(links, link)
}
}
return links
}
Open in:Code Editor
这个爬虫程序会从指定的目标站点URL开始,递归地爬取页面并保存到本地目录中。主要步骤如下:
- 创建用于保存页面内容的目录。
- 调用
crawlPages()
函数开始爬取页面。 - 在
crawlPages()
函数中:- 发送HTTP请求获取页面内容。
- 根据URL构建页面文件路径,并将页面内容保存到本地文件。
- 解析页面中的链接,并递归地爬取这些链接。
getFileName()
函数用于从URL中提取文件名。parseLinks()
函数用于解析HTML页面中的链接。
这个爬虫程序使用Go 1.19的标准库实现,不需要依赖任何第三方库。它可以用于爬取静态站点,并将页面内容保存到本地,以供后续处理或分析使用。