2016-01-25 91 views
-1

我正在嘗試在Golang中構建爬網程序。我正在使用net/http庫從url下載html文件。我正在嘗試將http.resphttp.Header保存到文件中。如何在golang中高效地存儲html響應文件

如何將這兩個文件從各自的格式轉換爲字符串,以便它可以寫入文本文件。

我還看到一個問題,前面解析一個存儲的HTML響應文件。 Parse HTTP requests and responses from text file in Go。有什麼方法可以保存這種格式的URL響應。

+0

也見['http.Response.Write'](https://golang.org/pkg/net/http/ #Response.Write)方法,由['httputil.DumpResponse'](https://golang.org/pkg/net/http/httputil/#DumpResponse)使用 – JimB

回答

2

編輯:感謝@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誰添加標題部分。這是一個更全面的片段,針對您的整個問題。這寫頭,隨後請求的身體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) 
} 
+1

或者您可以使用[ 'http.Response.Write'](https://golang.org/pkg/net/http/#Response.Write)方法,由['httputil.DumpResponse']使用(https://golang.org/ pkg/net/http/httputil /#DumpResponse) – JimB

+0

謝謝@JimB,不知道這個!編輯該片段。 – Riscie

2

繼答案通過@Riscie你也可以拿起從響應頭像這樣的東西:

for header, values := range resp.Header { 
    for _, value := range values { 
     log.Printf("\t\t %s %s", header, value) 
    } 
} 
2

Go有一個包含響應轉儲的httputil包。 https://golang.org/pkg/net/http/httputil/#DumpResponse。 響應轉儲的第二個參數是是否包含正文的bool。所以如果你只想把文件頭保存到一個文件中,將其設置爲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) 
}