zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python--爬虫,了解防盗链-->解决防盗链,解决反反反爬

Python爬虫 解决 -- 了解 防盗链
2023-09-11 14:16:59 时间

目录

一、什么是防盗链?其作用/原理是什么?

概念:

作用:

原理:

如何进行防盗链保护:

二、步骤分析

2.1、运行环境

2.2、目标

2.3、页面分析

2.3.1、进入主页面,尝试分析源代码

2.3.2、分析页面视频标签元素

2.3.3、分析页面源文件

2.3.4、解决js渲染-->抓包

2.3.5、防盗链解决并解析

三、完整代码

四、结果

五、总结与改进


一、什么是防盗链?其作用/原理是什么?

概念:

        防盗链是采用服务器端编程,通过URL过滤技术实现的防止盗链(防止获取真实链接)的技术。要显示的内容不在自己的服务器上,而是通过技术(JS等),绕过别人的最终页面,直接在自己的页面向用户提供内容。

作用:

        1)防止内容被窃取

        2)防止页面被攻击

原理:

        从HTTP协议说起,在HTTP协议中,有一个表头字段:referer,采用URL的格式来表示从哪一个链接跳转到当前的网页或者文件。我的理解是:你(客户机)具体从哪里来,我(服务器)可以进行溯源。一旦检测来源不是网页所规定的,立即进行阻止或者返回指定的页面。

如何进行防盗链保护:

        1)网站服务器是apache,可以使用apache自带的Url Rewrite功能进行保护,其原理是检查referer,如果referer的信息来自其他网站则重定向到指定的页面或者图片上;

        2)网站服务器是IIS,需要使用第三方插件来实现防盗链功能,例如:ISAPI_Rewrite,可以实现类似apache的防盗链功能。

二、步骤分析

2.1、运行环境

        电脑系统:win10家庭版

        编辑器:pucharm edu

        浏览器:我用的是搜狗、火狐(几乎任何搜索引擎都可以)

2.2、目标

        视频网站,梨视频,获取该网站的部分视频;

2.3、页面分析

2.3.1、进入主页面,尝试分析源代码

(目的是为了看我们所需的视频链接是否在页面源代码),右键页面空白处,点击审查元素(要先知道视频的标签名称是什么才好在页面源代码找);

2.3.2、分析页面视频标签元素

(此时已经进入审查元素)

发现视频被包含在有阴影的标签,我们尝试打开

 

跳转到播放视频界面,我们按照之前的步骤,继续审查元素,查看视频具体的标签内容包含在一部分

可以知道,视频是被video标签包含着的,我们需要的是src的播放链接;

2.3.3、分析页面源文件

鼠标右键打开当前播放视频页面源文件,查找video标签;

按下快捷查找,Ctrl+F ,输入<video,为啥不直接输入video呢?因为我们要找的是video标签,而标签的左边一定是“<”这个符号,可以看到搜索结果是0;

 

那我们在页面源代码找不到标签,我们就可以合理的推测,这个页面显示出来的东西(起码说视频的实际播放链接),应该是js经过二次处理,渲染出来的内容;

解决办法:

        打开搜索引擎自带的抓包工具(自己下载的抓包工具也行,本次使用的是搜索引擎自带的),抓XHR类型的包(这个包是js处理的),注意要再次发起请求(所以要在url栏按下回车);

2.3.4、解决js渲染-->抓包

 

进入搜索引擎的开发者模式,按照图片所示的数字依次完成;

抓到这个包,进行分析

 

headers(请求头),Preiview(映射) ,Response(响应),一般来说是分析这三个,在Rreview发现有一个链接,好像和我们之前在标签video看到的链接有一点点像;

把这两个链接都复制出来进行比较;

# 这个是审查元素看到的链接
src="https://video.pearvideo.com/mp4/short/20171111/cont-1196816-11111620-hd.mp4"

# 这个是我们抓包看到的链接
srcUrl: "https://video.pearvideo.com/mp4/short/20171111/1667454066881-11111620-hd.mp4"

# 抓包看到的
systemTime: "1667454066881"

# 我们在播放视频时,页面url栏的地址
https://www.pearvideo.com/video_1196816

# 比较
https://video.pearvideo.com/mp4/short/20171111/cont-1196816-11111620-hd.mp4(可以播放)
https://video.pearvideo.com/mp4/short/20171111/1667454066881-11111620-hd.mp4(不能播放)

很容易就能得出结论:经过js处理,把实际链接的cont-1196816部分替换成了1667454066881(systemTime)

那么我们进行处理,把抓包的链接进行拼接,就能得到真正可以进行播放的链接,进而进行下载

代码:

import requests
def down_src():
url = "https://www.pearvideo.com/video_1160135"
    video_id = url.split("_")[-1]  # 把cont-后面的数字提取出来
    video_url = f"https://www.pearvideo.com/videoStatus.jsp?contId={video_id}"  # 拼接请求url
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0",
    }
    resp = requests.get(video_url, headers=header)
    print(resp.text)

说明:我们要请求到的url很明显是抓包里的headers的url,然后把要拼接的url请求出来(简单处理反爬,加上一个请求头),因为我们要这个包的内容,当然要请求到这个请求里的url;

以上代码调用并运行结果:

很明显,我们能播放视频,但是显示的内容是文章已经下线,很明显是被反反爬了;

下面进行处理:

2.3.5、防盗链解决并解析

 如下流程图1、2、3

图1

 图2

 图3

解决办法,

 

很多网页的防盗链,是加入了一个Referer,进行溯源;我们把这个参数加到请求中进行尝试;

代码如下:

import requests
def down_src():
referer = "https://www.pearvideo.com/video_1160135"
    video_id = referer.split("_")[-1]  # 把cont-后面的数字提取出来
    video_url = f"https://www.pearvideo.com/videoStatus.jsp?contId={video_id}"  # 拼接请求url
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0",
        "referer": referer
    }
    resp = requests.get(video_url, headers=header)
    print(resp.text)

调用并运行的结果:

可以看到,已经成功拿到了要使用的srcUrl,接下来可以进行拼接;

思路:因为现实出来的内容是json格式,我们可以把这些内容赋值给一个字典,然后在字典里进行提取需要的内容,进行拼接即可

拼接部分的代码:

resp = requests.get(video_url, headers=header)
dit = resp.json()
src_url = dit['videoInfo']['videos']['srcUrl']
systime = dit['systemTime']
src_url = src_url.replace(systime, f"cont-{video_id}")
print(src_url)

三、完整代码

import requests


def down_src():
    referer = "https://www.pearvideo.com/video_1160135"  # url栏的链接
    video_id = referer.split("_")[-1]  # 把cont-后面的数字提取出来
    video_url = f"https://www.pearvideo.com/videoStatus.jsp?contId={video_id}"  # 拼接请求url
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0",
        "referer": referer
    }
    resp = requests.get(video_url, headers=header)
    dit = resp.json()
    src_url = dit['videoInfo']['videos']['srcUrl']
    systime = dit['systemTime']
    src_url = src_url.replace(systime, f"cont-{video_id}")
    print(src_url)
    # 下载视频
    with open("1.mp4", mode="wb") as f:
        f.write(requests.get(src_url).content)


if __name__ == '__main__':
    print("开始爬取")
    down_src()
    print("爬取结束")

四、结果

爬取到的链接可以播放,并且把该链接的内容保存到当前文件夹下(也可播放);

 

 

五、总结与改进

总结:

5.1、需要的内容不在页面源代码里怎么解决?

5.2、遇到防盗链怎么解决?

5.3、一次性爬取很多视频内容怎么解决呢(因为页面源代码没有这些链接)?

改进:

5.4、规范代码

5.5、爬取速度慢要解决