当前位置: 首页 > news >正文

基于go 1.19的站点模板爬虫

好像就三步:

1 建立http连接

2 解析html内容

3 递归遍历

创建一个基于 Go 1.19 的网站模板爬虫主要涉及几个步骤,包括设置 HTTP 客户端来获取网页内容、解析 HTML 来提取所需的数据,以及处理可能的并发和错误。下面我会给出一个简单的例子来说明如何使用 Go 编写一个基本的网站爬虫。

首先,确保你安装了 Go。然后,你可以选择使用如 `net/http` 标准库来发送 HTTP 请求,使用 `golang.org/x/net/html` 包来解析 HTML。

下面是一个简单的爬虫示例,它将访问一个网站,下载首页的 HTML,然后提取并打印出所有的超链接(a标签的href属性):

```go
package main

import (
    "fmt"
    "golang.org/x/net/html"
    "net/http"
    "os"
)

// fetchURL 从给定的 URL 中获取 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
}

// extractLinks 递归地检索 HTML 文档中的所有链接
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)
    }
}

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)
}
```

在这个示例中,我们创建了几个功能:

- `fetchURL` 用于发送 HTTP 请求并解析返回的 HTML。
- `extractLinks` 递归地遍历 HTML 节点,查找并打印 `<a>` 标签的 `href` 属性。
- `main` 函数接受命令行参数作为 URL,调用以上函数来提取链接。

你可以通过运行 `go run main.go [URL]` 来使用这个脚本,其中 `[URL]` 是你想爬取的网站地址。

请注意,大规模使用网络爬虫时需要遵守网站的 `robots.txt` 文件和其他法律法规。同时,网站的结构可能会变化,这可能影响爬虫的正常工作。始终尊重网站所有者的权利和爬取数据的合法性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 记录一次排查api接口不通的问题
  • NI SCXI-1001 模块处理器控制器
  • 【work】AI八股-神经网络相关
  • 骏网一卡通之类的游戏卡有什么用?
  • kettle中调用restful接口时的SSL信任证书问题
  • cesium 雷达扫描
  • go获取正在运行的函数并及时捕获panic
  • ARM/Linux嵌入式面经(十四):ARM体系架构基础知识
  • 人与机器的协同是强弱系统的互补行为
  • 通过Spring Boot结合实时流媒体技术对考试过程进行实时监控
  • 数据结构 实验 3
  • Apache部署与配置
  • 存储产品选型策略 OSS生命周期管理与运维
  • HTTP入门
  • Dify中的weaviate向量数据库操作
  • 网络传输文件的问题
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • C学习-枚举(九)
  • Docker入门(二) - Dockerfile
  • git 常用命令
  • interface和setter,getter
  • LeetCode29.两数相除 JavaScript
  • Linux快速复制或删除大量小文件
  • Node 版本管理
  • npx命令介绍
  • Terraform入门 - 1. 安装Terraform
  • 排序算法之--选择排序
  • 区块链技术特点之去中心化特性
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT 笔记一
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (三)模仿学习-Action数据的模仿
  • (生成器)yield与(迭代器)generator
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转) Face-Resources
  • (转)ObjectiveC 深浅拷贝学习
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .equals()到底是什么意思?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net中我喜欢的两种验证码
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Bean有哪些属性
  • @Transactional 详解
  • [100天算法】-x 的平方根(day 61)
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [BIZ] - 1.金融交易系统特点
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强