当前位置 博文首页 > Go语言实现的web爬虫实例

    Go语言实现的web爬虫实例

    作者:不是JS 时间:2021-02-13 12:06

    本文实例讲述了Go语言实现的web爬虫方法。分享给大家供大家参考。具体分析如下:

    这里使用 Go 的并发特性来并行执行 web 爬虫。
    修改 Crawl 函数来并行的抓取 URLs,并且保证不重复。

    复制代码 代码如下:
    package main
    import (
        "fmt"
    )
    type Fetcher interface {
            // Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。
        Fetch(url string) (body string, urls []string, err error)
    }
    // Crawl 使用 fetcher 从某个 URL 开始递归的爬取页面,直到达到最大深度。
    func Crawl(url string, depth int, fetcher Fetcher) {
            // TODO: 并行的抓取 URL。
            // TODO: 不重复抓取页面。
            // 下面并没有实现上面两种情况:
        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 {
            Crawl(u, depth-1, fetcher)
        }
        return
    }
    func main() {
        Crawl("http://golang.org/", 4, fetcher)
    }
    // fakeFetcher 是返回若干结果的 Fetcher。
    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 是填充后的 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/",
            },
        },
    }

    希望本文所述对大家的Go语言程序设计有所帮助。

    js
    下一篇:没有了