1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package main
import (
"fmt"
"net/http"
"golang.org/x/net/html"
"golang.org/x/net/html/atom"
"sync"
)
// 用于存储访问的URL
var urls = []string{
"https://plumephp.com/posts/",
"https://plumephp.com/about/",
// 可以添加更多的URL
}
// 用于同步goroutines
var wg sync.WaitGroup
func main() {
// 启动所有goroutines
for _, url := range urls {
wg.Add(1)
go crawl(url)
}
// 等待所有goroutine完成
wg.Wait()
}
// crawl 函数用于访问URL并打印出网页中的所有链接
func crawl(url string) {
defer wg.Done()
// 发送HTTP GET请求
resp, err := http.Get(url)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 解析HTML
doc, err := html.Parse(resp.Body)
if err != nil {
fmt.Println(err)
return
}
// 遍历DOM树,查找所有的a标签
forEachNode(doc, atom.A, func(n *html.Node) {
// 获取href属性
for _, a := range n.Attr {
if a.Key == "href" {
fmt.Println(a.Val)
}
}
})
}
// forEachNode 函数遍历DOM树,查找指定的标签
func forEachNode(n *html.Node, tag atom.Atom, f func(*html.Node)) {
if n.Type == html.ElementNode && n.DataAtom == tag {
f(n)
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
forEachNode(c, tag, f)
}
}
|