今天写个简单的程序,根据指定的 URL 来抓取相应的网页内容,而后存入本地文件。这个程序会涉及到网络请求和文件操做等知识点,下面是实现代码:bash
// fetch.go package main import ( "os" "fmt" "net/http" "io/ioutil" ) func main() { url := os.Args[1] // 根据URL获取资源 res, err := http.Get(url) if err != nil { fmt.Fprintf(os.Stderr, "fetch: %v\n", err) os.Exit(1) } // 读取资源数据 body: []byte body, err := ioutil.ReadAll(res.Body) // 关闭资源流 res.Body.Close() if err != nil { fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err) os.Exit(1) } // 控制台打印内容 如下两种方法等同 fmt.Printf("%s", body) fmt.Printf(string(body)) // 写入文件 ioutil.WriteFile("site.txt", body, 0644) }
上面的代码中,咱们引入了 net/http 网络包,而后调用 http.Get(url) 方法获取 URL 对应的资源,以后读取出资源数据,而后在控制台打印,并将内容写入到本地文件中。网络
须要注意的是,在读取资源数据完毕后,应该及时将资源流关闭,避免出现内存资源的泄露。fetch
另外,在处理异常时,咱们使用了 fm.Fprintf() 这个方法,它是格式化三大方法之一:url
- Printf: 格式化字符串并输出到 os.Stdout 中。
- Fprintf: 格式化字符串并输出到指定文件设备中,因此参数比 Printf 多一个文件指针 FILE*。
- Sprintf: 格式化字符串并输出到指定字符串中,因此参数比 Printf 多一个 char*,那就是目标字符串地址。
编译后运行程序,并指定一个 URL 参数,这里暂时指定为百度吧,仍是但愿 Google 近期可以回归:指针
$ ./fetch http://www.baidu.com
运行完程序,在当前目录中会生成一个 site.txt 文件。code