【golang】2、http client、爬图

这篇具有很好参考价值的文章主要介绍了【golang】2、http client、爬图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【golang】2、http client、爬图

用 golang 可以很方便的爬图(http 下载图片,存储为 jpg 格式)。

一、http client

http client 有如下最佳实践:

  • 尽量用 default http client:默认的 http client 设置了很多合适的参数(如超时、连接池),也便于在各请求间复用(如先将获取到的 token 存储到 client 内,后续所有请求都可用此 token)
  • 要设置 timeout:防止因网络 or 下游 server 的问题,而盲等,导致自己阻塞,降低拥堵体验
  • 谨慎处理 redirects:若 server 不存在某资源时可能会用 3xx redirect 到新目的地。然而若 client 未合适处理,可能导致 loop redirect。因此需要如下做法:
    • 校验 redirect url
    • 限制 redirect 次数
  • reuse connections:可用连接池实现,可减少新建连接的开销、降低延迟、增加流量。
  • 默认会打开 Keep-Alive,除非需求是在一个连接上的数据请求密度不高则可手动关闭。详见实验

二、反向代理

正向代理、反向代理 区别文章来源地址https://www.toymoban.com/news/detail-461829.html

2.1 http

package main

import (
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
)

// NewProxy 拿到 remoteURL 后,创建一个反向代理
func NewProxy(remoteURL string) (*httputil.ReverseProxy, error) {
	remote, err := url.Parse(remoteURL)
	if err != nil {
		return nil, err
	}

	proxy := httputil.NewSingleHostReverseProxy(remote)
	proxy.Director = func(req *http.Request) {
		//req.Header = ctx.Request.Header
		req.Host = remote.Host
		req.URL.Scheme = remote.Scheme
		req.URL.Host = remote.Host
		req.URL.Path = "/metrics"
	}

	return proxy, nil
}

// ProxyRequestHandler 使用 proxy 处理请求
func ProxyRequestHandler(proxy *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
	return func(w http.ResponseWriter, r *http.Request) { proxy.ServeHTTP(w, r) }
}

func main() {
	proxy, err := NewProxy("http://127.0.0.1:7000/metrics") // 初始化反向代理并传入真正后端服务的地址
	if err != nil {
		panic(err)
	}
	http.HandleFunc("/api/proxy/metrics", ProxyRequestHandler(proxy)) // 使用 proxy 处理所有请求到你的服务
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2.2 gin

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"net/http/httputil"
	"net/url"
)

// NewProxy 拿到 remoteURL 后,创建一个反向代理
func NewProxy(remoteURL string) (*httputil.ReverseProxy, error) {
	remote, err := url.Parse(remoteURL)
	if err != nil {
		return nil, err
	}

	proxy := httputil.NewSingleHostReverseProxy(remote)
	proxy.Director = func(req *http.Request) {
		//req.Header = ctx.Request.Header
		req.Host = remote.Host
		req.URL.Scheme = remote.Scheme
		req.URL.Host = remote.Host
		req.URL.Path = "/metrics"
	}

	return proxy, nil
}

func proxy(c *gin.Context) {
	proxy, err := NewProxy("http://127.0.0.1:7000/metrics") // 初始化反向代理并传入真正后端服务的地址
	if err != nil {
		panic(err)
	}
	proxy.ServeHTTP(c.Writer, c.Request)
}

func main() {
	r := gin.Default()
	r.GET("/api/proxy/metrics", proxy)
	r.Run(":8080")
}

三、爬取并存储 jpg

package clients

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"io"
	"net/http"
	"os"
	"strings"
	"time"
)

var httpCli = &http.Client{
	Timeout: 10 * time.Second,
}

type spiderCli struct {
	httpCli *http.Client
	txtFile *os.File
}

func Spider() *spiderCli {
	txtFile, err := os.OpenFile(configs.TxtFileName(), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		logrus.Fatal(err)
	}
	return &spiderCli{
		httpCli: httpCli,
		txtFile: txtFile,
	}
}

func (c *spiderCli) Download(url string) ([]byte, error) {
	res, err := c.httpCli.Get(url)
	if err != nil {
		return nil, err
	}
	defer res.Body.Close()

	if res.StatusCode == http.StatusNotFound {
		return nil, fmt.Errorf("got invalid status code: %v", res.StatusCode)
	}
	return io.ReadAll(res.Body)
}

// Save img.jpg and txt
func (c *spiderCli) Save(fid int64, bytes []byte, plateText, plateColor, plateType string) error {
	// img
	fImgName := fmt.Sprintf("%v.jpg", fid)
	fImg, err := os.Create(fImgName)
	if err != nil {
		return err
	}
	defer fImg.Close()
	writtenImg, err := fImg.Write(bytes)
	if err != nil {
		return err
	}
	if writtenImg == 0 {
		os.Remove(fImgName)
	}
	// txt
	line := strings.Join([]string{fImgName, plateText, plateColor, plateType}, ",")
	writtenTxt, err := c.txtFile.WriteString(line + "\n")
	_ = writtenTxt
	return err
}

func (c *spiderCli) Close() {
	c.txtFile.Close()
}

到了这里,关于【golang】2、http client、爬图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ChatGLM3】(7):在autodl上,使用A50显卡,使用LLaMa-Factory开源项目对ChatGLM3进行训练,非常方便的,也方便可以使用多个数据集

    https://www.bilibili.com/video/BV1GN411j7NP/ 大模型训练利器,使用LLaMa-Factory开源项目,对ChatGLM3进行训练,特别方便,支持多个模型,非常方方便 更多ChatGPT技术文章: https://blog.csdn.net/freewebsys/category_12270092.html 项目地址: https://github.com/hiyouga/LLaMA-Factory LLaMA Board: 通过一站式网页界面

    2024年02月05日
    浏览(29)
  • VSCode-下载安装-远程连接linux(方便容器编排格式学习)

    下载安装请参考 VSCode下载教程 https://blog.csdn.net/weixin_43121885/article/details/131779104?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170812811316800211530507%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257Drequest_id=170812811316800211530507biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_posit

    2024年02月21日
    浏览(32)
  • 请领取你的免费云电脑:微软Windows实验虚拟机,每天可以免费使用两个小时,上Google搜资料很方便

    对于没有国外VPS的我,又需要上Google查学习资料的我来说,简直是天上掉馅饼,不用白不用,下面简单描述说明一下免费申请使用微软(Microsoft)学习实验虚拟机的流程,   微软在在财务和运营应用中实施常见集成功能,提供了办公软件集成教学的虚拟机,我们可以利用此Wi

    2024年02月05日
    浏览(34)
  • ensp基础配置--建立简单的http端,DNS端,Client端,且能够在Client利用域名访问http端

    1.拓扑图(搭建设备,并配置各设备的IP地址和子网掩码)  2.打开路由器配置两个接口IP地址 3.给4个pc手动添加IP地址,网关和子网掩码  5.点开Server1 作为http端      (1)手动配置IP地址,网关和子网掩码      (2)点击服务器信息 找到HttpServer 在配置选项中添加文件并启动

    2024年02月05日
    浏览(39)
  • ES的两种认证登录方式: JAVA REST Client/HTTP Client

    通过RestHighLevelClient发送的es请求验证方式: 通过http直接发送的es请求认证方式:

    2024年02月16日
    浏览(28)
  • 放一个Supershell的github下载链接在这里,方便大家用(文章转载自雨苁)

    Supershell是一个通过WEB服务访问的C2远控平台,通过建立反向SSH隧道,获取完全交互式Shell,支持多平台架构Payload. Supershell是一个集成了reverse_ssh服务的WEB管理平台,使用docker一键部署,支持团队协作进行C2远程控制,通过在目标主机上建立反向SSH隧道, 获取真正的完全交互式

    2024年02月19日
    浏览(29)
  • 你还在用 Postman?IDEA REST Client 好用到爆,Postman 可以扔了

    语法部分 演示POST请求 POST {{baseUrl}}}get?show_env=1 Accept: application/json { “name”:“a” } 演示GET请求 GET {{baseUrl}}}/post Content-Type: application/x-www-form-urlencoded id=999value=content 首先通过###三个井号键来分开每个请求体,然后请求url和header参数是紧紧挨着的,请求参数不管是POST的body传参

    2024年04月12日
    浏览(33)
  • 20、Flink SQL之SQL Client: 不用编写代码就可以尝试 Flink SQL,可以直接提交 SQL 任务到集群上

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月11日
    浏览(33)
  • Java 11 HTTP Client库的使用

    每种编程语言里最常用的库恐怕是Http请求库了,如python里的requests包,nodejs里的request模块。 在Java世界里,也是百花齐放,山头林立。常用的有: HttpURLConnection: 最早的JDK提供的类 Java 11提供的HttpClient Apache HttpComponents项目中的HTTPClient Square提供的OkHttpClient Spring 自带的WebClien

    2024年02月09日
    浏览(26)
  • 记一次Apache HTTP Client问题排查

    通过日志查看,存在两种异常情况。 第一种:开始的时候HTTP请求会报超时异常。 762663363 [2023-07-21 06:04:25] [executor-64] ERROR - com.xxl.CucmTool - CucmTool|sendRisPortSoap error,url:https://xxxxxx/realtimeservice/services/RisPort org.apache.http.conn.HttpHostConnectException: Connect to xxx [/xxx] failed: 连接超时 第二种

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包