非零基础自学Golang 第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.3 发起GET请求

news2024/12/28 5:00:19

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第17章 HTTP编程(上)
        • 17.2 HTTP客户端
          • 17.2.3 发起GET请求

第17章 HTTP编程(上)

17.2 HTTP客户端

17.2.3 发起GET请求

从现在开始我们将会学习如何使用Go语言模拟浏览器发起HTTP请求。

发起请求前需要创建一个请求对象,使用NewRequest创建。

func NewRequest(method, urlStr string, body io.Reader) (*Request, error)

NewRequest使用指定的方法、网址和可选的body创建并返回一个新的*Request。我们先来看如何发起一个GET请求:

[ 动手写 17.2.1 ]

package main

import (
   "fmt"
   "net/http"
)

func main() {

   client := &http.Client{}

   request, err := http.NewRequest("GET", "http://www.baidu.com", nil)

   if err != nil {
      fmt.Println(err)
   }

   response, err := client.Do(request)
   fmt.Println(response.StatusCode)
}

动手写17.2.1对百度网站发起了一次GET请求,程序的主要流程为创建了一个客户端对象client和一个请求对象request,分别对其进行初始化,request初始化需要提供请求方法和请求地址。

这两个对象初始化后,client客户端调用Do方法发起一次请求并获得服务端的响应,最后程序打印出响应的状态码,执行结果如下:

在这里插入图片描述

如果想要打印响应的主要内容body,可以使用标准包ioutil中的ReadAll方法来读取响应的流数据。

当然现在 2022年12 月7日,现版本的Go 已经过时了很多 ioutil,用io代替

[ 动手写 17.2.2]

package main

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

func main() {

   client := &http.Client{}

   request, err := http.NewRequest("GET", "http://www.baidu.com", nil)

   if err != nil {
      fmt.Println(err)
   }

   response, err := client.Do(request)
   res, err := io.ReadAll(response.Body)

   if err != nil {
      fmt.Println(err)
   }

   // 打印body
   fmt.Println(string(res))
}

动手写17.2.2发起请求并打印输出了响应内容body,由于Body的类型为io.ReadCloser,不能直接读取其中的内容,需要通过io.ReadAll读取,返回字节数组,最后转化成字符串进行输出。

运行结果如下:

在这里插入图片描述

反正就是 一堆,没毛病

当一个网站有一些资源需要登录后才能访问时,我们希望能够通过Go语言实现批量自动化爬取这些内容,那如何让服务器知道我们用Go编写的爬虫客户端是已登录状态?这就需要设置使用Cookie,Cookie通常用来标识客户端的登录状态。

Request实例可以使用AddCookie方法给请求添加Cookie。

[ 动手写 17.2.3]

package main

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

func main() {

   client := &http.Client{}

   request, err := http.NewRequest("GET", "http://www.baidu.com", nil)

   if err != nil {
      fmt.Println(err)
   }

   // 使用http.Cookie 结构体初始化一个 cookie 键值对
   cookie := &http.Cookie{Name: "userId", Value: strconv.Itoa(12345)}

   // 使用前面构建的 request 方法AddCookie 往请求中添加Cookie
   request.AddCookie(cookie)
   request.AddCookie(&http.Cookie{Name: "session", Value: "YWRtaW4="})

   response, err := client.Do(request)
   fmt.Println(response.Request.Cookies())
}

动手写17.2.3使用AddCookie添加了userId和session两个Cookie,通常服务端使用session来判断客户端是否为登录用户,运行结果如下:

在这里插入图片描述

做了反爬策略的网站,一般都会根据Header头中的User-Agent的值解析判断是浏览器还是爬虫,这时我们需要设置成浏览器的UA来绕过这类反爬策略。

Request可以直接使用request.Header.Set(key,value)来设置Header。

[ 动手写 17.2.4]

package main

import (
   "fmt"
   "net/http"
)

func main() {
   client := &http.Client{}
   request, err := http.NewRequest("GET", "http://www.baidu.com", nil)
   if err != nil {
      fmt.Println(err)
   }
   // 设置request的Header,具体可参考http协议
   request.Header.Set("Accept", "text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8")
   request.Header.Set("Accept-Charset", "GBK, utf-8;q=0.7, *;q=0.3")
   request.Header.Set("Accept-Encoding", "gzip, deflate, sdch")
   request.Header.Set("Accept-Language", "zh-CN, zh;q=0.8")
   request.Header.Set("Cache-Control", "max-age=0")
   request.Header.Set("Connection", "keep-alive")
   request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
   response, err := client.Do(request)
   
   fmt.Printf("%#v", response.Request.Header)
}

动手写17.2.4使用了自定义的Header来发起请求,运行结果如下:

在这里插入图片描述

在上一小节中,我们提到了Client类型含有GET方法,而GET方法是对Do方法的封装,使用GET方法可以快速发起一个GET请求。

http包中也有一个叫GET的方法,底层就是调用Client的GET方法。

[ 动手写17.2.5]

package main

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

func main() {

   // http.Get 实际上是DefaultClient.Get(url), Get 函数是高度封装的, 只有一个参数url
   // 对于一般的 http Request 是可以使用, 但是不能定制 Request

   response, err := http.Get("http://www.baidu.com")
   if err != nil {
      fmt.Println(err)
   }

   defer response.Body.Close()

   body, _ := io.ReadAll(response.Body)
   fmt.Println(string(body))
}

运行结果

在这里插入图片描述

OK,没问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WINDOWS下安装ORACLE客户端报错:无法访问临时位置

WINDOWS2016(虚拟机)安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。 操作 - 请确保当前用户具有访问临时位置所需的权限。 附加信息: …

【DETR目标检测】关键词:Decoder。Encoder。query向量。注意力机制。

声明:仅学习使用~ 目录 1、目标检测的基本思想2、整体网络架构3、位置信息初始化query向量4、注意力机制的作用方法5、训练过程的策略1、目标检测的基本思想 2015年,faster-rcnn; 2016年,YOLO; NMS:非极大值抑制; 2、整体网络架构 backbone 即先通过CNN 拿到每个pat…

Transformers18~ Diffusion

还是Transformers,来自 UC 伯克利的 William Peebles 以及纽约大学的谢赛宁撰文揭秘扩散模型中架构选择的意义,并为未来的生成模型研究提供经验基线。 近几年,在 Transformer 的推动下,机器学习正在经历复兴。过去五年中,用于自然…

【概述】请求报文在网络各层中的具体传输

请求报文在网络各层中的具体传输电脑中之间的通信,可以看成为两个应用进程之间的通信;一个请求从客户端到服务器端,通常需要经过三个阶段: 客户端路由转发阶段服务器端 客户端请求服务端 请求在客户端中每一层的具体传输数据 应…

LeetCode 322 周赛

2490. 回环句 句子 是由单个空格分隔的一组单词,且不含前导或尾随空格。 例如,"Hello World"、"HELLO"、"hello world hello world" 都是符合要求的句子。 单词 仅 由大写和小写英文字母组成。且大写和小写字母会视作不…

【Call for papers】2023年CCF-A类会议截稿日期(实时更新)

会议简称会议名称类别截稿日期链接S&P-2023IEEE Symposium on Security and Privacy网络与信息安全2022年12月2日Call for papersUSENIX ATC-2023USENIX Annul Technical Conference计算机体系结构/并行与分布计算/存储系统2023年1月12日Call for papersIJCAI-2023Internat…

H5后台读写CAD文件

说明 后台提供mxconvert.js程序,该程序使用JS编程,可以在后台实现读写CAD文件、读取CAD图纸数据等操作。 如何使用mxconvert.js转CAD图纸到梦想格式 1.Windows调用,进入 Bin\Release目录,命令行调用 node.exe mxconvert.js 1.d…

【推荐】动力锂电池及BMS系统介绍资料合集

锂动力电池是20世纪开发成功的新型高能电池。这种电池的负极是金属锂,正极用MnO2,SOCL2,(CFx)n等。70年代进入实用化。因其具有能量高、电池电压高、工作温度范围宽、贮存寿命长等优点,已广泛应用于军事和民用小型电器中&#xff…

部署AI平台 宝马集团正在掀起新一轮数字化改革浪潮

数字化转型作为当代企业创新求变的重要突破口,成为各行各业推进持续发展的大热趋势。但在企业的在数字化征程中,却暗藏多重陷阱,数据孤岛、标准不一、质量太差、治理滞后、安全隐患等挑战,如影随形。 近日,宝马集团宣布…

125页6万字智慧城市系统及智慧城市运营中心建设技术方案

目 录 1. 智慧城市系统概述 1.1 前言 1.2 什么是智慧城市? 1.3 智慧城市的总体目标 1.4 智慧城市如何建设 1.5 智慧城市组成和架构 1.6 智慧城市总体功能 1.6.1 城市运营中心门户 1.6.2 城市事件管理服务 1.6.3 城市运维管理服务 1.6.4 数据挖掘 1.6.4…

【Unity大气散射】GAMES104:3A中如何实现大气散射

写在前面 前两天学习并整理的大气散射基础知识:【Unity大气渲染】关于单次大气散射的理论知识,收获了很多,但不得不承认的是,这其实已经是最早的、90年代的非常古老的方法了,后来也出现了一些优化性的计算思路和方法。…

解决金仓数据库KingbaseES V8R3 由于修改系统时间导致sys_rman备份故障的问题

案例说明: 此案例,为复现“current time may be rewound”错误。对于数据库环境,在使用前必须保证系统时间的正确性。如果数据库创建后,再将系统时间修改为创建数据库之前的时间,在运行过程中将有可能导致新老事务判断…

Beego框架项目搭建步骤

1、执行 go env 指令,将输出当前 Go 开发包的环境变量状态。 GOARCH 表示目标处理器架构。 GOBIN 表示编译器和链接器的安装位置。 GOOS 表示目标操作系统。 GOPATH 表示当前工作目录。 GOROOT 表示 Go 开发包的安装目录。 2、安装beego 输入 go get github.com/as…

IB近三年的改革及未来发展趋势

【转自京领新国际】 据不完全统计,截至目前,IB课程已在全球160余个国家的5667所学校开设,其中,中国大陆有267所学校获得了IB认证。由于IB的教育理念非常适应创新性人才的培养需要,它也越来越被学校、家长和学生认可。那…

论文阅读 - On the efficacy of old features for the detection of new bots - CCF B

目录 摘要: 1.导言 2.文献综述 3 数据集 4.特征集 4.1 CAP_UNI Botometer分数 4.2.与帐户配置文件/时间线相关的功能 4.3.非官方Twitter账户发送的推文比例 4.4.实验装置 5. 实验结果 5.1. Celebrity-Botwiki 5.2. Verified-Botwiki 5.3. Verified-Vendo…

什么是APERAK?

APERAK(Application error and acknowledgement message)是由消息接收方发出的应用程序错误和确认信息。其目的是: a) 通知消息发送方他的消息已经被消息接收方收到,由于业务系统在处理过程中遇到错误,已被拒绝。 b) 向消息发送方确认消息已…

使用tushare数据画疫情感染人数地图

总是看到网上有各种各样的可以用地图来展示某一地区的情况,如GDP的增速、人口的变化等,于是就想想这个问题是否能用python来实现,经查阅资料发现,用python来画地图其实也并不难,做好数据和地图的关联就可以实现。 一、…

移动WEB开发之响应式布局--响应式开发

响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 原理就是在不同屏幕下,通过媒体查询来改变这个布局…

洞察市场需求,深耕大健康赛道,缤跃酒店打造一站式运动酒店品牌

近期,人民数据研究院发布《2022全民跑步运动健康报告》,报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压,2022年18-40岁的跑者开始成为中坚力量&…

一文搞懂测试左移和测试右移的 Why-How-What

1080306 6.35 KB 软件测试技术应当贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其核心目标是尽快尽早地发现软件产品中所存在的各种问题 bug—— 与用户需求、预先定义的不一致性。 然而,传统…