[Go] 一个Go语言实现的web爬虫 →→→→→进入此内容的聊天室

来自 , 2019-03-13, 写在 Go, 查看 155 次.
URL http://www.code666.cn/view/eaae5e04
  1. package main
  2.  
  3. import (
  4.         "fmt"
  5. )
  6.  
  7. type Fetcher interface {
  8.         // Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。
  9.         Fetch(url string) (body string, urls []string, err error)
  10. }
  11.  
  12. // Crawl 使用 fetcher 从某个 URL 开始递归的爬取页面,直到达到最大深度。
  13. func Crawl(url string, depth int, fetcher Fetcher) {
  14.         // TODO: 并行的抓取 URL。
  15.         // TODO: 不重复抓取页面。
  16.         // 下面并没有实现上面两种情况:
  17.         if depth <= 0 {
  18.                 return
  19.         }
  20.         body, urls, err := fetcher.Fetch(url)
  21.         if err != nil {
  22.                 fmt.Println(err)
  23.                 return
  24.         }
  25.         fmt.Printf("found: %s %q\n", url, body)
  26.         for _, u := range urls {
  27.                 Crawl(u, depth-1, fetcher)
  28.         }
  29.         return
  30. }
  31.  
  32. func main() {
  33.         Crawl("http://golang.org/", 4, fetcher)
  34. }
  35.  
  36.  
  37. // fakeFetcher 是返回若干结果的 Fetcher。
  38. type fakeFetcher map[string]*fakeResult
  39.  
  40. type fakeResult struct {
  41.         body string
  42.         urls     []string
  43. }
  44.  
  45. func (f *fakeFetcher) Fetch(url string) (string, []string, error) {
  46.         if res, ok := (*f)[url]; ok {
  47.                 return res.body, res.urls, nil
  48.         }
  49.         return "", nil, fmt.Errorf("not found: %s", url)
  50. }
  51.  
  52. // fetcher 是填充后的 fakeFetcher。
  53. var fetcher = &fakeFetcher{
  54.         "http://golang.org/": &fakeResult{
  55.                 "The Go Programming Language",
  56.                 []string{
  57.                         "http://golang.org/pkg/",
  58.                         "http://golang.org/cmd/",
  59.                 },
  60.         },
  61.         "http://golang.org/pkg/": &fakeResult{
  62.                 "Packages",
  63.                 []string{
  64.                         "http://golang.org/",
  65.                         "http://golang.org/cmd/",
  66.                         "http://golang.org/pkg/fmt/",
  67.                         "http://golang.org/pkg/os/",
  68.                 },
  69.         },
  70.         "http://golang.org/pkg/fmt/": &fakeResult{
  71.                 "Package fmt",
  72.                 []string{
  73.                         "http://golang.org/",
  74.                         "http://golang.org/pkg/",
  75.                 },
  76.         },
  77.         "http://golang.org/pkg/os/": &fakeResult{
  78.                 "Package os",
  79.                 []string{
  80.                         "http://golang.org/",
  81.                         "http://golang.org/pkg/",
  82.                 },
  83.         },
  84. }
  85. //go/4416

回复 "一个Go语言实现的web爬虫"

这儿你可以回复上面这条便签

captcha