用Python爬取六大平台的弹幕、评论,看这一篇就够了( 三 )

效果展示:

用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
B站本文以爬取视频《“ 这是我见过最拽的一届中国队奥运冠军”》为例,讲解如何爬取B站视频的弹幕和评论!
网页地址:
https://www.bilibili.com/video/BV1wq4y1Q7dp弹幕 
分析网页B站视频的弹幕不像腾讯视频那样,播放视频就会触发弹幕数据包,他需要点击网页右侧的弹幕列表行的展开,然后点击查看历史弹幕获得视频弹幕开始日到截至日链接:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
链接末尾以oid以及开始日期来构成弹幕日期url:
https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=384801460&month=2021-08
在上面的的基础之上,点击任一有效日期即可获得这一日期的弹幕数据包,里面的内容目前是看不懂的,之所以确定它为弹幕数据包,是因为点击了日期他才加载出来,且链接与前面的链接具有相关性:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
得到的url:
https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=384801460&date=2021-08-08url中的oid为视频弹幕链接的id值;data参数为刚才的的日期,而获得该视频全部弹幕内容,只需要更改data参数即可 。而data参数可以从上面的弹幕日期url获得,也可以自行构造;网页数据格式为json格式
 
实战代码import requestsimport pandas as pdimport redef data_resposen(url):headers = {"cookie": "你的cookie","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"}resposen = requests.get(url, headers=headers)return resposendef main(oid, month):df = pd.DataFrame()url = f'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid={oid}&month={month}'list_data = data_resposen(url).json()['data']# 拿到所有日期print(list_data)for data in list_data:urls = f'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={oid}&date={data}'text = re.findall(".*?([u4E00-u9FA5]+).*?", data_resposen(urls).text)for e in text:print(e)data = pd.DataFrame({'弹幕': [e]})df = pd.concat([df, data])df.to_csv('弹幕.csv', encoding='utf-8', index=False, mode='a+')if __name__ == '__main__':oid = '384801460'# 视频弹幕链接的id值month = '2021-08'# 开始日期main(oid, month)结果展示:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
评论 
分析网页B站视频的评论内容在网页下方,进入浏览器的开发者工具后,只需要向下拉取即可加载出数据包:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
得到真实url:
https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550479&jsonp=jsonp&next=0&type=1&oid=589656273&mode=3&plat=1&_=1629012090500https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550483&jsonp=jsonp&next=2&type=1&oid=589656273&mode=3&plat=1&_=1629012513080https://api.bilibili.com/x/v2/reply/main?callback=jQuery1720034332372316460136_1629011550484&jsonp=jsonp&next=3&type=1&oid=589656273&mode=3&plat=1&_=1629012803039两条urlnext参数,以及_和callback参数 。_和callback一个是时间戳,一个是干扰参数,删除即可 。next参数第一条为0,第二条为2,第三条为3,所以第一条next参数固定为0,第二条开始递增;网页数据格式为json格式 。
 
实战代码import requestsimport pandas as pddf = pd.DataFrame()headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}try:a = 1while True:if a == 1:# 删除不必要参数得到的第一条urlurl = f'https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next=0&type=1&oid=589656273&mode=3&plat=1'else:url = f'https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next={a}&type=1&oid=589656273&mode=3&plat=1'print(url)html = requests.get(url, headers=headers).json()for i in html['data']['replies']:uname = i['member']['uname']# 用户名称sex = i['member']['sex']# 用户性别mid = i['mid']# 用户idcurrent_level = i['member']['level_info']['current_level']# vip等级message = i['content']['message'].replace('n', '')# 用户评论like = i['like']# 评论点赞次数ctime = i['ctime']# 评论时间data = https://www.isolves.com/it/cxkf/yy/Python/2021-11-15/pd.DataFrame({'用户名称': [uname], '用户性别': [sex], '用户id': [mid],'vip等级': [current_level], '用户评论': [message], '评论点赞次数': [like],'评论时间': [ctime]})df = pd.concat([df, data])a += 1except Exception as e:print(e)df.to_csv('奥运会.csv', encoding='utf-8')print(df.shape)


推荐阅读