Rastrear todos los comentarios de una canción en NetEase Cloud y generar una imagen de nube de palabras

Descargo de responsabilidad: Este artículo es solo para estudio e investigación, y está prohibido su uso con fines ilícitos. De lo contrario, usted será responsable de las consecuencias. Si hay alguna infracción, informe y elimínela, ¡gracias!

Escena del proyecto:

Mi último artículo escribió sobre el descifrado de los parámetros de la nube de NetEase. Esta vez rastrearemos todos los comentarios del bebé pintado .

solución:


1. https://music.163.com/weapi/comment/resource/comments/get?csrf_token=ff57cff46ebe79b9a51dd10f8c9181bbPrimero echemos un vistazo a la interfaz comentada. Se puede ver que es esta interfaz, y también lleva dos parámetros de cifrado params y encSecKey. El artículo anterior hablaba sobre el descifrado de los dos parámetros de la interfaz de la canción. De hecho, el comentario está aquí. Los dos métodos de descifrado de parámetros son los mismos, por lo que no entraré en detalles.

Inserte la descripción de la imagen aquí

2. Los parámetros de cifrado params y el método de generación de encSecKey de la interfaz de comentarios se publican directamente aquí. Hay varios parámetros a los que se debe prestar atención. Uno es el cursor y el otro es pageSize. Después de muchas pruebas, descubrí que los comentarios de cada página se basan en El cursor se genera en el momento del último comentario en la industria, y el tamaño de cada página es 20
{
    
    "rid":"R_SO_4_1474342935","threadId":"R_SO_4_1474342935","pageNo":"3","pageSize":"20","cursor":"1600190813154","offset":"0","orderType":"1","csrf_token":"ff57cff46ebe79b9a51dd10f8c9181bb"}

Inserte la descripción de la imagen aquí

3. Entonces viene el problema. No sé la hora del último comentario en cada página. ¿Qué debo hacer si no se puede generar el cursor correspondiente? Mi solución es: desde la fecha del primer comentario (por ejemplo, 2020) -08-27), luego definiré el cursor como el último segundo de la hora del último día, es decir, la marca de tiempo de '2020-08-27 23:59:59' 1598543999000 (13 dígitos con 3 ceros), hasta el día actual (Por ejemplo, 2020-09-16) El último segundo sello de tiempo es '1600271999000', luego configure pageize = 1000 (1000 es el valor máximo, orderType = 1 (ordenado por hora)), y use el método correspondiente para evitar cada Diariamente recibirá comentarios repetidos. De hecho, la cantidad de comentarios obtenidos de esta manera es incompleta. Puede subdividir los comentarios del día según la página y compensar para obtener información completa del comentario (el anfitrión es vago aquí, por lo que este método no se usa), si tiene otros ¡Puedes comentar buenas ideas!
param = {
    
    "rid": "R_SO_4_" + song_id, "threadId": "R_SO_4_" + song_id, "pageNo": "1", "pageSize": "1000",
		"cursor": cursor, "offset": "0", "orderType": "1", "csrf_token": "ff57cff46ebe79b9a51dd10f8c9181bb"}

4. Después del análisis, podemos obtener la mayoría de los comentarios de la canción, el código es el siguiente:
    now_day = datetime.date.today() #当天日期
    flag_info = None #重复评论标志
    num = 0
    for i in range(20, -1, -1):  # 获取 2020-08-27---2020-09-16 的日期
        pre_day = str(now_day - datetime.timedelta(days=i)) + ' 23:59:59'  # 获取T+1日期
        # 先转换为时间数组
        timeArray = time.strptime(pre_day, "%Y-%m-%d %H:%M:%S")
        # 转换为时间戳
        cursor = str(int(time.mktime(timeArray))) + '000'  # 拼接成13位时间戳
        print(pre_day, cursor)
        # 评论接口参数
        param = {
    
    "rid": "R_SO_4_" + song_id, "threadId": "R_SO_4_" + song_id, "pageNo": "1", "pageSize": "1000",
                 "cursor": cursor, "offset": "0", "orderType": "1", "csrf_token": "ff57cff46ebe79b9a51dd10f8c9181bb"}
        pdata = js_tool.call('d', str(param))
        response = requests.post('https://music.163.com/weapi/comment/resource/comments/get', headers=headers,data=pdata)
        # 获取评论信息
        data = json.loads(response.text)['data']
        comments = data.get('comments')
        # 存储评论信息
        with open('comments.txt', 'a', encoding='utf8') as f:
            for comment in comments:
                info = comment.get('content')
                if flag_info == info:  # 取到重复的评论则跳出循环,防止重复获取
                    break
                print(info)
                f.write(info + '\n')
                # folow_comments = comment.get('beReplied') # 附加的评论,暂不获取
                # if folow_comments:
                #     for folow_comment in folow_comments:
                #         print(folow_comment.get('content'))
                num += 1  # 获取评论数+1
        flag_info = comments[0]['content']  # 取每次请求的第一条
        print('每次请求的第一条', flag_info, '\n')
    print('获取评论数:', num)

5. Luego obtuvimos los datos de los comentarios, usamos jieba para realizar estadísticas de segmentación de palabras en los datos y generamos la imagen de nube de palabras:
# 分词
def fc_CN(text):
    # 接收分词的字符串
    word_list = jieba.cut(text)
    # 分词后在单独个体之间加上空格
    result = " ".join(word_list)
    return result

# 输出云词
def word_cloud():
    with open("./comments.txt", encoding='utf8') as fp:
        text = fp.read()
        # 将读取的中文文档进行分词
        text = fc_CN(text).replace('\n', '').split(' ')
        # 过滤部分分词
        filter_str = ['的', ',', '了', '我', '[', '你', '是', '就', ']', '!', '。', '?', '这', '不', '也', '都', '吧', '啊', '在',
                      '吗', '和', '吗', '听', '有', '说', '去', '好', '人', '给', '他', '…', '小', '来', '还', '没', '一', '']
        new_text = []
        for data in text:
            if data not in filter_str:
                new_text.append(data)
        print(new_text)
        # 词频统计
        word_counts = collections.Counter(new_text)  # 对分词做词频统计
        word_counts_top10 = word_counts.most_common(10)  # 获取前10最高频的词
        print(word_counts_top10)  # 输出检查

        # 词频展示
        mask = np.array(image.open('./love.jpg'))  # 定义词频背景--需要自行导入
        wc = wordcloud.WordCloud(
            # background_color='white',  # 设置背景颜色
            font_path='C:\Windows\Fonts\simhei.TTF',  # 设置字体格式
            mask=mask,  # 设置背景图
            max_words=200,  # 最多显示词数
            max_font_size=300,  # 字体最大值
            # scale=32  # 调整图片清晰度,值越大越清楚
        )

        wc.generate_from_frequencies(word_counts)  # 从字典生成词云
        image_colors = wordcloud.ImageColorGenerator(mask)  # 从背景图建立颜色方案
        wc.recolor(color_func=image_colors)  # 将词云颜色设置为背景图方案
        wc.to_file("./tmp.jpg")  # 将图片输出为文件
        plt.imshow(wc)  # 显示词云
        plt.axis('off')  # 关闭坐标轴
        plt.show()  # 显示图像


6. Por último, ¡Corre !, el número total de comentarios es 8544, que subió a 8230, pero todavía hay cientos de ellos que no.

Inserte la descripción de la imagen aquí


Inserte la descripción de la imagen aquí

7. Luego, eche un vistazo a la imagen de nube de palabras que mostramos, jajaja, ¡mi hermano giao saluda a la mayúscula giao! , El código completo se puede obtener de mi git: https://github.com/934050259/wyy_comments

Inserte la descripción de la imagen aquí

Nota: encontré que hay otra interfaz API comentada http://music.163.com/api/v1/resource/comments/R_SO_4_1474342935?limit=20&offset=0 El parámetro es R_SO_4_ + song_id, hey, incómodo ~

Supongo que te gusta

Origin blog.csdn.net/qq_26079939/article/details/108621764
Recomendado
Clasificación