程序在执行 GET 请求时连续超时后停止
Program halts after successive timeout while performing GET request
我正在制作一个抓取 html、css 和 js 页面的爬虫。爬虫是典型的有 4 个 go-routines 运行 同时获取资源的爬虫。为了学习,我一直在使用 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
}
}
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
将 return 出错。
我正在制作一个抓取 html、css 和 js 页面的爬虫。爬虫是典型的有 4 个 go-routines 运行 同时获取资源的爬虫。为了学习,我一直在使用 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
}
}
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
将 return 出错。