网页视频抓取工具 知乎(如何爬取电影《哥斯拉大战金刚》的弹幕和评论 )
优采云 发布时间: 2021-12-30 05:17网页视频抓取工具 知乎(如何爬取电影《哥斯拉大战金刚》的弹幕和评论
)
开发工具
Python版本:3.6.4
相关模块:
请求模块;
重新模块;
熊猫模块;
lxml 模块;
随机模块;
以及一些 Python 自带的模块。
环境设置
安装Python并将其添加到环境变量中,pip安装所需的相关模块。
思维分析
本文以爬虫电影《哥斯拉大战金刚》为例,讲解如何爬取爱奇艺视频的弹幕和评论!
目标网址
https://www.iqiyi.com/v_19rr0m845o.html 复制代码
Python超全数据库安装包学习路线项目源码免费分享
抢弹幕
爱奇艺视频弹幕还是需要进入开发者工具抓包,并得到一个br压缩文件,点击直接下载,里面的内容是二进制数据,视频播放每分钟加载一个数据包
获取URL,两个URL的区别是增量数,60是视频每60秒更新一次数据包
https://cmts.iqiyi.com/bullet/64/00/1078946400_60_1_b2105043.br\ https://cmts.iqiyi.com/bullet/64/00/1078946400_60_2_b2105043.br 复制代码
br文件可以用brotli库解压,但实际操作难度很大,尤其是编码等问题,很难解决;直接用utf-8解码时,会报如下错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 52: invalid start byte 复制代码
在解码中加入ignore,中文不会乱码,但是html格式出现乱码,数据提取还是有难度
decode("utf-8", "ignore") 复制代码
将获取到的URL修改为如下链接即可获取.z压缩文件
/bullet/64/00/1078946400_300_1.z 复制代码
这个改动的原因是,这是爱奇艺之前的弹幕界面链接,没有删改,目前还可以使用。界面链接中的1078946400为视频id;300是之前爱奇艺的弹幕每5分钟就会加载一个新的弹幕数据包,5分钟是300秒,《哥斯拉大战金刚》时长112.59分钟,除以5,四舍五入为23;1是页数;64 是第 7 个和第 8 个的 id 值。
代码
import requests\ import pandas as pd\ from lxml import etree\ from zlib import decompress # 解压\ \ df = pd.DataFrame()\ for i in range(1, 23):\ url = f'https://cmts.iqiyi.com/bullet/64/00/1078946400_300_{i}.z'\ bulletold = requests.get(url).content # 得到二进制数据\ decode = decompress(bulletold).decode('utf-8') # 解压解码\ with open(f'{i}.html', 'a+', encoding='utf-8') as f: # 保存为静态的html文件\ f.write(decode)\ \ html = open(f'./{i}.html', 'rb').read() # 读取html文件\ html = etree.HTML(html) # 用xpath语法进行解析网页\ ul = html.xpath('/html/body/danmu/data/entry/list/bulletinfo')\ for i in ul:\ contentid = ''.join(i.xpath('./contentid/text()'))\ content = ''.join(i.xpath('./content/text()'))\ likeCount = ''.join(i.xpath('./likecount/text()'))\ print(contentid, content, likeCount)\ text = pd.DataFrame({'contentid': [contentid], 'content': [content], 'likeCount': [likeCount]})\ df = pd.concat([df, text])\ df.to_csv('哥斯拉大战金刚.csv', encoding='utf-8', index=False) 复制代码
显示结果