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请求,下一篇将会为大家讲述响应内容的数据清洗方式。
文章评论