Golang爬虫封装_golang 爬虫封装,多线程高并发
以下是一个简单的Golang多线程爬虫的例子,使用了go
关键字来创建goroutines以实现并发下载。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"sync"
"time"
)
var wg sync.WaitGroup
func download(url string, ch chan<- string) {
defer wg.Done() // 在函数退出时通知main()一个goroutine结束了
resp, err := http.Get(url)
if err != nil {
ch <- "Error: " + err.Error()
return
}
defer resp.Body.Close() // 确保关闭resp的Body
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
ch <- "Error: " + err.Error()
return
}
// 将下载的内容作为字符串发送到通道ch
ch <- string(body)
}
func main() {
start := time.Now()
ch := make(chan string, 3) // 创建一个通道,容量为3
urls := []string{
"https://www.golang.org/",
"https://golang.org/doc/",
"https://play.golang.org/",
}
for _, url := range urls {
wg.Add(1) // 为每个链接增加一个等待组的计数器
go download(url, ch) // 创建goroutine下载网页
}
// 等待所有的goroutines完成
go func() {
wg.Wait()
close(ch) // 确保通道关闭,通知main()所有结果都发送完毕
}()
// 接收并打印通道中的结果
for result := range ch {
fmt.Println(result)
}
// 报告下载和处理时间
fmt.Printf("Elapsed time: %s\n", time.Since(start))
}
这段代码创建了一个简单的多线程网络爬虫,使用了sync.WaitGroup
来等待所有的goroutines完成他们的工作,并通过通道ch
安全地在main goroutine和下载goroutines之间传递数据。通过make(chan string, 3)
创建了一个有缓冲的字符串通道,缓冲区大小为3,以允许同时传递最多三个结果,而不会阻塞下载goroutines。
评论已关闭