如何有效地存储 html 对 golang 中文件的响应
How to efficiently store html response to a file in golang
我正在尝试用 Golang 构建一个爬虫。我正在使用 net/http
库从 url 下载 html 文件。我正在尝试将 http.resp
和 http.Header
保存到文件中。
如何将这两个文件从各自的格式转换为字符串,以便将其写入文本文件。
我还看到了之前关于解析存储的 html 响应文件的问题。 。有没有办法以这种格式保存 url 响应。
编辑: 感谢@JimB 指出 http.Response.Write 方法,这比我建议的要容易得多开头:
resp, err := http.Get("http://google.com/")
if err != nil{
log.Panic(err)
}
f, err := os.Create("output.txt")
defer f.Close()
resp.Write(f)
这是我的第一个答案
你可以这样做:
resp, err := http.Get("http://google.com/")
body, err := ioutil.ReadAll(resp.Body)
// write whole the body
err = ioutil.WriteFile("body.txt", body, 0644)
if err != nil {
panic(err)
}
这是对我的第一个答案的编辑:
感谢@Hector Correa 添加了 header 部分。这是一个更全面的片段,针对您的整个问题。这将 header 后跟请求的 body 写入 output.txt
//get the response
resp, err := http.Get("http://google.com/")
//body
body, err := ioutil.ReadAll(resp.Body)
//header
var header string
for h, v := range resp.Header {
for _, v := range v {
header += fmt.Sprintf("%s %s \n", h, v)
}
}
//append all to one slice
var write []byte
write = append(write, []byte(header)...)
write = append(write, body...)
//write it to a file
err = ioutil.WriteFile("output.txt", write, 0644)
if err != nil {
panic(err)
}
根据@Riscie 的回答,您还可以从响应中获取 headers,如下所示:
for header, values := range resp.Header {
for _, value := range values {
log.Printf("\t\t %s %s", header, value)
}
}
Go 有一个带有响应转储的 httputil 包。
https://golang.org/pkg/net/http/httputil/#DumpResponse。
响应转储的第二个参数是是否包含 body 的布尔值。因此,如果您只想将 header 保存到文件中,请将其设置为 false。
将响应转储到文件的示例函数可以是:
import (
"io/ioutil"
"net/http"
"net/http/httputil"
)
func dumpResponse(resp *http.Response, filename string) error {
dump, err := httputil.DumpResponse(resp, true)
if err != nil {
return err
}
return ioutil.WriteFile(filename, dump, 0644)
}
我正在尝试用 Golang 构建一个爬虫。我正在使用 net/http
库从 url 下载 html 文件。我正在尝试将 http.resp
和 http.Header
保存到文件中。
如何将这两个文件从各自的格式转换为字符串,以便将其写入文本文件。
我还看到了之前关于解析存储的 html 响应文件的问题。
编辑: 感谢@JimB 指出 http.Response.Write 方法,这比我建议的要容易得多开头:
resp, err := http.Get("http://google.com/")
if err != nil{
log.Panic(err)
}
f, err := os.Create("output.txt")
defer f.Close()
resp.Write(f)
这是我的第一个答案
你可以这样做:
resp, err := http.Get("http://google.com/")
body, err := ioutil.ReadAll(resp.Body)
// write whole the body
err = ioutil.WriteFile("body.txt", body, 0644)
if err != nil {
panic(err)
}
这是对我的第一个答案的编辑:
感谢@Hector Correa 添加了 header 部分。这是一个更全面的片段,针对您的整个问题。这将 header 后跟请求的 body 写入 output.txt
//get the response
resp, err := http.Get("http://google.com/")
//body
body, err := ioutil.ReadAll(resp.Body)
//header
var header string
for h, v := range resp.Header {
for _, v := range v {
header += fmt.Sprintf("%s %s \n", h, v)
}
}
//append all to one slice
var write []byte
write = append(write, []byte(header)...)
write = append(write, body...)
//write it to a file
err = ioutil.WriteFile("output.txt", write, 0644)
if err != nil {
panic(err)
}
根据@Riscie 的回答,您还可以从响应中获取 headers,如下所示:
for header, values := range resp.Header {
for _, value := range values {
log.Printf("\t\t %s %s", header, value)
}
}
Go 有一个带有响应转储的 httputil 包。 https://golang.org/pkg/net/http/httputil/#DumpResponse。 响应转储的第二个参数是是否包含 body 的布尔值。因此,如果您只想将 header 保存到文件中,请将其设置为 false。
将响应转储到文件的示例函数可以是:
import (
"io/ioutil"
"net/http"
"net/http/httputil"
)
func dumpResponse(resp *http.Response, filename string) error {
dump, err := httputil.DumpResponse(resp, true)
if err != nil {
return err
}
return ioutil.WriteFile(filename, dump, 0644)
}