b站弹幕爬虫
1、打开b站教程
https://www.bilibili.com/read/cv304122/
,得到弹幕文件http://comment.bilibili.com/6154070.xml。关键点就在“6154070”(唯一标志弹幕文件的文件名)中,接下去就要想办法获取文件名了。
2、根据「老七在路上」的原创文章教程“https://blog.csdn.net/qq_52660776/article/details/113076143”中的匹配模式fre.compile(r'”cid”:(.*?),”bvid”:’)对弹幕文件名进行匹配。
#获得弹幕文件的唯一标识:一串数字
findlink = re.compile(r'”cid”:(.*?),”bvid”:’)
cid = re.findall(findlink,res_text)
dm_id = re.split(‘,’,cid[0])[0]
3、获得弹幕文件所在网址的域名
#获得弹幕所在网址
dm_url = ‘http://comment.bilibili.com/{}.xml’.format(dm_id)
4、 获得弹幕的内容
#得到弹幕网页的源代码
dm_res = requests.get(dm_url,headers = HEADERS)
dm_result = dm_res.content.decode(‘utf-8’)#得到弹幕内容
dmlink = re.compile(r'”>(.*?)</d>’)
dm = re.findall(dmlink,dm_result) #
5、把弹幕保存到一个txt文件中
#把弹幕保存到一个txt文件中
with open(“dmtext.txt”,”w”,encoding = “utf-8”) as output:
output.write(str(dm)) #这样得到的是一个列表
整理得到最终的代码
def get_url(url):
#模拟浏览器工作,获取表头,得到网页源代码
HEADERS = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36′,
‘Referer’: ‘https://www.bilibili.com/’,
}
res = requests.get(url,headers = HEADERS)
res_text = res.text
return res_textdef get_dmurl(res_text):
#获得弹幕文件的唯一标识:一串数字
findlink = re.compile(r'”cid”:(.*?),”bvid”:’)
cid = re.findall(findlink,res_text)
dm_id = re.split(‘,’,cid[0])[0]
#获得弹幕所在网址
dm_url = ‘http://comment.bilibili.com/{}.xml’.format(dm_id)
return dm_urldef get_dm(dm_url):
#得到弹幕网页的源代码HEADERS = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36′,
‘Referer’: ‘https://www.bilibili.com/’,
}
dm_res = requests.get(dm_url,headers = HEADERS)
dm_result = dm_res.content.decode(‘utf-8’)
#得到弹幕内容
dmlink = re.compile(r'”>(.*?)</d>’)
dm = re.findall(dmlink,dm_result)
return dmdef main():
url = ‘https://www.bilibili.com/video/BV1nV411v7C4?spm_id_from=333.851.b_7265636f6d6d656e64.5’
res_text = get_url(url)
dm_url = get_dmurl(res_text)
dm = get_dm(dm_url)
#把弹幕保存到一个txt文件中
with open(“dmtext.txt”,”w”,encoding = “utf-8”) as output:
output.write(str(dm))if __name__==’__main__’:
main()
但是发现了一个问题,这个弹幕的数量和网页上显示的弹幕数量不符。len(dm)=1000,但是网页上显示的弹幕数量确是2096(且实时更新),两者不同。这究竟是什么原因呢?