golang net/http訪問https
進來看了golang寫兵法爬蟲的資料,於是自己動手簡單的嘗試了一下,發現在使用http.Get("https://...")
的時候,會報錯。原因是我的環境設定了上網代理。上網搜尋了一些問題,耗時兩天才最終解決,現將解決過程記錄下來,僅供參考。
最初的原始碼
package main import ( "fmt" "net/http" ) func main() { seedUrl := "https://www.douban.com/" body, err := http.Get(seedUrl) if err != nil { fmt.Errorf("get https://www.douban.com/ error") panic(err) } fmt.Printf("%s\n", body) }
執行是報的錯誤panic: Get https://www.douban.com/: proxyconnect tcp: tls: first record does not look like a TLS handshake
- 第一次搜尋,給出的提示是沒有TLS新增證書,需要修改原始碼,修改後的原始碼
- 執行時進入無限等待,沒有探究為什麼。繼續搜尋也沒有解決。
package main import ( "crypto/tls" "fmt" "net/http" ) func main() { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} seedUrl := "https://www.douban.com/" body, err := client.Get(seedUrl) if err != nil { fmt.Errorf("get https://www.douban.com/ error") panic(err) } fmt.Printf("%s\n", body) }
- 第二天,換一種思路,因為我的機器上網設定了代理,所以就檢索如何用golang設定http代理。修改程式碼如下,可正常工作。
package main import ( "crypto/tls" "fmt" "io/ioutil" "net/http" "net/url" ) func main() { proxy := func(_ *http.Request) (*url.URL, error) { return url.Parse("http://你的代理:80") } tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, Proxy:proxy, } client := &http.Client{Transport: tr} seedUrl := "https://www.douban.com/" resp, err := client.Get(seedUrl) if err != nil { fmt.Errorf("get https://www.douban.com/ error") panic(err) } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) fmt.Printf("%s\n", body) }
總結
- 首先分析執行的環境是什麼樣的,比如我的設定了上網代理
- 錯誤搜尋解決不了問題時,進行環境相關的關鍵詞搜尋