Go语言实现的web爬虫实例
本文实例讲述了Go语言实现的web爬虫方法。分享给大家供大家参考。具体分析如下:
这里使用Go的并发特性来并行执行web爬虫。
修改Crawl函数来并行的抓取URLs,并且保证不重复。
packagemain
import(
"fmt"
)
typeFetcherinterface{
//Fetch返回URL的body内容,并且将在这个页面上找到的URL放到一个slice中。
Fetch(urlstring)(bodystring,urls[]string,errerror)
}
//Crawl使用fetcher从某个URL开始递归的爬取页面,直到达到最大深度。
funcCrawl(urlstring,depthint,fetcherFetcher){
//TODO:并行的抓取URL。
//TODO:不重复抓取页面。
//下面并没有实现上面两种情况:
ifdepth<=0{
return
}
body,urls,err:=fetcher.Fetch(url)
iferr!=nil{
fmt.Println(err)
return
}
fmt.Printf("found:%s%q\n",url,body)
for_,u:=rangeurls{
Crawl(u,depth-1,fetcher)
}
return
}
funcmain(){
Crawl("http://golang.org/",4,fetcher)
}
//fakeFetcher是返回若干结果的Fetcher。
typefakeFetchermap[string]*fakeResult
typefakeResultstruct{
bodystring
urls []string
}
func(f*fakeFetcher)Fetch(urlstring)(string,[]string,error){
ifres,ok:=(*f)[url];ok{
returnres.body,res.urls,nil
}
return"",nil,fmt.Errorf("notfound:%s",url)
}
//fetcher是填充后的fakeFetcher。
varfetcher=&fakeFetcher{
"http://golang.org/":&fakeResult{
"TheGoProgrammingLanguage",
[]string{
"http://golang.org/pkg/",
"http://golang.org/cmd/",
},
},
"http://golang.org/pkg/":&fakeResult{
"Packages",
[]string{
"http://golang.org/",
"http://golang.org/cmd/",
"http://golang.org/pkg/fmt/",
"http://golang.org/pkg/os/",
},
},
"http://golang.org/pkg/fmt/":&fakeResult{
"Packagefmt",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
"http://golang.org/pkg/os/":&fakeResult{
"Packageos",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
}
希望本文所述对大家的Go语言程序设计有所帮助。