本文介绍功能:实现爬取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) # 生成词云图片
相关问题欢迎留言讨论!