Python 爬取B站视频信息 弹幕信息 生成词云统计

本文介绍功能:实现爬取B站视频信息(用户输入关键词)、爬取弹幕信息(支持自定义天数)、生成词云图

完整代码地址:https://github.com/736755244/py_bilibili

一、数据准备

  • Cookie(爬取弹幕信息需要)
  • 视频搜索接口
  • 获取视频oid接口
  • 弹幕信息接口
1、获取视频信息接口(参数:页数和搜索关键词)
https://api.bilibili.com/x/web-interface/search/type?context=&page={}&order=&keyword={}&duration=&tids_1=&tids_2=&__refresh__=true&search_type=video&highlight=1&single_column=0&jsonp=jsonp&callback=__jp8

2、获取弹幕信息接(参数:视频oid和日期)
https://api.bilibili.com/x/v2/dm/history?type=1&oid={}&date={}

3、获取视频oid接口(参数:视频id)
https://api.bilibili.com/x/player/pagelist?aid={}&jsonp=jsonp

4、cookie:个人登录后获取

二、各功能模块详解(注:以下代码均为非完整代码,直接运行可能报错,完整代码见文章开头)

1、用户输入关键词,搜索输出视频信息(默认第一页),供用户选择

这里可以做优化:循环让用户输入查找的视频页码,本文不作介绍,有兴趣可自行修改

效果:

主要功能代码:

#  获取指定页码的视频列表
def get_vd_list(name,n):
    listUrl='https://api.bilibili.com/x/web-interface/search/type?context=&page={}&order=&keyword={}&duration=&tids_1=&tids_2=&__refresh__=true&search_type=video&highlight=1&single_column=0&jsonp=jsonp&callback=__jp8'
    headers = {
        'Accept': '*/*',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        'Host': 'api.bilibili.com',
        'Connection': 'keep-alive',
        'Cookie': cok,
        'Referer': 'https://search.bilibili.com/all?keyword={}&from_source=nav_search&spm_id_from=333.851.b_696e7465726e6174696f6e616c486561646572.11'.format(quote(name))
    }
    res = requests.get(listUrl.format(n,quote(name)), headers=headers)
    res.encoding = 'utf-8'
    time.sleep(1)
    # 总页数
    totalpage = re.findall('"numPages":.*?,', res.text)[0]
    numPages = totalpage.split(':')[1].split(',')[0]
    # 当前页码
    curpage = re.findall('"page":.*?,', res.text)[0]
    page = curpage.split(':')[1].split(',')[0]
    # 视频页数
    print('视频共%s页'%numPages)
    print('当前是%s页' % page)
    #截取视频列表信息
    datalen=len(res.text)
    mydata = res.text[6:datalen-1]
    # 转josn格式
    jsonlist=json.loads(mydata)['data']['result']
    # 视频列表
    v_list =[]
    for i,v in enumerate(jsonlist):
        video_info = {}
        video_info['id'] = v['id']  # 取视频id
        video_info['title'] = v['title'].replace('<em class="keyword">','').replace('</em>','')  # 取视频名称
        print('视频编号:%d  视频名称:%s'%(i+1,video_info['title']))
        v_list.append(video_info)
    return v_list

def main():
    video_name = input('请输入想查看的视频名称:')
    # 默认第一页视频列表
    v_list = get_vd_list(video_name,1)

2、用户选择爬取视频编号并爬取

注意点:

  • 获取弹幕信息需要视频的oid,所以需要根据视频id获取oid
  • 弹幕信息接口返回内容如下,参数说明见图,根据需要取出对应信息

主要功能代码:

# 获取日期范围(返回包含当前的日期列表)
def get_days(n):
    before_n_days = []
    for i in range(0, n)[::-1]:
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

# 获取视频oid
def get_oid(id):
    headers = {
        'User-Agent':get_ua(),
        'Host': 'api.bilibili.com',
        'Connection': 'keep-alive',
        'Cookie':cok
    }
    getoid_url = 'https://api.bilibili.com/x/player/pagelist?aid={}&jsonp=jsonp'
    res = requests.get(getoid_url.format(id), headers=headers)
    video_info=json.loads(res.text)
    return video_info['data'][0]['cid']

# 根据日期范围获取评论
def get_dm_info(dmUrl):
    headers = {
        'User-Agent': get_ua(),
        'Host': 'api.bilibili.com',
        'Connection': 'keep-alive',
        'Cookie': cok
    }
    res = requests.get(dmUrl, headers=headers)
    if res.status_code == 200:
        print('*********爬取成功*******')
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    print('*********解析成功*******')
    # soup = BeautifulSoup(res.text.encode(res.encoding).decode('utf8'), 'lxml')
    return getText(soup)

# 解析网页
def getText(soup):
    result = soup.select('d')
    if len(result) == 0:
        return result
    all_list = []
    for item in result:
        info = item.get('p').split(",")
        info.append(item.string)
        info[4] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(int(info[4])))
        all_list.append(info)
    return all_list

效果:

3、生成词云图和统计数据

效果:

主要功能代码:

# 生成词云
def get_wcloud(name):
    # 词云
    fp = open(r'%s.csv'%name, 'r', encoding='gbk').read()
    jieba.load_userdict('scel_to_text.txt')
    # jieba.add_word()  # 可以添加自定义词典
    # 将文件中所有文字分词
    words_list = jieba.lcut(fp)
    # 用空格分隔词语
    tokenstr = ' '.join(words_list)
    mywc1 = WordCloud().generate(tokenstr)
    # 显示词云
    plt.imshow(mywc1)
    plt.axis('off')
    plt.show()
    mywc1.to_file('%s.png'%name)  # 生成词云图片

相关问题欢迎留言讨论!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值