package main import ( "fmt" "net/http" "net/url" "sync" "time" ) var wg sync.WaitGroup // 用于等待所有线程完成 func main() { urls := []string{"https://www.example.com", "https://www.google.com", "https://www.yahoo.com"} proxies := []string{"http://1.2.3.4:8888", "http://5.6.7.8:8888", "http://9.10.11.12:8888"} for i, url := range urls { proxyUrl, err := url.Parse(proxies[i]) // 每个goroutine使用不同的代理IP if err != nil { fmt.Println("Error parsing proxy URL", err) return } client := &http.Client{ Transport: &http.Transport{ Proxy: http.ProxyURL(proxyUrl), }, Timeout: time.Second * 10, // 请求超时时间 } wg.Add(1) // 每个URL启动一个goroutine go fetch(url, client) } wg.Wait() // 等待所有goroutine完成 } func fetch(url string, client *http.Client) { defer wg.Done() // 在函数返回时,通知WaitGroup完成一个goroutine resp, err := client.Get(url) if err != nil { fmt.Println("Error fetching", url, err) return } defer resp.Body.Close() fmt.Println("Fetched", url, resp.Status) }
golang 多线程代理ip并且每个线程ip不一样的爬虫代码示例使用了三个不同的代理IP地址和端口号,分别对应于三个URL。在主函数中,对于每个URL,通过 url.Parse() 函数将其对应的代理IP地址和端口号解析为一个 url.URL 对象。然后,为每个URL创建一个带有不同代理IP的 http.Client 对象,并设置了一个请求超时时间。 在每个goroutine的结尾处,使用 defer wg.Done() 通知WaitGroup完成一个goroutine。http.Client 对象的 Get() 方法用于获取URL的内容。如果发生错误,则在控制台输出错误消息。否则,打印URL和响应状态。
转载请注明来自本站(66娱乐网)
66优乐网 » golang 多线程代理ip并且每个线程ip不一样的爬虫代码
66优乐网 » golang 多线程代理ip并且每个线程ip不一样的爬虫代码