NetEase Cloudで曲のすべてのコメントをクロールし、ワードクラウドイメージを出力します

免責事項:この記事は調査および研究のみを目的としており、違法な目的での使用は禁じられています。それ以外の場合は、自己責任で行ってください。違反がある場合は、通知して削除してください。ありがとうございます。

プロジェクトシーン:

私の最後の記事では、網易雲パラメータの復号化について書いた。この時間は、私たちがクロールされますすべてのコメント塗装赤ちゃんを

解決:


1.最初にコメント付きのインターフェースを見てみましょう。これはhttps://music.163.com/weapi/comment/resource/comments/get?csrf_token=ff57cff46ebe79b9a51dd10f8c9181bbこのインターフェースであり、2つの暗号化パラメーターparamsとencSecKeyも持っていることがわかります。前回の記事では、songインターフェースの2つのパラメーターの復号化について説明しました。実際、コメントはここにあります。 2つのパラメーターの復号化方法は同じであるため、詳細については説明しません。

ここに写真の説明を挿入

2.コメントインターフェイスの暗号化パラメータparamsとencSecKey生成方法は、ここに直接掲載されています。注意が必要なパラメータがいくつかあります。1つはカーソルで、もう1つはpageSizeです。多くのテストの結果、各ページのコメントはに基づいていることがわかりました。カーソルは業界の最後のコメント時に生成され、各ページのページサイズは20です。
{
    
    "rid":"R_SO_4_1474342935","threadId":"R_SO_4_1474342935","pageNo":"3","pageSize":"20","cursor":"1600190813154","offset":"0","orderType":"1","csrf_token":"ff57cff46ebe79b9a51dd10f8c9181bb"}

ここに写真の説明を挿入

3.次に、問題が発生します。各ページの最後のコメントの時刻がわかりません。対応するカーソルを生成できない場合はどうすればよいですか?私の解決策は、最初のコメントの日付から(たとえば、2020)です。 -08-27)次に、カーソルを最終日の時刻の最後の1秒、つまり、現在の日までの「2020-08-27 23:59:59」1598543999000(13桁と3つのゼロ)のタイムスタンプとして定義します。 (たとえば、2020-09-16)最後の2番目のタイムスタンプは「1600271999000」です。次にpagesize = 1000(1000は最大値、orderType = 1(時間でソート))を設定し、対応する方法を使用してすべてを回避します。毎日繰り返しコメントが寄せられますが、実際、この方法で取得したコメントの数は不完全です。ページやオフセットに応じてその日のコメントを細分化し、完全なコメント情報を取得できます(ホストはここでは怠惰なので、この方法は使用されません)。あなたは良いアイデアにコメントすることができます!
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.分析後、曲のコメントのほとんどを取得できます。コードは次のとおりです。
    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.次に、コメントデータを取得し、jiebaを使用してデータの単語セグメンテーション統計を実行し、単語クラウドイメージを出力しました。
# 分词
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.最後に、Run!のコメントの総数は8544で、8230に増えましたが、まだ何百もありません。

ここに写真の説明を挿入


ここに写真の説明を挿入

7.次に、出力された単語の雲の画像を見てください、ハハハ、首都のジャオは私のジャオの兄弟によって迎えられます!、完全なコードは私のgitから入手できます:https//github.com/934050259/wyy_comments

ここに写真の説明を挿入

注:別のコメント付きAPIインターフェイスがあることがわかりましたhttp://music.163.com/api/v1/resource/comments/R_SO_4_1474342935?limit=20&offset=0パラメーターはR_SO_4_ + song_id、ちょっと、不快です〜

おすすめ

転載: blog.csdn.net/qq_26079939/article/details/108621764