GoLang的标准库net/http可以实现client和server的功能开发。简单来说,client就是我们向服务器发送HTTP请求,常用于访问API接口获取相应数据、开发网络爬虫等功能;server是开发服务器web应用,也就说我们常说的网站开发。

GET请求

本博文讲述如何使用GoLang的标准库net/http开发网络爬虫,我们首先以HTTP的GET请求为例,该请求实现自定义请求头、设置Cookies信息和设置代理IP,这三个功能满足大多数网络爬虫的开发需求,详细代码如下。

package main

import (
	"fmt"
	"github.com/axgle/mahonia"
	"io/ioutil"
	"net/http"
	"net/url"
	"time"
)

//使用第三方mahonia实现网页内容的转码
func ConvertToString(src string, srcCode string, tagCode string) string {
	srcCoder := mahonia.NewDecoder(srcCode)
	srcResult := srcCoder.ConvertString(src)
	tagCoder := mahonia.NewDecoder(tagCode)
	_, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
	result := string(cdata)
	return result
}


func main() {
	urls := "https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html"
	//定义请求对象NewRequest,参数method可以为GET和POST
	// 参数url为发送请求的网址,body为请求参数,若为GET请求,设为nil即可
	req, err := http.NewRequest("GET",urls, nil)
	if err != nil {
		// handle error
	}

	//为请求对象NewRequest设置请求头
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36")

	//设置Cookies信息
	cookie := http.Cookie{Name: "clientcookieid", Value: "121", Expires: time.Now().Add(111 * time.Second)}
	req.AddCookie(&cookie)

	//设置代理IP,代理IP必须以为fun形式表示
	// 因为Transport的Proxy是以函数方法形式命名
	proxy := func(_ *http.Request) (*url.URL, error) {
		return url.Parse("http://111.231.93.66:8888")
	}
	transport := &http.Transport{Proxy: proxy}
	//在Client对象设置参数Transport即可实现代理IP
	client := &http.Client{Transport: transport}

	//执行HTTP请求
	resp, err := client.Do(req)
	//获取HTTP请求的响应内容
	if err != nil {
		fmt.Println(err.Error())
	}

	//读取响应内容
	body, err := ioutil.ReadAll(resp.Body)
	//将响应内容转换utf-8编码
	result := ConvertToString(string(body), "gbk", "utf-8")
	if err != nil {
		fmt.Println(err.Error())
	}
	//输出网页内容
	fmt.Println(result)

	//输出响应内容的Cookies信息
	for _, v := range resp.Cookies() {
		fmt.Println(v)
	}
}


上述代码中,github.com/axgle/mahonia是第三方的包,因此我们需要在CMD窗口输入安装指令。

go get github.com/axgle/mahonia

POST请求

如果上述代码改为POST请求,可以将请求对象NewRequest改为POST请求方式,代码如下。

// 将req, err := http.NewRequest("GET",urls, nil)改为:
// strings.NewReader("name=cjb")为请求参数data
req, err := http.NewRequest("POST", urls, strings.NewReader("name=cjb"))

简单的HTTP请求

上述的POST和GET请求都是基于请求对象NewRequest的基础上实现的,它能根据开发需求设置不同的Cookies、请求头和代理IP。如果我们只是想实现简单的POST和GET请求,可以使用标准库的Get和Post方法,详细代码如下。

// 使用此方法,第二个参数要设置成”application/x-www-form-urlencoded”,否则请求参数无法传递。
resp, err := http.Post(urls, "application/x-www-form-urlencoded", strings.NewReader("name=cjb"))

// PostForm方法参数data必须为url.Values格式,url.Values来自标准库"net/url"
resp, err := http.PostForm(urls, url.Values{"key": {"Value"}, "id": {"123"}})

// Get方法只有参数url
http.Get(urls)

本博文只讲述如何使用标准库net/http实现网络爬虫的HTTP请求,下一篇将会为大家讲述响应内容的数据清洗方式。