A tour of Go 中關於 Web Crawler 的解答
按照提示,改寫了 Crawl 函式,但是隻能找出一條 url,想不出原因,請教大家,謝謝。
package main
import (
"fmt"
"sync"
)
type Fetcher interface {
// Fetch returns the body of URL and
// a slice of URLs found on that page.
Fetch(url string) (body string, urls []string, err error)
}
// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
// TODO: Fetch URLs in parallel.
// TODO: Don't fetch the same URL twice.
// This implementation doesn't do either:
if depth <= 0 {
fmt.Printf("depth <= 0 return")
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
crawled.mux.Lock()
crawled.c[url]++
crawled.mux.Unlock()
for _, u := range urls {
//crawled.mux.Lock()
if cnt, ok := crawled.c[u]; ok {
cnt++
} else {
fmt.Println("go ...", u)
go Crawl(u, depth-1, fetcher)
}
//crawled.mux.Unlock()
//Crawl(u, depth-1, fetcher)
}
return
}
func main() {
Crawl("http://golang.org/", 4, fetcher)
}
// fakeFetcher is Fetcher that returns canned results.
type fakeFetcher map[string]*fakeResult
type fakeResult struct {
body string
urls []string
}
func (f fakeFetcher) Fetch(url string) (string, []string, error) {
if res, ok := f[url]; ok {
return res.body, res.urls, nil
}
return "", nil, fmt.Errorf("not found: %s", url)
}
// fetcher is a populated fakeFetcher.
var fetcher = fakeFetcher{
"http://golang.org/": &fakeResult{
"The Go Programming Language",
[]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{
"Package fmt",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
"http://golang.org/pkg/os/": &fakeResult{
"Package os",
[]string{
"http://golang.org/",
"http://golang.org/pkg/",
},
},
}
type crawledUrl struct {
c map[string]int
mux sync.Mutex
}
var crawled = crawledUrl{c: make(map[string]int)}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- A tour of Go例程疑惑Go
- [CareerCup] 10.5 Web Crawler 網路爬蟲Web爬蟲
- 關於 Laravel6.0 開發中的簡單小問題解答Laravel
- Servlet中關於web.xml的測試ServletWebXML
- 10分鐘go crawler colly從入門到精通Go
- 關於Java Web工程中web.xml檔案JavaWebXML
- Go 1.16 中關於 go get 和 go install 你需要注意的地方Go
- 關於建立3D線框模型的解答3D模型
- 關於Apache Hadoop的常見問題解答ApacheHadoop
- 關於IBM Web Sphere 中的Javascript除錯IBMWebJavaScript除錯
- 關於CleanMyMac常見問題與解答Mac
- 關於web遊戲的搭建Web遊戲
- 關於.NET微服務最熱門的問題解答微服務
- 解答關於學習前端的一些問題前端
- 關於web中的顏色表示方法,你知道多少?Web
- BlueDog 關於標準C++有關問題的解答<二> (轉)C++
- 關於mssql中go等幾個關鍵字的用途及區別SQLGo
- 關於租用香港伺服器疑問解答伺服器
- 關於租用香港伺服器疑問解答。伺服器
- 關於租用香港伺服器疑問解答?伺服器
- java web中關於修改xml後讀取值的問題JavaWebXML
- 關於 Go 中 Map 型別和 Slice 型別的傳遞Go型別
- 關於web start的問題Web
- Go - 關於 protoc 工具的小疑惑Go
- 關於GO反射的簡單定律Go反射
- 關於在Flutter Web中載入html(持續更新中......)FlutterWebHTML
- 自問自答系列——關於 Laravel6.0 開發中的簡單小問題解答Laravel
- 關於web.xmlWebXML
- go mod 的使用及解答學習以來的疑惑(go mod 目錄、包名、import之間的關係)GoImport
- Go--關於 goroutine、channelGo
- 關於反射的導致panic的一段程式碼,求解答反射
- 【譯】關於Webpack中一些讓人困惑的地方的解答Web
- 讀 "優雅關閉的 Go Web 伺服器"GoWeb伺服器
- 關於WEB-INF的訪問Web
- 關於 Web 應用的 Prerender 策略Web
- 關於 Go 程式碼結構的思考Go
- Go 語言關於 Type Assertions 的 坑Go
- 關於go的跨域處理 ginGo跨域