如何在golang中有效地将html响应存储到文件中

时间:2016-01-25 14:31:53

标签: go web-crawler httprequest

我正在尝试在Golang中构建一个爬虫。我正在使用net/http库从url下载html文件。我正在尝试将http.resphttp.Header保存到文件中。

如何将这两个文件从各自的格式转换为字符串,以便可以将其写入文本文件。

我之前也看到了一个问题,解析了存储的html响应文件。 Parse HTTP requests and responses from text file in Go。有没有办法以这种格式保存网址响应。

3 个答案:

答案 0 :(得分:3)

编辑:感谢@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 :(得分:2)

在@Riscie的答案之后,您还可以从响应中获取标题,如下所示:

<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.0.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.css"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.theme.min.css"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.transitions.min.css"></script>

<div id="sync1" class="owl-carousel">
  <div class="item"><h1>1</h1></div>
  <div class="item"><h1>2</h1></div>
  <div class="item"><h1>3</h1></div>
  <div class="item"><h1>4</h1></div>
  <div class="item"><h1>5</h1></div>
  <div class="item"><h1>6</h1></div>
  <div class="item"><h1>7</h1></div>
  <div class="item"><h1>8</h1></div>
  <div class="item"><h1>9</h1></div>
  <div class="item"><h1>10</h1></div>
  <div class="item"><h1>11</h1></div>
  <div class="item"><h1>12</h1></div>
  <div class="item"><h1>13</h1></div>
  <div class="item"><h1>14</h1></div>
  <div class="item"><h1>15</h1></div>
  <div class="item"><h1>16</h1></div>
  <div class="item"><h1>17</h1></div>
  <div class="item"><h1>18</h1></div>
</div>

答案 2 :(得分:2)

Go有一个带有响应转储的httputil包。 https://golang.org/pkg/net/http/httputil/#DumpResponse。 响应转储的第二个参数是是否包含正文的一个问题。因此,如果您只想将标题保存到文件中,请将其设置为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)
}