爬取视频网站需要进行防盗链的预习
何为防盗链?
正文开始
打开网址,随便找一个视频点进去,然后打开开发者工具,定位到视频的位置可以找到标签
注意:此标签在HTML中并没有出现,所以要进入NetWork选中XHR然后刷新页面,可以看到返回的数据
数据包返回的地址为:https://video.pearvideo.com/mp4/adshort/20211020/1634730996384-15784833_adpkg-ad_hd.mp4
从video标签中可以看出正确的视频地址为:https://video.pearvideo.com/mp4/adshort/20211020/cont-1744131-15784833_adpkg-ad_hd.mp4
从而找出他们俩的不同之处,进行Url的修整
思路:
1.此网站做了防盗链(所以必须在服务器返回的响应包中提取Referer参数并加入到headers中)
2.服务器返回的数据包中,给出的视频地址并不正确,与原页面用开发者工具找到的<video>标签中的连接并不相同,所以要进行更改
3.页面中的<video>标签并不是服务器在第一时间返回的HTML页面,而是后来请求返回的数据包,通过NetWOrk的XHR中可以查看数据包并定位到SrcUrl
import requests
url='https://www.pearvideo.com/video_1744131'
contId=url.split("_")[1] #根据url提取contId方便后续处理
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
"Referer": "https://www.pearvideo.com/video_1744131" #防盗链
}
videoUrl=f'https://www.pearvideo.com/videoStatus.jsp?contId={contId}&mrd=0.91042477668021'#这个地址是视频数据包的URL
resp=requests.get(url=videoUrl,headers=headers)
videoNewUrl=resp.json() #返回请求包的json格式数据,获得视频的URL
systemTime=videoNewUrl['systemTime'] #根据SrcUrl提取出此项
srcUrl=videoNewUrl['videoInfo']['videos']['srcUrl'] #根据层级关系,将URL提取出来
video=srcUrl.replace(systemTime,f"cont-{contId}") #进行最后的替换,此链接就是视频的链接
#下载视频
with open("video.mp4","wb") as fp:
fp.write(requests.get(video).content) #注意:下载视频意思就是获取内容,所以用.content