步骤
- 设置代理,不然可能被禁止访问
- 获取数据
- 解析数据放入结构体中
- 查询
运行
电脑需安装go环境,运行go run main.go即可
package main
import (
"bufio"
"fmt"
"io/ioutil"
"net/http"
"os"
"regexp"
"strconv"
"strings"
)
//获取到网页内容
func getResponse(url string) (resultData string) {
client := &http.Client{
}
request, _ := http.NewRequest("GET", url, nil)
request.Header.Set("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")
response, err := client.Do(request)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()
result, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println(err)
}
return string(result)
}
func main() {
url := "https://www.taptap.com/ajax/top/download?page=1"
resultData := getResponse(url)
gameData := &GameData{}
gameData = ParseData(resultData)
//测试
fmt.Println("第1页数据,共:", len(gameData.games), "条")
for {
fmt.Print("请输入你需要查询的游戏:")
input := bufio.NewReader(os.Stdin)
query, _ := input.ReadString('\\n')
if strings.ToLower(query)=="q\\n"{
fmt.Println("结束查询,系统退出")
os.Exit(0)
}else{
query = strings.TrimSpace(query)
fmt.Println("你查询的游戏为:", query)
fmt.Println(gameData.games[query])
}
}
}
//解析数据
//抽取一个方法为将unicode编码转中文字符
//需要传入一个unicode编码的字符
func uniToCh(unicodestr string) (name string) {
//去除掉结尾的换行符
newV := strings.ReplaceAll(unicodestr, `\\n`, ``)
//去除掉所有的空格符号
strUni := strings.TrimSpace(newV)
//通过\\\\u字符来切割字符串
noU := strings.Split(strUni, `\\\\u`)
//去除掉第一个内容
noU = noU[1:]
//fmt.Println(noU)
//定义名字来接受转换后的中文
for _, n := range noU {
if len(n) > 4 {
n1 := n[:4]
n2 := n[4:]
s1, _ := strconv.ParseUint(n1, 16, 64)
name += fmt.Sprintf("%c%s", s1, n2)
} else {
signalStr, _ := strconv.ParseUint(n, 16, 64)
name += fmt.Sprintf("%c", signalStr)
}
}
return name
}
//抽取根据正则表达式获取数据的方法
func getData(startData string, pattern string) (resultList []string) {
reg := regexp.MustCompile(pattern)
data := reg.FindAllStringSubmatch(startData, -1)
//fmt.Println(len(data))
for _, v := range data {
if len(v[1]) < 4 {
resultList = append(resultList, v[1])
} else {
endData := uniToCh(v[1])
resultList = append(resultList, endData)
}
}
return resultList
}
//定义每一个游戏的结构体
type GameItem struct {
name string
productor string
point string
content string
tabs []string
sort string
iconSrc string
gameType string
imgSrc []string
}
//所有游戏集中在GameData中以map形式存在
type GameData struct {
games map[string]GameItem
}
//定义解析数据的方法
func ParseData(resultData string) (*GameData) {
gameData := &GameData{
}
//获取到的游戏名字列表
var nameList []string
//获取到的游戏厂商名字列表
var productorList []string
//获取到的游戏评分列表
var pointList []string
//获取游戏介绍列表
var contentList []string
//获取游戏标签列表
var tabsList [][]string
//获取游戏排名列表
var sortList []string
//获取游戏图标列表
var iconList []string
//获取游戏图标列表
var typeList []string
//获取游戏截图列表
var imgList [][]string
//获取游戏名字
gameName := `
(?s:(.*?))
//获取游戏厂商
gameProductor := ` (?s:(.*?))
//获取游戏评分
gamePoint := `(?s:(.*?))
//获取游戏介绍
gameContent := `description\\\">(?s:(.*?))
//获取游戏标签
gameTabs := `card-tags\\\">(?s:(.*?))`
gameTab := `(?s:(.*?))`
//获取游戏排名
gameSort := `\\\">([0-9]+)`
//获取游戏排名
gameIcon := `
//获取游戏排名
gameType := `www.taptap.com\\\\/category\\\\/(?s:(.*?))\\\" >(?s:(.*?))
//获取游戏截图
gameImgs := `
//gameImgs2:=`card-right-image\\\">(?s:(.*?))`
gameImgs3 := `
nameList = getData(resultData, gameName)
productorList = getData(resultData, gameProductor)
pointList = getData(resultData, gamePoint)
contentList = getData(resultData, gameContent)
//添加游戏标签列表
reg := regexp.MustCompile(gameTabs)
re := reg.FindAllStringSubmatch(resultData, -1)
for _, second := range re {
tabList := getData(second[1], gameTab)
tabsList = append(tabsList, tabList)
}
sortList = getData(resultData, gameSort)
//获取游戏icon
reg = regexp.MustCompile(gameIcon)
re = reg.FindAllStringSubmatch(resultData, -1)
for _, img := range re {
imgstring := strings.ReplaceAll(img[1], "\\\", "")
iconList = append(iconList, imgstring)
}
//获取游戏类型
reg = regexp.MustCompile(gameType)
re = reg.FindAllStringSubmatch(resultData, -1)
for _, gameType := range re {
typeList = append(typeList, uniToCh(gameType[2]))
}
//获取游戏截图
reg = regexp.MustCompile(gameImgs)
re = reg.FindAllStringSubmatch(resultData, -1)
//每个游戏的list,存放的没有格式化的字符串
list := []string{}
for _, g1 := range re {
list = append(list, g1[2])
}
for _, g2 := range list {
reg = regexp.MustCompile(gameImgs3)
re = reg.FindAllStringSubmatch(g2, -1)
list1 := []string{}
for _, g3 := range re {
s1 := strings.ReplaceAll(g3[1], "\\\", "")
header := "https://img.tapimg.com/market/images/"
img := header + s1
list1 = append(list1, img)
}
imgList = append(imgList, list1)
}
//如果gameData里面没有这个游戏,就加进去
gameData.games = make(map[string]GameItem)
for i := 0; i < len(nameList); i++ {
if _, ok := gameData.games[nameList[i]]; !ok {
//如果没有就添加进去
gameData.games[nameList[i]] = GameItem{
name: nameList[i],
productor: productorList[i],
point: pointList[i],
content: contentList[i],
tabs: tabsList[i],
sort: sortList[i],
iconSrc: iconList[i],
gameType: typeList[i],
imgSrc: imgList[i],
}
}
}
return gameData
}
閱讀更多 比逗的冷高 的文章