Golang : read gzipped http response
There are times when we want to grab a website content for parsing(crawling) and found out that the content is gzipped.
Normally, to deal with gzipped HTML reply, you can use Exec package to execute curl
from command line and pipe the gzipped content to gunzip, such as this :
curl -H "Accept-Encoding: gzip" http://www.thestar.com.my | gunzip
Another way to process gzipped http response can be done in Golang as well. The following codes will demonstrate how to get same result as the curl
command via Golang.
package main
import (
"compress/gzip"
"fmt"
"io"
"net/http"
"os"
)
func main() {
client := new(http.Client)
request, err := http.NewRequest("Get", " http://www.thestar.com.my", nil)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
request.Header.Add("Accept-Encoding", "gzip")
response, err := client.Do(request)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer response.Body.Close()
// Check that the server actual sent compressed data
var reader io.ReadCloser
switch response.Header.Get("Content-Encoding") {
case "gzip":
reader, err = gzip.NewReader(response.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer reader.Close()
default:
reader = response.Body
}
// to standard output
_, err = io.Copy(os.Stdout, reader)
// see https://www.socketloop.com/tutorials/golang-saving-and-reading-file-with-gob
// on how to save to file
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
References :
http://golang.org/pkg/os/exec/
http://golang.org/pkg/net/http/#Get
https://www.socketloop.com/tutorials/how-to-check-with-curl-if-my-website-or-the-asset-is-gzipped
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+10.7k Golang : Tutorial on loading GOB and PEM files
+3.8k PHP : How to handle URI or URL with non-ASCII characters such as Chinese/Japanese/Korean(CJK) ?
+5.7k Golang : Emulate NumPy way of creating matrix example
+6.5k Golang : Inject/embed Javascript before sending out to browser example
+5.4k Golang : Check to see if *File is a file or directory
+3.5k Golang : Experimental emojis or emoticons icons programming language
+5.6k Golang : Add build version and other information in executables
+9.1k How to test Facebook App on localhost ?
+7k Golang : Get UDP client IP address and differentiate clients by port number
+13.5k Golang : Accept input from user with fmt.Scanf skipped white spaces and how to fix it
+38.8k Golang : Encode image to base64 example
+6.1k Golang : Metaprogramming example of wrapping a function