【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云
serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版,是全Serverless架构的云原生数据库
前言
体验了一下腾讯云刚出的TDSQL-C Serverless,使用它存储数据比较方便,能根据负载动态扩容,现在我们正好用来爬下数据分析一下。
数据源
processOn是比较常用的画图平台,它的模版也是比较丰富,但是基本上都要钱。。。
现在我们爬一下数据,看下这些推荐的模版标题的构成,即什么样的词汇比较容易被推荐,还有它的价格分布是怎样的
项目目录
config存储配置文件,dao负责链接数据库,logic下面就是具体的逻辑,包括爬虫、分析、词云分词。
爬虫
具体爬虫代码如下,这里才有异步存储,也正好测试下数据库的性能如何
import (
"fmt"
"github.com/anaskhan96/soup"
"github.com/spf13/cast"
"strings"
"sync"
"td_test/logic/wordcloud"
)
func Crawl(url string) error {
res, err := soup.Get(url)
if err != nil {
return err
}
var wg sync.WaitGroup
doc := soup.HTMLParse(res)
// 模版列表
tempList := doc.FindAll("div", "class", "list-item-content")
for _, item := range tempList {
// 模版详情数据
detail := item.Find("div", "class", "temp-item-detail")
title := detail.Find("h2").Text()
// view clone like数量
var countList []int
for _, count := range detail.FindAll("span", "class", "count") {
countList = append(countList, cast.ToInt(count.Text()))
}
// 获取价格
owner := item.Find("div", "class", "temp-item-owner")
priceStr := owner.Find("span", "class", "count").Text()
var price float32
if priceStr != "免费" {
priceStr = strings.Trim(priceStr, "¥")
price = cast.ToFloat32(priceStr)
}
// 异步存储
go func() {
wg.Add(1)
defer wg.Done()
saveToDB(title, countList, price)
// 对标题进行分词并存储
wordcloud.SplitTitleAndSave(title)
}()
}
wg.Wait()
return nil
}
分词
分词库用的是结巴分词,直接用它的精准模式即可
import (
"github.com/yanyiwu/gojieba"
)
var splitClient *gojieba.Jieba
func init() {
splitClient = gojieba.NewJieba()
}
func SplitTitleAndSave(title string) {
words := splitClient.Cut(title, true)
for i := range words {
m := &TemplateTitleWordModel{Word: words[i]}
m.Save()
}
return
}
分析词云和价格饼状图
词云和饼状图都是用的github.com/go-echarts/go-echarts,使用比较简单,词云需要把数据从数据库中提取出来塞进去就好了,词云代码:
func getTitleListFromDB() []opts.WordCloudData {
var wordList []string
dao.GetDB().Raw("select word from template_title_words").Scan(&wordList)
wordMap := make(map[string]int)
for i := range wordList {
wordMap[wordList[i]]++
}
ans := make([]opts.WordCloudData, 0)
for k, v := range wordMap {
ans = append(ans, opts.WordCloudData{Value: v, Name: cast.ToString(k)})
}
return ans
}
func createWordCloud(title string, data []opts.WordCloudData) {
wc := charts.NewWordCloud()
wc.SetGlobalOptions(charts.WithTitleOpts(opts.Title{Title: title}))
wc.AddSeries(title, data).
SetSeriesOptions(
charts.WithWorldCloudChartOpts(
opts.WordCloudChart{
SizeRange: []float32{40, 80},
Shape: "cardioid",
}),
)
f, _ := os.Create(fmt.Sprintf("wordcloud_%s.html", title))
_ = wc.Render(f)
}
生成的词云如下
价格分布如下
小结
可以看到,标题中流程图词汇占比最高,价格中五块钱的模版占比最高,其次是3块钱的,再其次是免费的。
TDSQL-C Serverless使用体验上还不错,比较丝滑,感觉和远程数据库差不多,它动态扩缩容能力也能让我们少操点心