基于go 1.19的站点模板爬虫

时间:2024-07-12 07:13:56

好像就三步:

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` 文件和其他法律法规。同时,网站的结构可能会变化,这可能影响爬虫的正常工作。始终尊重网站所有者的权利和爬取数据的合法性。