• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

GO语言工程在线词典和其实现

武飞扬头像
Poasy
帮助2

在线词典

以彩云科技提供的在线翻译为例。打开彩云翻译的网页,然后右键检查打开浏览器的开发者工具。

1.抓包

找到network 点击翻译按钮,浏览器会发送一系列请求,我们能很轻松地找到那个用来查询单词的请求。 学新通

找到这个dict post的请求

学新通

学新通 然后我们找到这个请求后,右键这个请求,copy一下,选择copy as cURL(bash)

2.生成代码

在 Golang 里面去发送这个请求。手写代码的话比较麻烦,在此老师提供了一种方法

打开老师提供的网站curlconverter.com/

获得以下代码,将这个代码粘贴到编辑器中

学新通

go
复制代码
package main

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

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{"trans_type":"en2zh","source":"nice"}`)
	req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)//创建请求
	if err != nil {
		log.Fatal(err)
	}
    //设置请求头
	req.Header.Set("authority", "api.interpreter.caiyunai.com")
	req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="8"`)
	req.Header.Set("sec-ch-ua-mobile", "?0")
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.1.4031 SLBChan/103")
	req.Header.Set("app-name", "xy")
	req.Header.Set("content-type", "application/json;charset=UTF-8")
	req.Header.Set("accept", "application/json, text/plain, */*")
	req.Header.Set("device-id", "19d327dca1394d0846bd1495388c4a91")
	req.Header.Set("os-type", "web")
	req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
	req.Header.Set("origin", "https://fanyi.caiyunapp.com")
	req.Header.Set("sec-fetch-site", "cross-site")
	req.Header.Set("sec-fetch-mode", "cors")
	req.Header.Set("sec-fetch-dest", "empty")
	req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
	req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
	resp, err := client.Do(req)//发起请求
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

将上述代码运行之后,我们可以得到

学新通

但是之前输入是固定的,我们是要从一个变量来输入,我们需要用到JSON序列化

3.生成解析 request body

因为请求得到的内容是个字符串,而且有很多不需要的信息,接下来就是要把得到的字符串转为JSON

需要定义一个结构体与请求后的response来对应起来用来接收数据,通过JSON反序列化到结构体里即可。

因为response返回的数据非常多而且复杂,自己书写起来很容易出错,所以我们可以通过在线生成代码工具来帮助我们生成代码。

JSON转结构体工具

打开这个网站,把浏览器response的内容复制到网站里点击转换-嵌套就能生成对应的结构体。

学新通

删除无用的字段,得到结果如下:

go
复制代码
type DictResp struct {
    Dictionary struct {
        Prons struct {
            EnUs string `json:"en-us"`
            En   string `json:"en"`
        } `json:"prons"`
        Explanations []string `json:"explanations"`
    } `json:"dictionary"`
}

接下来是对请求响应体进行JSON反序列化:

go
复制代码
var dictResp DictResp
err = json.Unmarshal(bodyText, &dictResp)
if err != nil {
        log.Fatal(err)
}
fmt.Println(word, "UK:", dictResp.Dictionary.Prons.En, "US:", dictResp.Dictionary.Prons.EnUs)
for _, item := range dictResp.Dictionary.Explanations {
        fmt.Println(item)
}
3.心得体会

本项目考察我们对爬取网站的基本能力的要求,重点在于序列化反序列化的相关处理,打开了我对网页抓包的新思路。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgajbhc
系列文章
更多 icon
同类精品
更多 icon
继续加载