说到爬虫,首先想到的当然是python~ 它在机器学习、爬虫数据分析领域可谓是如日中天,十分热门。但我是go的脑残粉,python能做的go都能做,python不能做的,go也能做。哈哈哈哈
TapTap社区这是一个高品质的游戏分享社区,可以说是手机上的steam。上面的用户质量非常高,核心玩家多,看到他们那么用心的写那么多长评论,让我惊叹,所以这次打算拿它来爬取数据练练手,下面先看看成果
这里的玩家,都喜欢玩啥类型游戏呀?根据 下载榜 里游戏标签的词频统计出:
发现单机、二次元、MOBA、策略等标签比较突出
让我们加入玩家评分的权重,评分是根据数以万计的玩家打的分数来的,多个游戏相同标签会求平均值。
看看有什么变化?
词云完全不一样了呢,视觉错位、脑洞、哲理等标签的评分较高,这些才是玩家真实的喜好,为啥加入评分权重变化这么大呢,让我们看一下究竟是哪些游戏评分这么高!
原来是纪念碑谷、猿骑、艾希等游戏。而纪念碑谷(tag:视觉错位)的评分竟然达到了10分!!(7951条评价)
不过这款游戏也确实让我服气,连我妈妈、老婆她们不太玩游戏的,都很喜欢这款游戏呢~
那么下面就都把评分权重加进去,看看玩家心里的真实需求
接着分析新品榜游戏名称(根据排名权重+评分权重)
看看我们分析出来的跟榜单上的有什么不一样?
可以看到,加入评分权重后,像《我叫MT4》、《王牌战争:代号英雄》这种虽然排名靠前,但是口碑很差的游戏,几乎在我们的分析图上就看不见啦。(所以在taptap上,就算你花钱刷榜上去了,也并没有太多用,玩家的眼睛是雪亮的,哈哈哈)
预约榜游戏名称(根据排名权重+评分权重)
这里可以看出未来市场的玩家需求,《全职觉醒》、《堡垒之夜》等都是期待比较高的
热玩榜游戏名称(根据排名权重+评分权重)
《绝地求生、刺激战场》也是突出游戏之一,看来taptap的玩家,也是很喜欢吃鸡的 实现方式
goquery解析html
iconv-go进行编码转换
sego用来中文分词
wordart实现词云效果
现在先做了个简单的版本,完整版是还想实现抓取某个游戏的玩家评论,进行分词,情感分析的。
先分析html结构,找到一个游戏信息里包含哪些html元素,然后用goquery解析
使用谷歌浏览器,按F12可以很方便的找到元素哦
然后定义一个结构体,用来存放数据
type GameInfo struct { Rank int //排名 TapTapID string //游戏ID Name string //游戏名 Company string //公司名 Score float64 //游戏评分 IconUrl string //图标地址 Type string //游戏类型 tags []string //标签 }分析单个游戏信息
//解析一个游戏信息 func ParseGameInfoCell(selection *goquery.Selection) { gameInfo := GameInfo{} nameA := selection.Find(".card-middle-title ") gameInfo.TapTapID = nameA.AttrOr("href", "") gameInfo.TapTapID = gameInfo.TapTapID[strings.LastIndex(gameInfo.TapTapID, "http://www.likecs.com/")+1:] gameInfo.Name = nameA.Find("h4").Text() gameInfo.Company = selection.Find(".card-middle-author").Find("a").Text() score, _ := strconv.ParseFloat(selection.Find(".middle-footer-rating").Find("span").Text(), 64) gameInfo.Score = score gameInfo.IconUrl = selection.Find(".card-left-image").Find("img").AttrOr("src", "") tempRank, _ := strconv.ParseInt(selection.Find(".top-card-order-text").Text(), 10, 32) gameInfo.Rank = int(tempRank) gameInfo.Type = selection.Find(".card-middle-footer").Find("a").Text() tagsAList := selection.Find(".card-tags").Find("a") tagsAList.Each(func(i int, selectionA *goquery.Selection) { gameInfo.tags = append(gameInfo.tags, selectionA.Text()) }) GameInfoList = append(GameInfoList, gameInfo) //fmt.Printf("%v\n", gameInfo) }