基于Go1.19的站点模板爬虫

基于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开始,递归地爬取页面并保存到本地目录中。主要步骤如下:

  1. 创建用于保存页面内容的目录。
  2. 调用 crawlPages() 函数开始爬取页面。
  3. 在 crawlPages() 函数中:
    • 发送HTTP请求获取页面内容。
    • 根据URL构建页面文件路径,并将页面内容保存到本地文件。
    • 解析页面中的链接,并递归地爬取这些链接。
  4. getFileName() 函数用于从URL中提取文件名。
  5. parseLinks() 函数用于解析HTML页面中的链接。

这个爬虫程序使用Go 1.19的标准库实现,不需要依赖任何第三方库。它可以用于爬取静态站点,并将页面内容保存到本地,以供后续处理或分析使用。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值