使用golang爬取taptap排行榜数据,附源码

步骤

  1. 设置代理,不然可能被禁止访问
  2. 获取数据
  3. 解析数据放入结构体中
  4. 查询

运行

电脑需安装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 := `

(?s:(.*?))

//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

}



"


分享到:


相關文章: