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语言程序设计有所帮助。