加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[日常] Go语言圣经-匿名函数习题2

发布时间:2020-12-16 19:36:16 所属栏目:大数据 来源:网络整理
导读:练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面。只保存来自原始域名下的页面。假设初始页面在golang.org下,就不 要保存vimeo.com下的页面。 import ( "fmt" "io" "io/ioutil" "links" "log" "net/http" "net/url" "os"

练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面。只保存来自原始域名下的页面。假设初始页面在golang.org下,就不 要保存vimeo.com下的页面。

import (
"fmt"
"io"
"io/ioutil"
"links"
"log"
"net/http"
"net/url"
"os"
)
/
练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面。只保存来自原始域名下的页面。假设初始页面在golang.org下,就不要保存vimeo.com下的页面。
/
var sum int
func main() {
breadthFirst(crawl,os.Args[1:])
}

/
抓取页面的所有连接
/
func crawl(url string) []string {
sum++

    go save(url)
    fmt.Printf("%d|%sn",sum,url)
    list,err := links.Extract(url)
    if err != nil {
            log.Print(err)
    }
    return list

}

/
保存页面到文件
/
func save(u string) bool {

    urlObj,_ := url.Parse(u)
    path := "/tmp/crawl/" + urlObj.Host
    if urlObj.Path == "" || urlObj.Path == "/" {
            urlObj.Path = "/index.html"
    }
    filename := path + urlObj.Path //重点注意文件名
    fmt.Println(filename)
    //打开文件
    f,_ := os.OpenFile(filename,os.O_CREATE|os.O_APPEND|os.O_RDWR,0755)
    //读取链接
    resp,geterr := http.Get(u)

    if geterr != nil || resp.StatusCode != http.StatusOK {
            //resp.Body.Close()
            return false
    }
    body,_ := ioutil.ReadAll(resp.Body)
    //fmt.Println(body)
    //创建保存目录
    _,err := os.Stat(path)
    if err != nil {
            os.MkdirAll(path,0755)
    }

    io.WriteString(f,string(body))
    resp.Body.Close()
    body = nil
    return true

}

/
广度优先算法
/
// breadthFirst calls f for each item in the worklist.
// Any items returned by f are added to the worklist.
// f is called at most once for each item.
func breadthFirst(f func(item string) []string,worklist []string) {
seen := make(map[string]bool)
for len(worklist) > 0 {
items := worklist
worklist = nil
for _,item := range items {
if !seen[item] {
seen[item] = true
worklist = append(worklist,f(item)...)
}
}
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读