使用go并发网络爬虫
以下是一个使用Go语言编写的简单网络爬虫的示例,它使用了goroutines和channels来实现并发下载网页内容。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"sync"
"time"
)
func download(url string, ch chan<- string) {
start := time.Now()
resp, err := http.Get(url)
if err != nil {
ch <- "Failed to download " + url + ": " + err.Error()
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
ch <- "Failed to read body from " + url + ": " + err.Error()
return
}
// 计算下载时间并记录日志
elapsed := time.Since(start)
ch <- fmt.Sprintf("Download of %s complete in %s; size: %d bytes", url, elapsed, len(body))
}
func main() {
var wg sync.WaitGroup
urls := []string{
"http://www.golang.org",
"http://www.google.com",
"http://www.example.com",
// 添加更多的URLs...
}
// 创建一个通道来接收日志消息
downloads := make(chan string, len(urls))
// 为每个URL启动一个goroutine来下载
for _, url := range urls {
wg.Add(1)
go func(u string) {
download(u, downloads)
wg.Done()
}(url)
}
// 等待所有下载任务完成
go func() {
wg.Wait()
close(downloads) // 关闭通道
}()
// 打印所有日志消息
for msg := range downloads {
fmt.Println(msg)
}
}
这段代码创建了一个简单的网络爬虫,它并发地从多个URL下载网页内容。每个URL都在一个单独的goroutine中下载,并且使用了一个sync.WaitGroup
来确保主goroutine等待所有下载任务完成。下载完成的信息通过一个channel发送给主goroutine,然后主goroutine打印这些信息。
评论已关闭