【数据基础】— 基于Go1.19的站点模板爬虫的实现

目录

[1. 定义目标站点](#1. 定义目标站点)

[2. 使用Go的库](#2. 使用Go的库)

[3. 发送HTTP请求](#3. 发送HTTP请求)

[4. 解析HTML并提取数据](#4. 解析HTML并提取数据)

[5. 存储数据](#5. 存储数据)

[6. 并发处理](#6. 并发处理)

示例代码


基于Go 1.19的站点模板爬虫实现通常涉及几个关键步骤:定义目标站点、解析HTML页面、提取所需数据、存储数据以及可能的并发处理。下面我将详细描述这些步骤,并提供一个简化的示例代码。

1. 定义目标站点

首先,你需要明确你想要爬取的网站及其页面结构。这包括URL、页面中的元素(如类名、ID等),以及你希望提取的数据类型(如文本、链接、图片等)。

2. 使用Go的库

在Go中,net/http 包用于发送HTTP请求,golang.org/x/net/html(或者更常见的,第三方库如goquery,它基于golang.org/x/net/html但提供了更方便的jQuery风格的API)用于解析HTML。

3. 发送HTTP请求

使用net/http客户端发送GET请求到目标URL,并获取响应体。

4. 解析HTML并提取数据

使用goquery(或其他HTML解析库)来解析HTML内容,并使用CSS选择器定位并提取所需的数据。

5. 存储数据

将提取的数据存储到文件、数据库或内存中,具体取决于你的需求。

6. 并发处理

为了加速爬虫的速度,你可以使用Go的并发特性(goroutines和channels)来并行处理多个页面或任务。

示例代码

以下是一个简单的Go爬虫示例,使用goquery来爬取网页标题:

安装goquery

bash 复制代码
go get github.com/PuerkitoBio/goquery

爬取指定URL的网页,并提取其标题和所有链接:

Go 复制代码
//  爬取指定URL的网页,并提取其标题和所有链接
package main  
  
import (  
    "fmt"  
    "io/ioutil"  
    "log"  
    "net/http"  
    "strings"  
    "sync"  
  
    "github.com/PuerkitoBio/goquery"  
)  
  
// fetchHTML 发送HTTP GET请求并返回HTML内容  
func fetchHTML(url string) (string, error) {  
    resp, err := http.Get(url)  
    if err != nil {  
        return "", err  
    }  
    defer resp.Body.Close()  
  
    if resp.StatusCode != http.StatusOK {  
        return "", fmt.Errorf("HTTP error: %d", resp.StatusCode)  
    }  
  
    body, err := ioutil.ReadAll(resp.Body)  
    if err != nil {  
        return "", err  
    }  
  
    return string(body), nil  
}  
  
// parsePage 解析HTML页面并提取标题和链接  
func parsePage(html string) (string, []string, error) {  
    doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))  
    if err != nil {  
        return "", nil, err  
    }  
  
    title := doc.Find("title").Text()  
    links := []string{}  
    doc.Find("a").Each(func(i int, s *goquery.Selection) {  
        href, exists := s.Attr("href")  
        if exists {  
            links = append(links, href)  
        }  
    })  
  
    return title, links, nil  
}  
  
// crawlSite 爬取单个站点的函数  
func crawlSite(url string, wg *sync.WaitGroup) {  
    defer wg.Done()  
  
    html, err := fetchHTML(url)  
    if err != nil {  
        log.Printf("Error fetching URL %s: %v", url, err)  
        return  
    }  
  
    title, links, err := parsePage(html)  
    if err != nil {  
        log.Printf("Error parsing HTML for URL %s: %v", url, err)  
        return  
    }  
  
    fmt.Printf("Title: %s\n", title)  
    for _, link := range links {  
        fmt.Printf("  - Link: %s\n", link)  
    }  
}  
  
func main() {  
    var wg sync.WaitGroup  
  
    // 假设我们只想爬取一个站点  
    url := "http://example.com"  
    wg.Add(1)  
    go crawlSite(url, &wg)  
  
    wg.Wait() // 等待所有goroutine完成  
}  
  
// 注意:如果你想要爬取多个站点或页面,你可以在main函数中为每个站点或页面启动一个新的goroutine,  
// 并适当地调整wg.Add和wg.Wait的调用。

在这个示例中,fetchHTML 函数负责发送HTTP GET请求并返回HTML内容。parsePage 函数使用goquery库来解析HTML并提取标题和所有链接。crawlSite 函数是一个goroutine-safe的函数,用于爬取单个站点的数据。在main函数中,我们为要爬取的站点启动了一个goroutine,并等待它完成。

请注意,这个示例仅展示了如何爬取单个站点的数据。如果你想要爬取多个站点或页面,你可以修改main函数,为每个站点或页面启动一个新的goroutine,并适当管理sync.WaitGroup以确保主goroutine在所有爬取任务完成后才退出。

此外,还需要注意遵守目标网站的robots.txt规则,以及合理设置HTTP请求头(如User-Agent)以避免被网站封禁。在实际应用中,你可能还需要处理重定向、cookies、JavaScript渲染的页面等复杂情况。

相关推荐
明明跟你说过11 天前
【Go语言】从Google实验室走向全球的编程新星
开发语言·后端·go·go1.19
圣圣不爱学习16 天前
Go 1.19.4 HTTP编程-Day 20
go1.19
明明跟你说过19 天前
Go 语言函数编程指南:定义、调用技巧与返回值机制
开发语言·后端·golang·go·go1.19
漫天飞舞的雪花1 个月前
gRPC 双向流(Bidirectional Streaming RPC)的使用方法
网络·网络协议·rpc·go1.19
明明跟你说过2 个月前
【Go语言】语法基础之算术符详解
开发语言·后端·golang·go·go1.19
圣圣不爱学习3 个月前
Go 1.19.4 路径和目录-Day 15
go1.19
蒙娜丽宁3 个月前
Go语言错误处理详解
ios·golang·go·xcode·go1.19
@sinner5 个月前
Go语言实战:基于Go1.19的站点模板爬虫技术解析与应用
爬虫·网络爬虫·go1.19
xianyinsuifeng5 个月前
基于Go1.19的站点模板爬虫详细介绍
爬虫·go1.19
范范08255 个月前
Go 1.19 工具链升级:go命令与工具改进详解
linux·golang·go1.19