前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >说说盗链与防盗链

说说盗链与防盗链

作者头像
somenzz
发布2020-11-25 10:23:09
1.1K0
发布2020-11-25 10:23:09
举报
文章被收录于专栏:Python七号Python七号

阅读本文大概需要 3 分钟。

有朋友问我:Python 爬虫如何绕过防盗链机制?

我意识到自己是第一次听说盗链,不是很明白,但感觉这与爬虫与反爬虫有些类似,于是就自己 google 了下。下面说说自己的理解。

现在服务器的价格并不贵,各种网站层出不穷,有不少人在网站建设上投入了不少精力,网站内容上投入了不少优质的资源,比如精美的图片,动感的视频,好听的音乐等等,这些资源都对应有一个 url ,当然网站也有一个 url。正常情况下是这样的:比如网站 A的 url 是 https://somesite.com 里面的动感视频的 url 是 https://somesite.com/video/xxx.mp4 。这些优质的目的是吸引用户,增加流量,而流量最终通过广告或者带货,都可以变为钱。

但另外一些网站也为了吸引用户,也建立了网站 B: https://anothersite.com/ 也想提升访问量,但没有优质的资源,于是就在视频区域内指向别人的视频链接:https://somesite.com/video/xxx.mp4 ,这样,在访问 https://anothersite.com/ 时就可以看到动感的视频,网站 B 就盗取了别人的链接,这就叫盗链。

B 盗取了 A 的视频链接,B 的访问量增加,而 A 网站的访问量并未增加,却白白为 B 贡献了服务器资源,这是无法让 A 忍受的。于是 A 决定防止别人盗取自己的资源链接。其实这有点像反爬虫。

其实一切的网络请求都限定 HTTP 协议的范围内,熟悉了 HTTP 协议,任何 http 请求相关的问题都可以解决。

常见的防盗链方法:

1、判断请求资源的来源是否是本网站的域名。这种方法也是最简单最常用的,因为浏览器在发起下次请求时会把本次的链接放在 HTTP 请求头的 Referer 字段,如下图所示,服务器判断这个 Referer 字段的值是否在本网站的域名之下即可。

2、使用登录验证。这个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证,如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。

不过这种方法有两种缺点:一是正常访客无法匿名下载,会减少不想注册的访客的流量,二是登陆的访客无法使用下载工具下载。

理由:登录状态依赖于会话 id,而会话 id 往往储存于 http 请求的 cookie 字段里,下载工具一般没法获得浏览器的 cookie 字段,所以这些资源往往无法使用下载工具来下载,给正常合法用户带来诸多不便(因为大部分网民的系统都安装了下载工具,一点击下载链接一般会被下载工具拦截,导致无法使用浏览器本身的下载功能)。

这种情况的简单的解决方法是将这个 session id 放到 URL 中,而不放在 cookie 中。

3、使用 cookie 。其实这种方法原理上跟方法 2 差不多。就是在显示“下载”链接的页面里产生一个动态值的 cookie,然后在处理资源下载请求时先判断 cookie 里有没有正确的 cookie,如果没有则返回错误提示信息。至于这个动态值如何产生,只要能逆向判断动态值是否合法的都可以,例如将当前的时间去除秒数取哈希值(也叫散列值)。

4、使用 POST 。客户端浏览器请求资源都是使用 HTTP 的 GET 方法,其实使用POST方法也可以往客户端返回数据。所以可以将下载链接换成一个表单(Form)和一个按钮 (Submit),将待下载的文件的名称或id放到表单的一个隐藏文本框(Input)里,当用户点击提交按钮时,服务程序先判断请求是否为 POST 方式,如果是则读取目标资源的二进制数据并写入响应对象。

使用这个方法的缺点同样是无法使用下载工具,更没法实现断点续传。不过比方法 2,3 好一点的是,下载工具不会拦截你的下载动作,所以正常用户还是比较顺畅地下载到文件。这个方法比较适合小文件的下载。

5、使用验证码。这个原理不多说,缺点也是有的,给正常用户带来不便。

6、使用动态文件名,或者动态的 url 链接。当用户点击一个下载链接时,先在程序端计算一个Key(使用一定规律产生的 Key,最好不要使用随机字符串例如 GUID,并且这个 Key 必须有一定时效的),然后在数据库或 Cache 里记录这个 Key 以及它所对应的资源 ID 或文件名,最后让网页重定向一个新的 URL 地址,这个新 URL 地址里需要包含这个 Key。当浏览器或下载工具发出下载请求时,程序先检测这个 Key 是否存在,如果存在则返回对应的资源数据。

使用这个方法的好处是下载工具也可以下载,并且在 Key 失效前可以断点续传,并且可以通过 Key 来控制下载的线程数。

使用这个方法坏处是:当任意一个用户下载成功之后,你的资源就会被一些下载工具列入“资源候选名单”,以后其他人在其他地方下载同样的文件时,下载工具会不断连接你的服务器,即使你的文件已经删除或者 Key已经失效了,这样会造成类 DDos 攻击的后果。

盗链的方法

我劝你善良。盗链者一般都是直接把别人资源的 url 放在自己的网站上,以上的防盗链方法在应付这种足足有余。想用简单的方法盗链还是放弃吧。如果你不嫌麻烦,可以将别人的资源手工下载后放在自己的网站上,这样做有引起版权纠纷的风险。

Python 爬虫如何绕过防盗链机制?

当然如果你不想盗链,仅仅是爬虫的话,想绕过防盗链机制,也几乎是不可能的,你能做的,就是让爬虫的行为来符合服务器的验证规则。

常见的 Python 爬虫策略: 1、构造 HEADERS ,模拟浏览器的行为。 2、加入用户验证环节,获取 token 。 这里给出曾用过的一个例子:

代码语言:javascript
复制
def get_token():
    response = requests.post(url_prefix, json.dumps({"username": username, "password": password}), headers={"Content-Type": "application/json"})
    if response.status_code >= 300:
        raise Exception("Get token fail")
    print("Get token success ({})".format(response.json()["token"]))
    return response.json()["token"]

3、分析 cookie 产生的规则,手动生成服务器认可的 cookie。 4、直接使用浏览器的工具,如 selenium,splinter 等。

(完)

专注于Python技术分享

每周五发车

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 盗链的方法
  • Python 爬虫如何绕过防盗链机制?
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档