首页 / GO / Golang网页下载示例
Golang网页下载示例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Golang网页下载示例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3089字,纯文字阅读大概需要5分钟。
内容图文
package main /* * 中文编码问题 */ import ( "errors" "flag" "fmt" query "github.com/PuerkitoBio/goquery" "golang.org/x/text/encoding/simplifiedchinese" "io/ioutil" "net/http" "os" "path/filepath" "runtime" "strings" "sync" ) var ( np = runtime.NumCPU() _ = runtime.GOMAXPROCS(np) ) var wg sync.WaitGroup type Folder struct { Url string Dir string } type File struct { Url string Dir string Name string } func checkErr(err error) { if err != nil { fmt.Printf("%v\n", err.Error()) os.Exit(1) } } func decodeToGBK(text string) (string, error) { dst := make([]byte, len(text)*2) tr := simplifiedchinese.GB18030.NewDecoder() nDst, _, err := tr.Transform(dst, []byte(text), true) if err != nil { return text, err } return string(dst[:nDst]), nil } func printEach(index int, item *query.Selection) { fmt.Println("Selection: ", item.Text()) } func isDir(path string) bool { return strings.HasSuffix(path, "/") } func makeFolder(item *query.Selection, url, dir string) (f *Folder, err error) { tx := item.Text() href, ok := item.Attr("href") name, err := decodeToGBK(tx) if err != nil { return } if !ok { err = errors.New("makeFolder : " + tx + " href属性不存在") return } f = &Folder{Url: url + href, Dir: filepath.Join(dir, name)} return } func makeFile(item *query.Selection, url, dir string) (f *File, err error) { tx := item.Text() href, ok := item.Attr("href") if !ok { err = errors.New("makeFile : " + tx + " href属性不存在") return } name, err := decodeToGBK(tx) if err != nil { return } f = &File{Url: url + href, Dir: dir, Name: name} return } func crawl(url, localDir string) { doc, err := query.NewDocument(url) // checkErr(err) if err != nil { fmt.Printf("%v\n", err.Error()) return } items := doc.Find("a") dir := localDir if !strings.HasSuffix(url, "/") { url += "/" } crawlEach := func(i int, item *query.Selection) { tx := item.Text() if isDir(tx) { folder, err := makeFolder(item, url, dir) if err != nil { fmt.Printf("%v\n", err.Error()) return } wg.Add(1) go crawlFolder(folder) } else { file, err := makeFile(item, url, dir) if err != nil { fmt.Printf("%v\n", err.Error()) return } download(file) } } items.Each(crawlEach) } func download(file *File) { dir := file.Dir url := file.Url name := file.Name if err := os.MkdirAll(dir, os.ModePerm); os.IsExist(err) { fmt.Printf("%x is exist\n", dir) } else { os.Chmod(dir, os.ModePerm) } resp, err := http.Get(url) if err != nil { fmt.Printf("%v\n", err.Error()) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Printf("%v\n", err.Error()) return } fp := string([]rune(filepath.Join(dir, name))) err = ioutil.WriteFile(fp, body, 0777) if err != nil { fmt.Printf("%v fp:[%v]\n", err.Error(), fp) return } fmt.Printf("Download: %+v\n", file) } func crawlFolder(folder *Folder) { url := folder.Url dir := folder.Dir crawl(url, dir) wg.Done() } func main() { host := flag.String("host", "http://localhost:8000", "HTTP服务地址Host") location := flag.String("locate", "E:/Crawler下载文件", "本地文件系统绝对路径") flag.Parse() crawl(*host, *location) wg.Wait() }
原文:http://my.oschina.net/dexterman/blog/484516
内容总结
以上是互联网集市为您收集整理的Golang网页下载示例全部内容,希望文章能够帮你解决Golang网页下载示例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。