进来看了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"
"io/ioutil"
"net/http"
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
seedUrl := "https://www.douban.com/"
resp, err := client.Get(seedUrl)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
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)
}
总结
- 首先分析运行的环境是什么样的,比如我的设置了上网代理
- 错误搜索解决不了问题时,进行环境相关的关键词搜索