爬取up主的所有视频弹幕

前时间爬了一个视频的弹幕,只爬一个视频没意义,所以我们来爬所有的。完整代码在最后。

这里我以科技美学为例啊(因为每天都看)主页链接:https://space.bilibili.com/3766866/video

 我们先来尝试获取某一个视频的弹幕,打开这个url,f12,进入开发者模式

视频链接:https://www.bilibili.com/video/BV15K411j7rB

 这里好像是chrome的一个bug,我用ie都可以看到,所以最好再配一个火狐

直接访问,弹幕就在这里面了

 然后很简单写个正则就出来了

 这里就解决了如何爬某个视频的弹幕了,接下来我们深入研究一下,如何才能得到一个up主的所有视频弹幕。

注意到这个返回弹幕的那个网址的url,我们随意改变它的oid,会给我返回不同的弹幕内容。

这里可以确信,每个视频对应一个oid,以oid来区别返回的弹幕。

所以,我们只需要获取到他所有的oid就可以得到所有的弹幕解决了。

于是,我找了这个网页中的url,看那个会返回它的oid,最终找到了https://www.bilibili.com/video/BV15K411j7rB

即视频链接的这个url中就会返回oid

 在这里它叫做cid,所以我们得到cid就可以了,编写代码获取cid

 

 至此我们可以通过1.点击一个视频,2.获取oid 3.获取弹幕

这里我用selenium,访问主页链接,来打印它的page_source(因为你有requests得不到,我也不懂为什么)

 这里我们就找到了第一页所有的视频链接,创建一个列表来保存所有链接

 然后我们再按我们第一步获取某个视频oid的方法就可以写所有的了

完整代码如下:

 1 import requests
 2 import parsel
 3 import re
 4 import parsel
 5 from selenium import webdriver11 #代码部分
12 danmu = re.compile('>(.*?)</d>')
13 links = []
14 def get_links(url):
15     browser = webdriver.Chrome()
16     browser.get(url)
17     html = browser.page_source
18     soup = parsel.Selector(html)
19     get_ul = soup.xpath('//ul[@class="list-list"]/*')#获取到父标签
20     for i in range(0,29):
21         link = str(get_ul[i].xpath('./a/@href').extract())
22         link = link.replace('//','')
23         link = link[2:-2]
24         links.append(link)
25 
26 def get_danmu(*links):
27     for urls in links:
28         url ='http://' + urls
29         headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36 Edg/81.0.416.53'}
30         html = requests.get(url,headers)
31         html_text = html.text
32         get_oid = re.search('cid=d*',html_text).group().replace('cid=','')
33         danmu_links = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'.format(get_oid)
34         html = requests.get(danmu_links)
35         html.encoding = 'utf-8'
36         datas = danmu.findall(html.text)[1:]
37         for each in datas:
38             with open('那先生的弹幕.txt','a',encoding='utf-8') as f:
39                 f.write(each)
40                 f.close()
41             print(each)
42 
43 
44 if __name__ == '__main__':
45     url = 'https://space.bilibili.com/3766866/video?tid=0&page=1&keyword=&order=pubdate'
46     get_links(url)
47     get_danmu(*links)

爬第二页第三页找下翻页的规律就行了,要爬取别的up也可以,url也有相应的规律,我就懒得做了。

最后我做了张词云图

原文地址:https://www.cnblogs.com/Truedragon/p/12713504.html