Mi primera experiencia con el lenguaje Go+: escribir un rastreador y procesar datos con Go+

"Mi primera experiencia con el lenguaje Go+" | La convocatoria de artículos está en curso...

escribir delante

¡Es tal que! Personalmente, soy un amante del idioma Go. Me puse en contacto con Qiniu cuando era estudiante de primer año. ¡En los últimos días, Qiniuyun Go+me trajo a CSDN para escribir ensayos! ¡Entonces Go+escribiré un rastreador!

Inicialización del proyecto

¡Hemos completado la go+construcción antes, y luego construyamos un proyecto! Úselo vscode, porque golandno hay complemento para goplus.

  • crear un .goparchivo

inserte la descripción de la imagen aquí

  • Escriba hola mundo para probar si se puede ejecutar

inserte la descripción de la imagen aquí

gop run main.gop

pero saldrá mal

inserte la descripción de la imagen aquí
¡Aquí indica que no se encuentra gop.mod!

¡En este punto, primero debemos gop modmirar el nombre del paquete! ¡Darse cuenta! ! ¡Debemos usarlo gop mod!

Aunque se go modpuede ejecutar, no es un gop mod sino un go mod. Utilicé go mod para init desde el principio, ¡pero el Sr. Xu dijo que necesitamos gop mod! !

inserte la descripción de la imagen aquí

Luego aparecerá este gop modarchivo .

Entonces, ¡vamos a correr!
inserte la descripción de la imagen aquí
Habrá este error. En este momento, solo tenemos que seguir su solicitud, ir a buscar esto builtin, y
inserte la descripción de la imagen aquí
luego podemos salir corriendo.
inserte la descripción de la imagen aquí

¡Entonces escribamos un rastreador en Go+!

1. Encuentra parpadeo

En cuanto a CSDN, ¡tienes que cambiar 新版para ver parpadear! Tenía la versión anterior, así que primero cambié a la nueva.
lo encontramos
inserte la descripción de la imagen aquí

2. Página de análisis

Descubrimos que no hay una interfaz correspondiente para mostrar comentarios, por lo que después de hacer clic en más inserte la descripción de la imagen aquí
, aparecerá esto, ¡y esta es nuestra dirección de rastreo!
inserte la descripción de la imagen aquí
Luego miramos esto url, ¡el retorno es la información de comentario que necesitamos!
inserte la descripción de la imagen aquí
¡Luego nos fijamos en los parámetros de respuesta!
inserte la descripción de la imagen aquí

  • pageNum es el número de página
  • pageSize es el tamaño de la página
  • blinkId es el id de este parpadeo

¡Entonces podemos dejar que pageNum=1, pageSize=500, devuelva todos los comentarios directamente!
¡cómodo!

3. Escribe el código

go-plusSi no le gusta el aviso de que no hay un complemento en goland , puede vscodecrearlo en, para que pueda tener un aviso resaltado.

inserte la descripción de la imagen aquí

3.1 Enviar una solicitud

Usando el net/httppaquete, construya un 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 Analizando los datos

jsonPodemos ver que se trata de datos de formato estándar con solo mirar la respuesta .

Entonces podemos usar el jsonpaquete, que se stringconvertirá en una estructurajson格式

	var result BlinkResult
	_ = json.Unmarshal(bodyText, &result)

3.3 Procesamiento y análisis de datos

  • Ver todos los mensajes de este día hace 24 días
count := 0
// 如果存在20天前发表的内容,打印出内容
if ({
    
    for item <- items, item.CreateTime == "24 天前"}) {
    
     // 注意这里一定要有括号, 返回bool
	for item <- items, item.CreateTime == "24 天前" {
    
    
		count++
		println item
	}
	printf("一共有%d人在24天前留言", count)
}

inserte la descripción de la imagen aquí

  • Ver todas las reseñas en la plataforma de origen
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++
	}
}

inserte la descripción de la imagen aquí

  • Haz una pequeña actualización, contamos el tiempo promedio de comentarios 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)

inserte la descripción de la imagen aquí

  • Luego contamos cuántas personas comentaron ese día.
// 统计评论天数每一天有多少人评论
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)
}

inserte la descripción de la imagen aquí

  • 安卓用户Devuelve el apodo, el contenido y la hora de creación de todos los comentarios realizados en este día hace 20 días.
androidCommont := [[user.NickName, user.Content, user.CreateTime] for user <- userAndroid, user.CreateTime == "20 天前"]
if len(androidCommont) != 0 {
    
    
	for androidInfo <- androidCommont {
    
    
		println androidInfo
	}
}

inserte la descripción de la imagen aquí

  • Eliminar datos de comentarios de nombres de usuario 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 Salida de todos los comentarios

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
}

El código completo está githubarriba:

https://github.com/CocaineCong/go-plus-demo

Resumir

Cómo debería decirlo, después de escribir el rastreador, parece un poco como escribir python. Después de todo, soy un estudiante de ciencia de datos y, a menudo, uso python para el procesamiento de datos...

El campo de Go+ está orientado al análisis de datos, ¡y el rastreador de Go+ es muy rápido! El rendimiento también es mejor que Python, y la sintaxis es similar.

¡Creo que el futuro de Go+ será tan bueno como el de su empresa fundadora 7777777!

¡También espero poder aportar mi granito de arena a la comunidad de Go+ y dar uno Go+爬虫a todos!

Supongo que te gusta

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