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

结果展示:

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

文章插图
 
腾讯视频本文以爬取电影《革命者》为例,讲解如何爬取腾讯视频的弹幕和评论!
网页地址:
https://v.qq.com/x/cover/mzc00200m72fcup.html弹幕 
分析网页依然进入浏览器的开发者工具进行抓包,当视频播放30秒它就会更新一个json数据包,里面包含我们需要的弹幕数据 。
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
得到真实url:
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109541041335587612_1628947050538&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C32%2C1628947057×tamp=15&_=1628947050569https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109541041335587612_1628947050538&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C32%2C1628947057×tamp=45&_=1628947050572其中有差别的参数有timestamp和_ 。_是时间戳 。timestamp是页数,首条url为15,后面以公差为30递增,公差是以数据包更新时长为基准,而最大页数为视频时长7245秒 。依然删除不必要参数,得到url:
https://mfm.video.qq.com/danmu?otype=json&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C18%2C1628418094×tamp=15&_=1628418086509 
实战代码import pandas as pdimport timeimport requestsheaders = {'User-Agent': 'googlebot'}# 初始为15,7245 为视频秒长,链接以三十秒递增df = pd.DataFrame()for i in range(15, 7245, 30):url = "https://mfm.video.qq.com/danmu?otype=json&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C18%2C1628418094×tamp={}&_=1628418086509".format(i)html = requests.get(url, headers=headers).json()time.sleep(1)for i in html['comments']:content = i['content']print(content)text = pd.DataFrame({'弹幕': [content]})df = pd.concat([df, text])df.to_csv('革命者_弹幕.csv', encoding='utf-8', index=False)结果展示:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
评论 
分析网页腾讯视频评论数据在网页底部,依然是动态加载的,需要按下列步骤进入开发者工具进行抓包:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
点击查看更多评论后,得到的数据包含有我们需要的评论数据,得到的真实url:
https://video.coral.qq.com/varticle/6655100451/comment/v2?callback=_varticle6655100451commentv2&orinum=10&oriorder=o&pageflag=1&cursor=0&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1628948867522
https://video.coral.qq.com/varticle/6655100451/comment/v2?callback=_varticle6655100451commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6786869637356389636&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1628948867523
url中的参数callback以及_删除即可 。重要的是参数cursor,第一条url参数cursor是等于0的,第二条url才出现,所以要查找cursor参数是怎么出现的 。经过我的观察,cursor参数其实是上一条url的last参数:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
实战代码import requestsimport pandas as pdimport timeimport randomheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}df = pd.DataFrame()a = 1# 此处必须设定循环次数,否则会无限重复爬取# 281为参照数据包中的oritotal,数据包中一共10条数据,循环280次得到2800条数据,但不包括底下回复的评论# 数据包中的commentnum,是包括回复的评论数据的总数,而数据包都包含10条评论数据和底下的回复的评论数据,所以只需要把2800除以10取整数+1即可!while a < 281:if a == 1:url = 'https://video.coral.qq.com/varticle/6655100451/comment/v2?orinum=10&oriorder=o&pageflag=1&cursor=0&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132'else:url = f'https://video.coral.qq.com/varticle/6655100451/comment/v2?orinum=10&oriorder=o&pageflag=1&cursor={cursor}&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132'res = requests.get(url, headers=headers).json()cursor = res['data']['last']for i in res['data']['oriCommList']:ids = i['id']times = i['time']up = i['up']content = i['content'].replace('n', '')text = pd.DataFrame({'ids': [ids], 'times': [times], 'up': [up], 'content': [content]})df = pd.concat([df, text])a += 1time.sleep(random.uniform(2, 3))df.to_csv('革命者_评论.csv', encoding='utf-8', index=False)


推荐阅读