结果展示:
文章插图
腾讯视频本文以爬取电影《革命者》为例,讲解如何爬取腾讯视频的弹幕和评论!
网页地址:
https://v.qq.com/x/cover/mzc00200m72fcup.html
弹幕 分析网页依然进入浏览器的开发者工具进行抓包,当视频播放30秒它就会更新一个json数据包,里面包含我们需要的弹幕数据 。
文章插图
得到真实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)
结果展示:文章插图
评论
分析网页腾讯视频评论数据在网页底部,依然是动态加载的,需要按下列步骤进入开发者工具进行抓包:
文章插图
点击查看更多评论后,得到的数据包含有我们需要的评论数据,得到的真实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参数:
文章插图
实战代码
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)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 6款超好用的macOS软件,让你的Mac更高效
- 白帽黑客如何使用Metasploit进行SSH服务扫描技巧
- 不会吧,你还不会用RequestId看日志 ?
- Python 中的自然语言处理入门
- C#中使用opencv处理图像
- 游戏视频录制,用什么软件录屏好?
- 好用的企业邮箱怎么选择?可用邮箱大全
- 如何使用 Django 发送电子邮件
- 如何设计百万级的用户ID
- Linux内存占用常用的几个分析方法,你确定都知道?