Minha primeira experiência com a linguagem Go+ - escrevendo um crawler e processamento de dados com Go+

"Minha primeira experiência com a linguagem Go+" | Chamada de trabalhos em andamento...

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 vou Go+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 golandnão há plugin para goplus.

  • crie um .goparquivo

insira a descrição da imagem aqui

  • Escreva hello world para testar se ele pode ser executado

insira a descrição da imagem aqui

gop run main.gop

mas vai dar errado

insira a descrição da imagem aqui
Aqui ele avisa que gop.mod não foi encontrado!

Neste ponto, devemos primeiro gop modolhar para o nome do pacote! Perceber! ! Devemos usá-lo gop mod!

Embora go modpossa 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! !

insira a descrição da imagem aqui

gop modEm seguida, este arquivo aparecerá

Então vamos correr!
insira a descrição da imagem aqui
Haverá esse erro, neste momento, só precisamos seguir o pedido dele, ir buscar isso builtin, e
insira a descrição da imagem aqui
então podemos sair correndo.
insira a descrição da imagem aqui

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
insira a descrição da imagem aqui

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 insira a descrição da imagem aqui
, isso aparecerá, e este é o nosso endereço de rastreamento!
insira a descrição da imagem aqui
Então olhamos para isso url, o retorno é a informação do comentário que precisamos!
insira a descrição da imagem aqui
Então nós olhamos para os parâmetros de resposta!
insira a descrição da imagem aqui

  • 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-plusSe você não gostar do prompt de que não há plugin em goland , você pode vscodecriá-lo em , para que você possa ter um prompt destacado.

insira a descrição da imagem aqui

3.1 Envie uma solicitação

Usando o net/httppacote, 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

jsonPodemos ver que são dados de formato padrão apenas observando a resposta .

Então podemos usar o jsonpacote, que será stringconvertido 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)
}

insira a descrição da imagem aqui

  • 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++
	}
}

insira a descrição da imagem aqui

  • 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)

insira a descrição da imagem aqui

  • 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)
}

insira a descrição da imagem aqui

  • 安卓用户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
	}
}

insira a descrição da imagem aqui

  • 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á githubacima:

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!

Acho que você gosta

Origin blog.csdn.net/weixin_45304503/article/details/121589766
Recomendado
Clasificación