Go语言实现带代理的HTTP网页抓取

山海之间
山海之间
发布时间:2026-10-15 | 3人浏览过
原创

本文展示如何使用 Go 语言的标准库 net/http 进行网页抓取,重点涵盖两种代理配置方式:指定固定 IP 代理和自动读取环境变量。通过封装 HTTP 客户端并处理响应体,实现稳定获取页面 HTML 源码。

准备条件

使用 Go 标准库即可实现,无需引入第三方依赖。主要涉及以下核心包:

  • fmt:用于输出结果。
  • log:用于错误日志记录。
  • net/http:核心网络请求库。
  • net/url:解析代理地址 URL。
  • io/ioutil:读取响应数据(注:Go 1.16+ 推荐使用 io 和 os)。

真实操作顺序

第1步:配置代理传输层

目的:根据需求选择静态代理或环境代理,确保网络请求通过指定出口发送。

  1. 入口/参数:proxy_addr 字符串指针,格式为 http://host:port。
  2. 动作:解析代理地址并创建 http.Transport。若需从系统环境变量($http_proxy 或 $HTTP_PROXY)读取,可调用 http.ProxyFromEnvironment。
// 指定代理ip
func getTransportFieldURL(proxy_addr *string) (transport *http.Transport) {
	url_i := url.URL{}
	url_proxy, _ := url_i.Parse(*proxy_addr)
	transport = &http.Transport{Proxy : http.ProxyURL(url_proxy)}
	return
}

// 从环境变量$http_proxy或$HTTP_PROXY中获取HTTP代理地址
func getTransportFromEnvironment() (transport *http.Transport) {
	transport = &http.Transport{Proxy : http.ProxyFromEnvironment}
	return
}

第2步:构建请求与执行抓取

目的:发起 GET 请求并安全地读取响应内容。

  1. 入口/参数目标 url 和目标 proxy_addr。
  2. 动作:
    • 使用上一步的 Transport 创建 http.Client。
    • 使用 http.NewRequest 构建 GET 请求。
    • 调用 client.Do(req) 执行请求。
    • 检查状态码是否为 200,若是则读取 Body 并存为字符串;否则返回空值。
  3. 重要参数:必须确保在读取完 Body 后调用 resp.Body.Close() 以避免资源泄漏。
func fetch(url , proxy_addr *string) (html string) {
	transport := getTransportFieldURL(proxy_addr)
	client := &http.Client{Transport : transport}
	req, err := http.NewRequest("GET", *url, nil)
	if err != nil {
		log.Fatal(err.Error())
	}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err.Error())
	} 
	if resp.StatusCode == 200 {
		robots, err := ioutil.ReadAll(resp.Body);
		resp.Body.Close()
		if err != nil {
			log.Fatal(err.Error())
		}
		html = string(robots);
	} else {
		html = ""
	}
	return
}

第3步:主函数调用测试

目的:验证抓取功能。

func main() {
	proxy_addr := "http://183.221.250.137:80/"
	url := "http://www.baidu.com/s?wd=ip"
	html := fetch(&url, &proxy_addr)
	fmt.Println(html)
}

完成判断

程序运行后,控制台应打印出目标 URL 对应的 HTML 源码文本,且无报错输出。若状态码非 200,则 html 变量为空字符串。

简要总结

以上就是Go语言通过http抓取网页的详细方法,更多关于Go语言网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表