持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天, 点击查看活动详情
前言
本文主要讲解了视频爬取中的防盗链的处理,以及网易云评论的爬取综合案例来强化我们之前学过的知识。
如果你对爬虫仍然不太了解的话,可以先阅读一下我的前两篇文章:
本文参考链接 :
防盗链的概念
关于防盗链,一定有小伙伴会问?什么是防盗链?在爬取信息的时候为什么要对防盗链进行处理呢?
盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担
我们这里需要爬取的视频就属于需要获取资源地址,并在自己的页面上展示的范围,所以需要对防盗链进行处理,不然是爬取不到视频资源的~
防盗链的工作原理:
通过Refer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示他的网页地址 一旦检测到来源不是本站,即进行阻止或者返回指定的页面。
关于防盗链的详情原理与实现可以移步了解 -> 防盗链的原理以及实现 - 知乎 (zhihu.com)
所以我们对防盗链的处理其实也就是在headers
里面加上了Referer
参数。
防盗链的处理
下面以爬取梨视频为例,目标网站地址:https://www.pearvideo.com/
F12
键 ,寻找视频地址, 可以尝试直接搜索(Ctrl+F) vedio 标签 。
但是这里的<vedio>
标签是通过js渲染上去的,在页面源代码中并不能提取到,所以在这里我们直接复制vedio标签中视频播放路径src属性。
但是注意到这里有个坑,这个视频连接其实是实时渲染上去的,那个连接中的20210924
后面的一串数字很大可能就是当前播放视频的时间戳,所以这里需要查看网络,清空输出台,选中Fetch/XHR
,然后点击刷新按钮,观察发送请求,就可以看到当前视频真正的请求地址了。
页面标签中的src
https://video.pearvideo.com/mp4/adshort/20210924/1633438051634-15773028_adpkg-ad_hd.mp4
实际的url
src="https://video.pearvideo.com/mp4/adshort/20210924/cont-1742368-15773028_adpkg-ad_hd.mp4"
可以看到实际的请求地址就是把cont-1742368
变成了一串1633438051634
,这里的cont-1742368
其实就是contId,即内容的id。
然后需要对防盗链进行处理了
随便点击一个视频看当前页面的链接其实就是 https://www.pearvideo.com/ + vedio_contId
。
所以这里的Referer我们可以自己构造,因为在前面分析视频的真正播放地址的时候我们就已经分析得到了视频的contId
,即1742368
。
当然你也可以直接查看参数,也就是找
User-Agent
的地方,直接复制也可。
整个爬取的视频的思路仍然和前面一样,确定目标网址 -> 请求该网址 ->读取response -> 处理response -> 下载视频/...
完整代码如下:
# 爬取步骤:
# 1.拿到contId
# 2.拿到vedioStatus返回的Json -> srcUrl
# 3.srcUrl里面的内容进行调整
# 4.下载视频
# refer : 就是一个溯源,寻找请求的网址是哪一个
import requests
url = "https://www.pearvideo.com/video_1742368"
contId = url.split("_")[1] # 以"_"分割 拿到 "_" 后面的编号1742368
videoStatusUrl = f"https://www.pearvideo.com/videoStatus.jsp?contId={contId}&mrd=0.5467768006452396"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38",
# 防盗链:溯源,当前本次请求的上一级是谁
"Referer": url
}
resp = requests.get(videoStatusUrl, headers=headers)
dic = resp.json()
srcUrl = dic['videoInfo']['videos']['srcUrl']
systemTime = dic['systemTime']
# https://video.pearvideo.com/mp4/adshort/20210924/1633438051634-15773028_adpkg-ad_hd.mp4
# src="https://video.pearvideo.com/mp4/adshort/20210924/cont-1742368-15773028_adpkg-ad_hd.mp4"
srcUrl = srcUrl.replace(systemTime,f"cont-{contId}")
print(srcUrl)
# 下载视频
with open("a.pm4",mode="wb") as f:
f.write(requests.get(srcUrl).content)
这次的文章就暂且码到这儿了⛷️⛷️⛷️,后续更新XHR断点调试以及视频m3u8解密~
往期好文推荐🪶
「Android」1.简单的登录页面设计