[日常] Go语言圣经-匿名函数习题2
2023-02-18 15:47:10 时间
练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面。只保存来自原始域名下的页面。假设初始页面在golang.org下,就不
要保存vimeo.com下的页面。
package main 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|%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)...) } } } }
相关文章
- C/C++ 反调试与绕过手法
- C/C++ Inline Hook 钩子编写技巧
- C/C++ 将ShellCode注入进程内存
- Rsync+Inotify 实现数据同步
- NFS实现部署Linux文件共享
- Linux 应用Kickstart部署系统
- C/C++ 数据结构与算法笔记
- Django Web开发基础知识
- Django ORM 数据库常用操作
- Django 之Form表单的常用操作
- Django 使用Paginator分页器
- Django Admin 后台自定制技巧
- 利用 GitHub Action 自动部署 Hexo 博客
- Linux 文本处理三剑客应用
- 在 Windows 上快速安装 Hexo · 安装 Git
- 加速 GitHub 下载
- GitHub Action 监测京东商品价格
- Django Session与用户认证模块
- Django 常用的Form表单
- Django 开发模板与视图