执行GET请求后,程序在连续超时后停止

时间:2015-08-14 11:58:08

标签: http go get timeout

我正在制作一个抓取html,css和js页面的抓取工具。爬虫是一个典型的爬虫,有4个go-routine同时运行以获取资源。为了学习,我一直在使用3个测试站点。爬虫工作正常并显示程序完成日志,同时测试其中两个。

然而,在第3个网站中,在获取css链接时发生了太多超时。这最终导致我的程序停止。它获取链接但在连续20多次超时后,程序停止显示日志。基本上它停止了。我不认为它是事件日志控制台的问题。

我是否需要单独处理超时?我没有发布完整的代码,因为它与我寻求的概念性答案无关。但是代码是这样的:

for {
    site, more := <-sites
    if more {
        url, err := url.Parse(site)
        if err != nil {
            continue
        }
        response, error := http.Get(url.String())

        if error != nil {
            fmt.Println("There was an error with Get request: ", error.Error())
            continue
        }

        // Crawl function
    }
}

1 个答案:

答案 0 :(得分:5)

http客户端的默认行为是永久阻止。创建客户端时设置超时:(http://godoc.org/net/http#Client

func main() {
    client := http.Client{
        Timeout: time.Second * 30,
    }
    res, err := client.Get("http://www.google.com")
    if err != nil {
        panic(err)
    }
    fmt.Println(res)
}

30秒后Get将返回错误。