博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经-匿名函数习题2
阅读量:6331 次
发布时间:2019-06-22

本文共 2174 字,大约阅读时间需要 7 分钟。

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

要保存vimeo.com下的页面。

package mainimport (        "fmt"        "io"        "io/ioutil"        "links"        "log"        "net/http"        "net/url"        "os")/*练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面。只保存来自原始域名下的页面。假设初始页面在golang.org下,就不要保存vimeo.com下的页面。*/var sum intfunc main() {        breadthFirst(crawl, os.Args[1:])}/*抓取页面的所有连接*/func crawl(url string) []string {        sum++        go save(url)        fmt.Printf("%d|%s\n", 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)...)                        }                }        }}

  

转载于:https://www.cnblogs.com/taoshihan/p/8875218.html

你可能感兴趣的文章
HEOI2018游记
查看>>
Shell脚本基础
查看>>
hdu 1541 树状数入门
查看>>
EF 5.0 帮助类
查看>>
tomcat源码解读(1)–tomcat热部署实现原理
查看>>
Jmeter(一)http接口添加header和cookie --转载
查看>>
团队作业——Alpha冲刺 6/12
查看>>
Windows 下 tail 查看日志命令工具分享
查看>>
模版编程--类模版
查看>>
win32下创建窗口
查看>>
10个随机数相加等于100
查看>>
105、Replicated Mode VS Global Mode (Swarm12)
查看>>
13-计算最长英语单词链
查看>>
asp快速开发方法之分页函数
查看>>
关于网易云音乐爬虫的api接口?
查看>>
轻量级还是重量级
查看>>
关于Android LogCat不打印日志输出的问题
查看>>
【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
查看>>
iOS学习07之C语言指针
查看>>
OS开发UI基础—手写控件,frame,center和bounds属性
查看>>