如何避免一些网站拒绝HTTP使用go

时间:2015-03-23 22:37:29

标签: http go

我们有一个脚本,每天检查所有数据库记录中的所有Web链接(当链接过期时,用户需要通知)。

有几个站点可以通过Web浏览器从这个IP地址正常工作,但是当通过GO获取时,它们会在完成请求之前断开连接或返回HTTP授权拒绝消息。

我假设某种防火墙(F5)正在过滤/阻止请求。即使我更改HTTP请求以使用公共用户代理,也会发生这种情况。我们可以做些什么来确保GO请求看起来像标准浏览器?

func fetch_url(url string, d time.Duration) (int, error) {

    client := &http.Client{
        Timeout: d,
    }

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return 0, err
    }

    req.Header.Set("User-Agent", "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53")

    resp, err := client.Do(req)
    if err != nil {
        return 0, err
    }

    status := resp.StatusCode
    resp.Body.Close()
    return status, nil
}

1 个答案:

答案 0 :(得分:3)

尝试匹配来自网络浏览器的请求中的确切标头,以消除其他因素。智能防火墙可以在网络浏览器和机器人之间进行启发式扫描。

请注意,go http客户端仅发送最小的HTTP请求:

GET /foo HTTP/1.1
Host: localhost:3030
User-Agent: Go 1.1 package http
Accept-Encoding: gzip

而网络浏览器更健谈:

GET /foo HTTP/1.1
Host: localhost:3030
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8