爬取Bilibili视频评论,并生成云词图

前言

利用python爬取Bilibi某视频下面的全部评论,并生成云词图,B站信息均为Json格式加载,获取数据较容易。

载入模块

import requests
import pprint
import json
import math
import sys
import re
import jieba
from wordcloud import WordCloud, ImageColorGenerator   

设置一个方法来获取评论

def get_replies(VideoId, pages_number): # 传入两个参数分别是视频的ID和评论的页数
    video_url = 'https://api.bilibili.com/x/v2/reply' #设置请求地址
    video_url_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 按照页数循环
    for numbers in range(pages_number):
        try:
        	# 设置GET请求参数
            video_url_params = {
                'jsonp': 'jsonp',
                'pn': numbers+1,  # 页数从0开始的所以要+1
                'type': '1',
                'oid': VideoId,  # 视频id
                'sort': '0',
            }
            # 获得评论列表
            repliesall = requests.get(video_url, params=video_url_params,
                                   headers=video_url_headers).json()['data']['replies'] # 这里直接取出评论列表
            for replies in repliesall:
                # 循环获得次视频下面的评论
                neirong = replies['content']['message']
                # 返回评论内容
                return neirong
        except:
            print('==================无法获取==================ID:' + VideoId)

将评论保存到文件中

def savetxts(commenttext):
    try:
        # 文件目录设置
        with open(r'd:\wb.txt', 'a', encoding='utf-8') as f: 
            f.write(commenttext + '\n')
    except:
        print('--------------------这篇评论无法写入-------------------' + commenttext)
#将get_replies()中的返回方法改为保存到文件
savetxts(neirong)

下面我们要大量获取某UP的视频id

def GetVideoList(UP_main_ID,Page): # 这里需要传入UP主的ID和页数
    # 设置网址
    Get_list_Url = 'http://space.bilibili.com/ajax/member/getSubmitVideos'
    Get_list_params = {
        'mid': UP_main_ID,  # 设置up主ID
        'pagesize': '30',
        'tid': '0',
        'page': Page, # 第几页
        'keyword': '',
        'order': 'pubdate',
    }
    Get_list_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 返回视频数据
    GetVideoList = requests.get(
        Get_list_Url, params=Get_list_params, headers=Get_list_headers).json()['data']['vlist']
    for ListID in GetVideoList:
        # 获取视频视频评论页数
        PageCount = pages_number(ListID['aid']) # 调用取评论页数的方法
        print('正在获取的视频ID:' + str(ListID['aid'],) + '总页数:' + str(PageCount)) # 打印一个提示信息
        # 调用获得评论方法
        get_replies(ListID['aid'], PageCount)
    # 返回
    return '获取评论完成。'

# 这个函数获得视频评论的页数,返回int格式,视频评论总页数
def pages_number(VideoId):
    video_url = 'https://api.bilibili.com/x/v2/reply'
    video_url_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }

    video_url_params = {
        'jsonp': 'jsonp',
        'pn': '1',  # 页数
        'type': '1',
        'oid': VideoId,  # 视频id
        'sort': '0',
    }
    # 获得该视频的一些参数
    replies = requests.get(video_url, params=video_url_params,
                           headers=video_url_headers).json()
    # 获得总评论数
    pages_number = replies['data']['page']['count']  
    # 获得并返回页数,每页有20条评论,所以返回总页数除20并且向上取整
    return math.ceil(pages_number / 20) 
# 制作词云
def wcloud():
    # 设置打开存有评论的文件路径
    filename = (r'd:\wb.txt')
    # 打开文件,将编码设置为UTF-8
    with open(filename, encoding='UTF-8') as f:
        mytext = f.read()
    # 删除特殊符号
    mytext = re.sub(r"[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",mytext)
    # 进行分词,这里选用的jieba.cut_for_search(互联网分词方法)
    wordlist_jieba = jieba.cut_for_search(mytext)
    # 在每个词之间添加空格
    wl_space_split = " ".join(wordlist_jieba)
    # 设置云词参数
    wc = WordCloud(
        font_path = r'C:\Windows\Fonts\SIMYOU.TTF',
        width = 800,
        height = 600,
        margin = 10,
        max_font_size = 100,
        background_color = 'white',
        min_font_size = 10,
        max_words = 500,
    )
    # 生成分词图
    wc.generate(wl_space_split)
    # 将分词图保存
    wc.to_file(r'd:\1.png')

下面我们只需要调用方法来获取和生成词云图

UpId = input('请输入UP主的IP:')
Uppage = input('请输入页数:')
GetVideoList(UpId,Uppage)
print('获取评论完毕,下面生成词云图。')
wcloud()
print('生成词云完毕。')

我们运行脚本后在设置的目录内将生成词云图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Papwick/article/details/85059282