Python爬虫B站首页推荐视频的视频信息,弹幕以及该视频的up主信息
BiliBili视频信息以及弹幕爬取 主要分为四个部分:
1.获取视频的基本信息
2.获取该视频的up主信息
3.获取弹幕信息
4.写入文件
1.获取视频的基本信息 打开B站首页的源代码,找到相关内容。这里我获取的是圈红的那个部分的视频
文章图片
找视频的标题和超链接的内容,超链接里面的末尾数字就是视频的id号
文章图片
1. 上代码 ,找到目标视频的id号和名字,list1是id号,list2是视频的名字。视频的名字我之前试图在视频的详情页面找,但是总是会出错,所以我就把它放在前面来找`
def IDList():
url="https://www.bilibili.com/"
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
html=r.text
soup = BeautifulSoup(html,'html.parser')
datas=soup.find_all("div",{"class":"groom-module home-card"})
List1=list()
List2=list()
for data in datas:
Url=data.find("a").get("href")
title=data.find("a").get("title")
m=re.findall("\d*",Url)
List1.append(m[-3])
List2.append(title)
return List1,List2``
3. 再通过视频的id号找视频;由于视频的详情信息以动态数据的方式加载,所以你再网络下面会找到这样的文件,里面就是视频的详细信息
文章图片
4.可以看一下它的url由https://api.bilibili.com/x/web-interface/archive/stat?aid={}’.format(id)组成,id号就是之前list里面的id号
文章图片
5.看一下代码处理:
def getVideoArchiveInfo(id,info):
url = 'https://api.bilibili.com/x/web-interface/archive/stat?aid={}'.format(id)
url2= 'http://www.bilibili.com/video/av{}/'.format(id)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
try:
r = requests.get(url,timeout=30,headers = headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
t = json.loads(r.text)
info['watchNumber'] = t['data']['view']#播放量
info['barrageNumber'] = t['data']['danmaku']#弹幕数
info['rank']= t['data']['his_rank']
info['coinNum'] = t['data']['coin']#硬币数
info['collectNum'] = t['data']['favorite']#收藏数
info['replyNum'] = t['data']['reply']#评论数
return info
except:
return None
`2.获取该视频的up主信息 1. 为了能够获得视频的up主的详细信息,就必须获得up主的id号。再视频详情页面的源代码里就有up主id。
def findUpID(id):
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
url= 'http://www.bilibili.com/video/av{}/'.format(id)
r = requests.get(url,headers=headers)
r.encoding='utf-8'
soup=soup = BeautifulSoup(r.text,'html.parser')
string=soup.find("a",{"class":"message"})
s=string.get("href")
m=re.findall("\d*",s)
UpID=m[-2]
return UpID`
2. 由于我用BeautifulSoup获取不出来,又找不到原因,找大佬问了一下也没有找到错误,所以只好用selenium来写,up是一个list;(这里用这么多try-except的原因是每一个up主的页面有一些信息可能有,可能没有,技术不到位只能想到这个方法)
`def findUser(id,up):
url =‘https://space.bilibili.com/{}’.format(id)
chrome_driver_binary = “D:\software\Google\Chrome\Application/chromedriver.exe”
browser = webdriver.Chrome(chrome_driver_binary)
browser.get(url)
time.sleep(3)
try:
userName=browser.find_element_by_xpath(’//[@id=“h-name”]’)
up.append(userName.text)
except:
pass
try:
userSign=browser.find_element_by_xpath(’//[@id=“app”]/div[1]/div[1]/div[2]/div[2]/div/div[2]/div[2]/h4’)
up.append(userSign.text)
except:
pass
try:
dengji=browser.find_element_by_xpath('//*[@id="app"]/div[1]/div[1]/div[2]/div[2]/div/div[2]/div[1]/a[1]')
up.append(dengji.get_attribute('lvl'))
except:
pass
try:
attention=browser.find_element_by_xpath('//*[@id="n-gz"]')
up.append(attention.text)
except:
pass
try:
fans=browser.find_element_by_xpath('//*[@id="n-fs"]')
up.append(fans.text)
except:
pass
try:
playNum=browser.find_element_by_xpath('//*[@id="n-bf"]')
up.append(playNum.text)
except:
pass
try:
discription=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[2]/div/div[1]/span')
up.append(discription.text)
except:
pass
try:
allCharge=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[4]/div[1]/div[2]/div[1]/span')
up.append(allCharge.text)
except:
pass
try:
MonthCharge=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[4]/div[3]/span')
up.append(MonthCharge.text)
except:
pass
try:
livefans=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[6]/div/div[1]/span[2]')
up.append(livefans.text)
except:
pass
try:
registerTime=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[1]/div/div[1]/div[2]/span[2]')
up.append(registerTime.text)
except:
pass
try:
birthday=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[1]/div/div[2]/div/span[2]')
up.append(birthday.text)
except:
pass
try:
label=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[2]/div/div')
up.append(label.text)
except:
pass
try:
vedioCount=browser.find_element_by_xpath('//*[@id="page-index"]/div[1]/div[2]/h3/span')
up.append(vedioCount.text)
except:
pass
browser.quit()
return up`
3.然后是获取弹幕信息 【哔哩哔哩爬取】1.你在视频的详情页面的network动态数据里会发现一个xml文件,里面就是保存的弹幕信息,而它的url很显然是由一个cid的参数所构成的,如下图http://comment.bilibili.com/67461578.xml.format(id)
文章图片
2.所以要借助首页获得的list1里面的id号,根据id号再到视频的详情页面获取cid
def getCid(url):
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98"}
r=requests.get(url,timeout=30,headers=headers)
r.raise_for_status()
r.encoding='utf-8'
# print(r.text)
try:
cidText = re.findall(r'"cid":"[\d]*"',r.text)
if not cidText:
cidText = re.findall(r'cid=[\d]*', r.text)
key = eval(cidText[0].split('=')[1])
else:
key = eval(cidText[0].split(':')[1])
except IndexError:
pass
return key`
2.根据cid号凭借弹幕文件的url获得弹幕list3 def listBarrage(key):
url = 'http://comment.bilibili.com/{}.xml'.format(str(key))
req = requests.get(url)
req.raise_for_status()
req.encoding='utf-8'
# print(req.text)
soup = BeautifulSoup(req.content,"lxml")
list3=list()
for comment in soup.find_all('d'):
# print(soup.find_all('d'))
# time=float(comment.attrs['p'].split(',')[0])
# commentList[time]=comment.string
list3.append(comment.string)
return list3`
把获取到的内容写进文本文件
文章图片
文章图片
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)