2021-03-05

  • Post author:
  • Post category:其他


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_text

def 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_url

def 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 dm

def 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(且实时更新),两者不同。这究竟是什么原因呢?



版权声明:本文为by_hei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。