Go net-http库语言学习笔记

net/http库

平时学习go总是会遇到各种问题,排查起来特别困难,为了以后能够少走弯路,故而此类文章使用学习笔记后缀时常温习。

一个简单的net/http使用方法

直接以GET方法访问目标站点

通过golang自带的net/http库可以很方便的获取网页资源数据
只包含基本的http协议头部,由于很多网站对没有其它头部的http请求都做了防护处理,所以很多访问都是失败的,比如这个例子,能访问,但是结果是不对的。结果中应该会接受到:The Requested URL could not be retrieved这样的内容,意思是此请求不被接受。

package main

import (
    "bufio"
    "fmt"
    "net/http"
)

func main() {
  var url string = "https://www.163.com"
    var s string
  resp, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    if resp.StatusCode != 200 {
        s = "抓取" + url + "状态码不是200"
    fmt.Println(s)
    }

    if err != nil {
        s = "获取失败"
    fmt.Println(s)
    }
    readBody := bufio.NewScanner(resp.Body)
    for readBody.Scan() {
    fmt.Println(readBody.Text())
  }
}

这段代码是标准访问web方式,但是现在很多站点添加了或多或少的防爬虫策略,我们只是简单的访问,添加客户端代理标识,模拟为浏览器访问再试。

解决方法如下

自定义格式访问

指定部分http头部访问目标站点

package main

import (
    "bufio"
    "fmt"
    "net/http"
)

func main() {
  var url string = "https://www.163.com"
    var s string
    client := http.Client{}
    req, err := http.NewRequest("GET", url, nil)
  //添加refer来源,模拟标识本机是通过www.163.com这个站点跳转过来的,用于通过refer来源检测
    req.Header.Add("refer", "https://www.163.com")
  //添加http头部User-Agent代理信息,模拟本机是浏览器类型的访问
    req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36")
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    if resp.StatusCode != 200 {
        s = "抓取" + url + "状态码不是200"
    fmt.Println(s)
    }

    if err != nil {
        s = "获取失败"
    fmt.Println(s)
    }
    readBody := bufio.NewScanner(resp.Body)
    for readBody.Scan() {
    fmt.Println(readBody.Text())
  }
}

本文链接:目录"--EOF--