当前位置: 首页 > 后端技术 > Python

一个用Python爬虫爬取Bilibili弹幕的小例子解析

时间:2023-03-25 21:16:43 Python

Python爬虫爬bilibili弹幕小例子分析会有2000多个。这么多数据,B站肯定不会直接把弹幕绑在这个视频上。也就是有个视频地址https://www.bilibili.com/video...,直接去requests.get这个地址,里面就没有弹幕了,回忆第一篇携程的方式异步加载数据,B站的弹幕也必须先加载当前视频的界面,再异步填充弹幕。接下来,我们可以打开Firefox浏览器的控制台(正常情况下,Firefox和Google控制台都可以,因为Google中插件拦截的数据包可以被Firefox捕获,Google也是如此)观察网络请求。仔细排查,发现请求的是xml,后面是一个oid。查看其响应内容,发现是一个弹幕文件。它的响应时间是98毫秒,远超其他响应,所以如果把弹幕直接放在视频页面,用户体验肯定会很差。弹幕我们已经找到了,爬取起来很容易,但是我们要爬取固定av号的视频的弹幕,而不是随便找一个oid来爬取弹幕,所以我们不知道弹幕是哪个视频。接下来我们可以复制117784982的oid值,去视频页面搜索看看,通过视频获取它的oid然后爬xml弹幕很方便。这次我用的是谷歌浏览器,在里面搜索oid,找到了相关的数据。其中cid为弹幕对应的id,aid对应视频的av号。先把这个页面爬下来。1#encoding:utf-823importrequests45headers={6'User-Agent':'Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36',7'Accept':'text/html',8'Cookie':"_uuid=1DBA4F96-2E63-8488-DC25-B8623EFF40E773841infoc;buvid3=FE0D3174-E871-4A3E-877C-10A4ED86E20523155831infoc;LIVE_BUVID=AUTO8515670521735348;sid=l765gx48;DedeUserID=33717177;11DedeUserID__ckMd5=be4de02fd64f0e56;SESSDATA=cf65a5e0%2C1569644183%2Cc4de7381;12bili_jct=1e8cdbb5755b4ecd0346761a121650f5;CURRENT_FNVAL=16;stardustvideo=1;rpdid=|(umY))|ukl~0J'ulY~uJm)kJ;UM_distinctid=16ce0e51cf0abc-02da63c2df0b4b-5373e62-1fa400-16ce0e51cf18d8;stardustpgcv=0606;im_notify_type_33717177=0;finger=b3372c5f;CURRENT_QUALITY=112;bp_t_offset_33717177=300203628285382610"910}11resp=requests.get('https://www.bilibili.com/video...',headers=headers)12print(resp.text)拿到内容后,我们要从中解析出弹幕id。对于这种规则混乱的网页,我们不能使用上一篇文章中的Bs4来分析,而是使用正则表达式。使用正则表达式最简单的方法其实就是直接匹配。1re.search(matchingrules,text).group()观察这里的内容,大致的匹配规则就出来了。cid={target}&aid=avnumber117784982是我们的目标。1av_id='67946325'2resp=requests.get('https://www.bilibili.com/video...'+av_id,headers=headers)3match_rule=r'cid=(.*?)&aid'4oid=re.search(match_rule,resp.text).group().replace('cid=','').replace('&aid','')5print('oid='+oid)先根据以av号获取视频页面,然后解析视频页面获取oid,最后使用oid请求xml弹幕文件。1xml_url='https://api.bilibili.com/x/v1...'+oid2resp=requests.get(xml_url,headers=headers)3print(resp)这样我们就完成了弹幕爬虫在B站。