Go语言实现带代理的HTTP网页抓取
本文展示如何使用 Go 语言的标准库 net/http 进行网页抓取,重点涵盖两种代理配置方式:指定固定 IP 代理和自动读取环境变量。通过封装 HTTP 客户端并处理响应体,实现稳定获取页面 HTML 源码。
准备条件
使用 Go 标准库即可实现,无需引入第三方依赖。主要涉及以下核心包:
fmt:用于输出结果。log:用于错误日志记录。net/http:核心网络请求库。net/url:解析代理地址 URL。io/ioutil:读取响应数据(注:Go 1.16+ 推荐使用io和os)。
真实操作顺序
第1步:配置代理传输层
目的:根据需求选择静态代理或环境代理,确保网络请求通过指定出口发送。
- 入口/参数:
proxy_addr字符串指针,格式为http://host:port。 - 动作:解析代理地址并创建
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 请求并安全地读取响应内容。
- 入口/参数目标
url和目标proxy_addr。 - 动作:
- 使用上一步的 Transport 创建
http.Client。 - 使用
http.NewRequest构建 GET 请求。 - 调用
client.Do(req)执行请求。 - 检查状态码是否为 200,若是则读取 Body 并存为字符串;否则返回空值。
- 使用上一步的 Transport 创建
- 重要参数:必须确保在读取完 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语言网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









