锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 基于Go 1.19的站点模板爬虫

基于Go 1.19的站点模板爬虫

0
  • 软件开发
  • 发布于 2024-09-27
  • 0 次阅读
黄健
黄健

基于Go 1.19的站点模板爬虫主要涉及创建HTTP连接、发送请求、解析HTML内容以及处理数据等步骤。下面我将详细介绍如何使用Go 1.19来编写一个简单的站点模板爬虫。

一、环境准备

首先,确保你的计算机上已安装Go 1.19或更高版本。你可以通过运行go version命令来检查当前安装的Go版本。

二、编写爬虫程序

1. 导入必要的包

你需要导入net/http包来发送HTTP请求,以及golang.org/x/net/html包来解析HTML内容。此外,fmt和os包也常用于输出和处理命令行参数。

import (
    "fmt"
    "net/http"
    "os"
    "golang.org/x/net/html"
)
2. 发送HTTP请求并获取HTML内容

编写一个函数来发送HTTP GET请求到目标URL,并返回HTML文档的根节点。这里使用http.Get函数来发送请求,并通过html.Parse函数解析响应体中的HTML内容。

func fetchURL(url string) (*html.Node, error) {

    resp, err := http.Get(url)
    if err != nil {

        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {

        return nil, fmt.Errorf("error getting URL %s: %s", url, resp.Status)
    }

    doc, err := html.Parse(resp.Body)
    if err != nil {

        return nil, fmt.Errorf("parsing HTML: %s", err)
    }
    return doc, nil
}
3. 解析HTML并提取数据

接下来,编写一个函数来遍历HTML文档,并提取所需的数据。例如,你可能想提取所有的超链接(即<a>标签的href属性)。

func extractLinks(n *html.Node) {

    if n.Type == html.ElementNode && n.Data == "a" {

        for _, a := range n.Attr {

            if a.Key == "href" {

                fmt.Println(a.Val)
                break
            }
        }
    }
    for c := n.FirstChild; c != nil; c = c.NextSibling {

        extractLinks(c)
    }
}
4. 主函数

最后,编写main函数来调用上述函数,并处理命令行参数作为目标URL。

func main() {

    if len(os.Args) < 2 {

        fmt.Println("Usage: go run main.go <url>")
        os.Exit(1)
    }
    url := os.Args[1]
    doc, err := fetchURL(url)
    if err != nil {

        fmt.Fprintln(os.Stderr, "Error fetching URL:", err)
        os.Exit(1)
    }
    extractLinks(doc)
}

三、运行爬虫

将上述代码保存为main.go文件,并在命令行中运行go run main.go [URL],其中[URL]是你想要爬取的网站地址。程序将输出该网站首页上所有超链接的href属性。

四、注意事项

  1. 遵守法律法规 :在使用爬虫时,务必遵守相关法律法规,以及网站的robots.txt文件规定。
  2. 尊重网站权利:尊重网站所有者的权利,不要过度爬取数据或对网站造成不必要的负担。
  3. 错误处理:在实际应用中,应增加更完善的错误处理逻辑,以应对各种异常情况。
  4. 性能优化:对于大规模爬取任务,可能需要考虑并发处理、缓存机制等性能优化措施。

基于Go 1.19编写一个简单的站点模板爬虫,用于爬取并解析网页内容。
当然,我可以为你提供一个基于Go 1.19的简单站点模板爬虫示例。这个爬虫将使用net/http包来发送HTTP请求,使用golang.org/x/net/html包来解析HTML内容。在这个示例中,我们将爬取一个网页并打印出所有的<title>标签内容以及<a>标签的href属性。

首先,确保你已经安装了Go 1.19,并且你的工作环境中可以访问golang.org/x/net/html包。如果golang.org/x/net/html包没有自动安装,你可以通过运行go get golang.org/x/net/html来安装它。

下面是一个简单的站点模板爬虫示例:

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "strings"

    "golang.org/x/net/html"
)

// fetchAndParseHTML 发送HTTP请求,解析HTML,并调用回调函数处理节点
func fetchAndParseHTML(url string, fn func(*html.Node)) error {

    // 发送HTTP GET请求
    resp, err := http.Get(url)
    if err != nil {

        return err
    }
    defer resp.Body.Close()

    // 检查HTTP状态码
    if resp.StatusCode != http.StatusOK {

        return fmt.Errorf("HTTP error: %s", resp.Status)
    }

    // 读取并解析HTML
    doc, err := html.Parse(resp.Body)
    if err != nil {

        return err
    }

    // 调用回调函数处理文档节点
    fn(doc)

    return nil
}

// forEachNode 遍历HTML节点,并调用处理函数
func forEachNode(n *html.Node, process func(n *html.Node)) {

    if n == nil {

        return
    }
    process(n)
    for c := n.FirstChild; c != nil; c = c.NextSibling {

        forEachNode(c, process)
    }
}

// printInterestingTags 打印<title>和<a>标签
func printInterestingTags(n *html.Node) {

    if n.Type == html.ElementNode {

        switch n.Data {

        case "title":
            for c := n.FirstChild; c != nil; c = c.NextSibling {

                if c.Type == html.TextNode {

                    fmt.Println("Title:", c.Data)
                }
            }
        case "a":
            for _, a := range n.Attr {

                if a.Key == "href" {

                    fmt.Println("Link:", a.Val)
                }
            }
        }
    }
}

func main() {

    if len(os.Args) < 2 {

        fmt.Println("Usage: go run main.go <url>")
        os.Exit(1)
    }

    url := os.Args[1]

    // 发送请求,解析HTML,并打印有趣的标签
    err := fetchAndParseHTML(url, func(doc *html.Node) {

        forEachNode(doc, printInterestingTags)
    })

    if err != nil {

        fmt.Fprintf(os.Stderr, "Error: %s\n", err)
        os.Exit(1)
    }
}

在这个示例中,fetchAndParseHTML函数负责发送HTTP请求、解析HTML,并接受一个回调函数来处理HTML节点。forEachNode函数是一个递归函数,用于遍历HTML树中的每个节点。printInterestingTags函数检查节点类型,并打印出<title>标签的内容和<a>标签的href属性。

要运行这个爬虫,请保存代码为main.go,并使用go run main.go [URL]命令,其中[URL]是你想要爬取的网页地址。爬虫将输出该网页的标题和所有链接的href属性。

原文链接: https://blog.csdn.net/hai40587/article/details/140541960

标签: #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.