环境:
Google colab,
python 3.8
为什么使用 Colab
使用colab可以免去安装jupyter配置python等麻烦,......
刨去这些外在的,
首先连接Google drive
import os
from google.colab import drive
drive.mount('/content/drive')
path = "/content/drive/My Drive"
os.chdir(path)
os.listdir(path)
并且将绝对路径设置为自己创建的路径
这里我将在MyDanMu的文件夹目录下设置为主目录
%cd /content/drive/MyDrive/BilBilDanMuPaQu/MyDanMu
以上的Colab标准开端, 如果你使用的是jupyter 可以忽略以上,
PS: 最推荐Colab, 我试过jupyter会有些莫名其妙的错误
------------------------------------------------------------分界线------------------------------------------------------------
我们正式开始, 首先引入我们用到的包,
一,用到的库
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import time
import numpy as np
from PIL import Image
import jieba
import wordcloud
其中requests和bs4以及re是爬虫的主力军,而numpy、Image、jieba、wordcloud就是生成词云要用到的东西。pandas是便于格式化来输出文件是。
二,定义一些要用到的数据结构和请求头
我们将想要的B站视频的url 和 一些我们需要的列标题 和 需要的headers 设为常量
( 为了过审, 将具体的网页给删除了需要自己添加)
headers = {}
# 视频位置(s)
video_time=[]
# 评论时间
abstime=[]
# 用户id
userid=[]
# 弹幕颜色
colorM=[]
# 弹幕内容
comment_content=[]
# 总时间
_duration_ = []
# 编程类视频的列表
codingUrl = [
]
# 日语类视频的列表
japaneseLanguageUrl = [
]
三,寻找API
经过查询资料,我们知道类似于一个链接(被和谐)可以获取到部分弹幕信息。然后我们来访问看一看。
是个xml文件,我们发现只需要获取这个oid参数就能获取某个视频的弹幕信息。
然后寻找视频对应的oid信息。
接着我们发现了一个链接(被和谐)。这个链接就能获取视频链接的oid,就是这个cid
接着是获取bvid,这个就是视频链接中包含的信息。
四,获取cid
def get_cid(url):
data = requests.get(url=url,headers=headers)
data = data.json()
cid = data['data'][0]['cid']
return cid
我们发现获取cid的页面是个json文件,然后我们可以将直接取json文件中的cid的值。
五,获取弹幕信息
def get_info(url):
html = requests.get(url=url, headers=headers)
html.encoding = html.apparent_encoding
soup = BeautifulSoup(html.text,'lxml')
data_number=re.findall('d p="(.*?)">',html.text)
data_text=re.findall('">(.*?)</d>',html.text)
comment_content.extend(data_text)
for each_numbers in data_number:
each_numbers=each_numbers.split(',')
video_time.append(each_numbers[0])
abstime.append(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(each_numbers[4]))))
userid.append(each_numbers[6])
result={'用户id':userid,'评论时间':abstime,'视频位置(s)':video_time,'弹幕内容':comment_content}
results=pd.DataFrame(result)
final= results.drop_duplicates()
final.info()
final.to_excel('B站弹幕.xls')
这里我们还是获取那个xml文件,然后利用正则表达式获取xml中各个列的值,我们保存用户编号,评论时间,弹幕的视频位置,弹幕内容。然后保存到xls文件中。
六,爬取系列视频
现在根据我们已经可以爬取单个视频的弹幕了.
如果我们要爬取系列视频怎么办呢? 稍微调整代码:
1.获得CID LIst码 获得各个视频的时间
def get_cid(urlList):
cid = []
video_time = []
for url in urlList:
// 还是臭审核
cid_url = "https://" + "api.bil" + "ibili.c" + "om/x/player/pagelist?bvid="+str(url[31:43]) +"&jsonp=jsonp"
print("\"" + str(url[31:43])+ "\"" + ",")
data = requests.get(url=cid_url,headers=headers)
data = data.json()
for i in data['data']:
cid.append(i['cid'])
video_time.append(i['duration'])
return cid,video_time
2.获得ori_url LIst码
def get_ori_cid(cidUrlList):
oriUrlList = []
for cid in cidUrlList:
// 可恶的审核
oriUrl = 'ht'+ 'tps:/' + '/api.bi' + 'lib' + 'ili.c'+ 'om/x/' + 'v1/dm/list.so?oid='+str(cid)
oriUrlList.append(oriUrl)
return oriUrlList
3.制作弹幕表
def make_info_of_danMu():
Number = 0
for i in range(50):
video_time=[]
abstime=[]
userid=[]
colorM=[]
comment_content=[]
_duration_=[]
cur = 0
for url in oriUrlList:
if 10*i+10 > cur >= 10*i:
html = requests.get(url=url, headers=headers)
html.encoding = html.apparent_encoding
soup = BeautifulSoup(html.text,'lxml')
data_number=re.findall('d p="(.*?)">',html.text)
data_text=re.findall('">(.*?)</d>',html.text)
comment_content.extend(data_text)
for each_numbers in data_number:
# Number = Number + 1
each_numbers=each_numbers.split(',')
video_time.append(each_numbers[0])
abstime.append(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(each_numbers[4]))))
userid.append(each_numbers[6])
colorM.append(each_numbers[3])
_duration_.append(duration[cur])
# theNumber.append(Number)
cur = cur + 1
# print(len(theNumber))
print(len(userid))
print(len(abstime))
print(len(video_time))
print(len(comment_content))
print(len(colorM))
print(len(_duration_))
result={'用户id':userid,'评论时间':abstime,'视频位置(s)':video_time,'弹幕内容':comment_content,'颜色':colorM,'总时间':_duration_}
results=pd.DataFrame(result)
final= results.drop_duplicates()
final.info()
final.to_excel(str(i)+'B站编程弹幕.xls')
七.总函数
if __name__ == "__main__":
// 输入系类视频的url
cidUrlList,duration = get_cid(codingUrl)
oriUrlList = get_ori_cid(cidUrlList)
make_info_of_danMu()
写在最后, 欢迎访问我的主页. (因为审核还是别访问了!!!!!!!!!!!!)
来访问!!!哈哈哈哈改成转载的QAQ,
UI的期末作业, 不强但是很自豪.
也请大神多多提意见