我正在尝试获取状态为200的https://www.avito.ru/moskva页面的正确正文。
req, err := http.NewRequest("GET", "https://www.avito.ru/moskva", nil)
req.Header.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0")
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
fmt.Println(res.Status)
printBody(res) // prints body of page
输出:403 Forbidden
"security stub from site (says that my ip banned)"
我可以在浏览器中打开此页面而没有任何警告。我用python成功获得了 body :
import requests
session = requests.Session()
session.headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Accept-Language': 'ru',
}
print(session.get("https://www.avito.ru/moskva").text)
即使没有添加任何标题,curl也可以很好地工作:curl https://www.avito.ru/moskva
最佳答案
似乎问题在于所使用的TLS版本,将最高版本设置为1.2 tls.VersionTLS12
似乎可行:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"crypto/tls"
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
MaxVersion: tls.VersionTLS12,
},
}
client := &http.Client{Transport: tr}
req, err := http.NewRequest("GET", "https://www.avito.ru/moskva", nil)
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)
fmt.Print(bodyString)
}
如果您切换到tls.VersionTLS13
,它会提供403状态代码,因此我猜测默认情况下会为此主机协商该版本。在Chrome上,您可以看到它正在使用tls1.3:但是我不确定为什么它会为tls1.3和tls1.2返回不同的结果