首页 > go > GO语言 开发词典api

GO语言 开发词典api

重构之路

做一个音视频教育类小程序的时候,客户需求一个在线词典,需要做到点击文章某单词,可以实时弹出翻译和发音,网上找了好几天都没有类似词典api,甚至收费的也没有,可是竞品却有,于是我坚信这东西肯定是可以实现的。只好自己来动手,幸好知乎上有人已经用.net实现了,于是我照着其他人的思路用php也很快开发了一版,可能是php框架太重了访问速度不太理想,所以决定用go重构

开发流程

1、构建go结构体

2、用goquery抓取必应词典进行解析

3、正则匹配所需参数

4、gin微服务监听端口

5、结果json 输出

6、编译成二进制文件部署到需要的平台

目前:win10 64位, mac OSx 10 、linux centos7 均部署成功

代码

 

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"github.com/PuerkitoBio/goquery"
	"fmt"
	"regexp"
)

/*发音结构体*/
type Phonetic struct {
	Pronounce string
	Mp3       string
}

/*单词结构体*/
type Info struct {
	Pos string
	Def string
}

/*结果结构体*/
type dict struct {
	Word           string
	Phonetic       []Phonetic
	Interpretation []Info
}

func main() {

	router := gin.Default() //初始化

	router.GET("/dict", func(c *gin.Context) {

		//get 参数获取
		word := c.Query("word")
		c.JSON(http.StatusOK, getdict(word))

	})

	router.Run(":8080")

}

func getdict(word string) dict {
	var dicts dict
	var ImageDatas []Info
	var Phonetics []Phonetic

	//拼接url
	url := "https://cn.bing.com/dict/"
	url += word

	doc, err := goquery.NewDocument(url)

	if err != nil {

		fmt.Println(err)
	}

	//获取要抓取的区域
	dom := doc.Find(".qdef")

	def_num := dom.Find("ul li").Length()
	for i := 0; i < def_num; i++ {

		tpos := dom.Find("ul li .pos").Eq(i).Text()
		tdef := dom.Find("ul li .def").Eq(i).Text()
		ImageDatas = append(ImageDatas, Info{tpos, tdef})

	}

	mp3_num := doc.Find(".hd_p1_1 .hd_tf").Length()
	for i := 0; i < mp3_num; i++ {

		msfy := doc.Find(".hd_p1_1 .hd_tf").Eq(i).Prev().Text()
		mp3, _ := doc.Find(".hd_p1_1 .hd_tf .bigaud").Eq(i).Attr("onmouseover")

		reg := regexp.MustCompile(`https:\/\/\S+.mp3`)
		mp3url := reg.FindAllString(mp3, -1)

		Phonetics = append(Phonetics, Phonetic{msfy, mp3url[0]})

	}

	//返回结果
	dicts.Word = doc.Find("#headword").Text()
	dicts.Phonetic = Phonetics
	dicts.Interpretation = ImageDatas

	return dicts

}

最终效果 http://127.0.0.1:8080/dict?word=message

GO语言 开发词典api - 第1张  | 博客一个