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

目录

1. 定义目标站点

2. 使用Go的库

3. 发送HTTP请求

4. 解析HTML并提取数据

5. 存储数据

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

go get github.com/PuerkitoBio/goquery

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

//  爬取指定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渲染的页面等复杂情况。

相关推荐

  1. 基于Go 1.19站点模板爬虫

    2024-07-10 07:40:07       6 阅读
  2. 基于go 1.19站点模板爬虫

    2024-07-10 07:40:07       5 阅读
  3. 基于Go1.19站点模板爬虫详细介绍

    2024-07-10 07:40:07       4 阅读
  4. 基于Go1.19站点模板爬虫

    2024-07-10 07:40:07       4 阅读
  5. Go1.19 爬虫框架:简化站点模板自动化抓取

    2024-07-10 07:40:07       4 阅读

最近更新

  1. 【MyBatis】Mybatis中的动态SQL——bind标签

    2024-07-10 07:40:07       0 阅读
  2. GreenDao实现原理

    2024-07-10 07:40:07       0 阅读
  3. 分布式缓存设计:深入理解 Memcached 架构

    2024-07-10 07:40:07       0 阅读
  4. 项目相关方不配合,项目经理怎么办?

    2024-07-10 07:40:07       0 阅读
  5. oneos虚拟文件系统vfs源码分析

    2024-07-10 07:40:07       0 阅读
  6. 富格林:正规手段识破欺诈套路

    2024-07-10 07:40:07       0 阅读
  7. Redis生产问题

    2024-07-10 07:40:07       0 阅读
  8. Makefile: 解决.c文件依赖.h文件的问题

    2024-07-10 07:40:07       0 阅读
  9. chrome总是打开hao123

    2024-07-10 07:40:07       0 阅读

热门阅读

  1. Perl 语言入门学习

    2024-07-10 07:40:07       6 阅读
  2. perl语言入门学习

    2024-07-10 07:40:07       7 阅读
  3. Apache Spark 的基本概念和在大数据分析中的应用

    2024-07-10 07:40:07       6 阅读
  4. CSS 下拉菜单的设计与实现

    2024-07-10 07:40:07       5 阅读
  5. 快速排序算法Python实现

    2024-07-10 07:40:07       5 阅读
  6. python爬虫入门(二)之Requests库

    2024-07-10 07:40:07       4 阅读
  7. RTK_ROS_导航(4):ROS中空地图的生成与加载

    2024-07-10 07:40:07       7 阅读
  8. PCL + Qt + Ribbon 风格(窗口自由组合) demo展示

    2024-07-10 07:40:07       13 阅读
  9. Android Studio Download Gradle 时慢问题解决

    2024-07-10 07:40:07       5 阅读
  10. ASPICE是汽车软件开发中的质量保证流程

    2024-07-10 07:40:07       6 阅读