"Minha primeira experiência com a linguagem Go+" | Chamada de trabalhos em andamento...
Diretório de artigos
escreva na frente
É tal isso! Pessoalmente, sou um amante da linguagem Go. Entrei em contato com Qiniu quando era calouro. Nos últimos dias, Qiniuyun
Go+
me trouxe para a CSDN para escrever ensaios! Então eu vouGo+
escrever um rastreador!
Inicialização do projeto
Concluímos a go+
construção mais cedo, e então vamos construir um projeto! Use vscode
-o, pois goland
não há plugin para goplus.
- crie um
.gop
arquivo
- Escreva hello world para testar se ele pode ser executado
gop run main.gop
mas vai dar errado
Aqui ele avisa que gop.mod não foi encontrado!
Neste ponto, devemos primeiro gop mod
olhar para o nome do pacote! Perceber! ! Devemos usá-lo gop mod
!
Embora go mod
possa ser executado, não é um mod gop, mas sim um mod go. Eu usei o mod go para init desde o início, mas o Sr. Xu disse que precisamos do mod gop! !
gop mod
Em seguida, este arquivo aparecerá
Então vamos correr!
Haverá esse erro, neste momento, só precisamos seguir o pedido dele, ir buscar isso builtin
, e
então podemos sair correndo.
Então vamos escrever um rastreador no Go+!
1. Encontre piscar
Quanto ao CSDN, você tem que mudar 新版
para ver piscar! Eu tinha a versão antiga, então mudei para a nova versão primeiro.
Nós achamos
2. Página de análise
Descobrimos que não há uma interface correspondente para exibir comentários, então, depois de clicarmos em mais
, isso aparecerá, e este é o nosso endereço de rastreamento!
Então olhamos para isso url
, o retorno é a informação do comentário que precisamos!
Então nós olhamos para os parâmetros de resposta!
- pageNum é o número da página
- pageSize é o tamanho da página
- blinkId é o id deste piscar
Então podemos deixar pageNum=1
, pageSize=500
, retornar todos os comentários diretamente!
confortável!
3. Escreva o código
go-plus
Se você não gostar do prompt de que não há plugin em goland , você pode vscode
criá-lo em , para que você possa ter um prompt destacado.
3.1 Envie uma solicitação
Usando o net/http
pacote, construa um client
,
client := &http.Client{
}
reqSpider, err := http.NewRequest("GET", "https://blink-open-api.csdn.net/v1/pc/blink/allComment?pageNum=1&pageSize=400&blinkId=1260435", nil)
if err != nil {
println err
}
reqSpider.Header.Set("content-length", "0")
reqSpider.Header.Set("accept", "*/*")
reqSpider.Header.Set("x-requested-with", "XMLHttpRequest")
respSpider, err := client.Do(reqSpider)
if err != nil {
println err
}
bodyText, _ := ioutil.ReadAll(respSpider.Body)
3.2 Analisando os dados
json
Podemos ver que são dados de formato padrão apenas observando a resposta .
Então podemos usar o json
pacote, que será string
convertido em uma estruturajson格式
var result BlinkResult
_ = json.Unmarshal(bodyText, &result)
3.3 Processamento e análise de dados
- Ver todas as mensagens deste dia 24 dias atrás
count := 0
// 如果存在20天前发表的内容,打印出内容
if ({
for item <- items, item.CreateTime == "24 天前"}) {
// 注意这里一定要有括号, 返回bool
for item <- items, item.CreateTime == "24 天前" {
count++
println item
}
printf("一共有%d人在24天前留言", count)
}
- Ver todas as avaliações na plataforma de origem
for item <- items {
switch item.FromType {
case "CSDN-APP:Android:":
countAndroid++
userAndroid = append(userAndroid, item)
case "CSDN-APP:iOS:":
countIOS++
userIOS = append(userIOS, item)
case "pc":
countPC++
userPC = append(userPC, item)
default:
countOrder++
}
}
- Faça um pequeno upgrade, contamos o tempo médio de comentários de cada plataforma
countAndroid, countIOS, countPC, countOrder, all := 0, 0, 0, 0, len(items)
meanDayIOS, meanDayAndroid, meanDayPC := 0, 0, 0
tmp := 0
var userAndroid []LuckyBlinkPerson
var userIOS []LuckyBlinkPerson
var userPC []LuckyBlinkPerson
// 统计所有的来源平台以及平均评论天数
for item <- items {
switch item.FromType {
case "CSDN-APP:Android:":
countAndroid++
tmp, _ = strconv.Atoi(item.CreateTime[:2])
userAndroid = append(userAndroid, item)
meanDayAndroid += tmp
case "CSDN-APP:iOS:":
countIOS++
userIOS = append(userIOS, item)
tmp, _ = strconv.Atoi(item.CreateTime[:2])
meanDayIOS += tmp
case "pc":
countPC++
userPC = append(userPC, item)
tmp, _ = strconv.Atoi(item.CreateTime[:2])
meanDayPC += tmp
default:
countOrder++
}
}
printf("来自Android有:%d人 平均评论天:%d天前\n", countAndroid, meanDayAndroid/len(userAndroid))
printf("来自iOS有:%d人 平均评论天:%d天前\n", countIOS, meanDayIOS/len(userIOS))
printf("来自pc有:%d人 平均评论天:%d天前\n", countPC, meanDayPC/len(userPC))
printf("其他的有:%d人\n", countOrder)
printf("一共有%d人\n", all)
- Então contamos quantas pessoas comentaram naquele dia
// 统计评论天数每一天有多少人评论
mapDay := map[string]int{
}
meanDayIOS, meanDayAndroid, meanDayPC = 0, 0, 0
for user <- items {
mapDay[user.CreateTime]++
}
for k, v <- mapDay {
printf("%s 评论了 %d 条信息\n", k, v)
}
安卓用户
Retorna o apelido, conteúdo, hora de criação de todos os comentários feitos neste dia 20 dias atrás
androidCommont := [[user.NickName, user.Content, user.CreateTime] for user <- userAndroid, user.CreateTime == "20 天前"]
if len(androidCommont) != 0 {
for androidInfo <- androidCommont {
println androidInfo
}
}
- Remover dados de comentários de nome de usuário duplicados
func removeBlinkRepByMap(slc []LuckyBlinkPerson) []LuckyBlinkPerson {
var result []LuckyBlinkPerson
tempMap := map[LuckyBlinkPerson]byte{
}
for _, e <- slc {
l := len(tempMap)
tempMap[e] = 0
if len(tempMap) != l {
result = append(result, e)
}
}
return result
}
3.4 Saída de todos os comentários
var luckyBPList []LuckyBlinkPerson
for _, v <- commentList {
var luckBlinkPerson LuckyBlinkPerson
luckBlinkPerson.FromType = v.FromType
luckBlinkPerson.NickName = v.Nickname
luckBlinkPerson.CreateTime = v.CreateTime
luckBlinkPerson.Content = v.Content
luckyBPList = append(luckyBPList, luckBlinkPerson)
}
luckyBPList = removeBlinkRepByMap(luckyBPList)
for _, v <- luckyBPList {
println v.NickName, v.Content, v.CreateTime
}
O código completo está github
acima:
https://github.com/CocaineCong/go-plus-demo
Resumir
Como devo colocar, depois de escrever o rastreador, parece um pouco como escrever python. Afinal, sou formado em ciência de dados e costumo usar python para processamento de dados ...
O campo do Go+ é voltado para análise de dados, e o crawler do Go+ é muito rápido! O desempenho também é melhor que o python, e a sintaxe é semelhante
Acredito que o futuro da Go+ será tão bom quanto a empresa fundadora 7777777
!
Também espero poder fazer a minha parte pela comunidade Go+ e dar um Go+爬虫
a todos!