如何解决网上游览的网络爬虫练习-卡住并且只能爬取第一个网站
Web爬网程序练习在插图互斥锁之后进行。因此,我创建了一个访问过的地图,并使用互斥保护它。但是下面的代码实现不起作用,并且它仅爬网第一个/入口网站。有人知道为什么吗?
type SafeMap struct{
m map[string]bool
mux sync.Mutex
}
func Crawl(url string,depth int,fetcher Fetcher,visited SafeMap) {
if depth <= 0 {
return
}
body,urls,err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n",url,body)
for _,u := range urls {
visited.mux.Lock()
if visited.m[u] != true {
visited.m[u] = true
go Crawl(u,depth-1,fetcher,visited)
}
visited.mux.Unlock()
}
return
}
func main() {
visited := SafeMap{m: make(map[string]bool)}
visited.m["https://golang.org/"] = true
Crawl("https://golang.org/",4,visited)
}
var fetcher = fakeFetcher{ going from "https://golang.org/" to a lots of websites }
解决方法
您的程序在goroutine完成之前结束。你应该等他们。使用等待组:
func main() {
visited := &SafeMap{m: make(map[string]bool)}
visited.m["https://golang.org/"] = true
wg:=sync.WaitGroup{}
Crawl("https://golang.org/",4,fetcher,visited,&wg)
wg.Wait()
}
爬行:
func Crawl(url string,depth int,fetcher Fetcher,visited *SafeMap,wg *sync.WaitGroup) {
wg.Add(1)
defer wg.Done()
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。