防止下载链接被爬虫抓取,有没有最好的方法?

2017-11-12 10:14:44 +08:00
 Reign

目前服务器上几百个 G 的文件全都是静态文件下载地址,只要是幼儿园大班毕业的人都可以不费吹灰之力写个爬虫爬下来,如果想要彻底屏蔽爬虫,包括 Googlebot、bingbot 之类的全都屏蔽了,只允许普通用户用浏览器正常点击后下载,有哪些办法,我目前想了一些办法都不成熟:

  1. 用户注册登录后才能下载,注册页面加上 recaptcha,弊端就是一个“注册登录”会烦掉很多用户,况且 recaptcha 在大陆没法使用
  2. 输入验证码后下载,感觉繁琐而麻烦
  3. 客户端 js 生成一个 token 和服务器端 php 进行校对,这个能屏蔽很多 file_get_contents,但是对于 phantomjs 等无头浏览器无能为力
  4. Google 了一下有很多检验客户端是否为 headless 浏览器的方法,但感觉这些方法随着 phantomjs 不断升级都会不断失效,于是我在想对一个下载按钮比如:“点此下载文件”,每次点击记录鼠标的坐标,如果每次鼠标的坐标像素值( e.pageX 和 e.pageY )都一模一样,就判断为爬虫然后返回脏数据,就是不知道这种原理该怎样实现?用 cookie 来记录?
  5. 蜜罐法,这个貌似很不靠谱,因为我写爬虫第一时间都是去看它的 robots 有没有蜜罐

上面就当抛砖引玉吧,不知道各位 V 友有没有好点的办法?不胜感激

9072 次点击
所在节点    程序员
51 条回复
chinvo
2017-11-12 12:38:15 +08:00
Invisible ReCaptcha + user-agent, refer, ip (asn) 过滤 + 一次性 token + js 动态输出地址

你还可以丧心病狂地把 ReCaptcha 换成门罗币挖矿“验证码”

至于 phantomjs,说实话一切技术手段只能增加获取难度而不能完全杜绝。
chinvo
2017-11-12 12:40:21 +08:00
至于你说的点击坐标问题,那就是 Invisible ReCaptcha 做的工作。

而且你自己实现简单的判断,爬虫里面加个 random 函数就废了。

所以还是信任 ReCaptcha 吧。

另外 ReCaptcha 的 api,把 google.com 替换成 recaptcha.net 可在国内正常工作。
picone
2017-11-12 13:01:59 +08:00
除了楼上的,还可以
频率限制,正常用户不会下载那么多资源
又或者下载要付出代价,比如积分
stanjia
2017-11-12 13:23:07 +08:00
关闭网站...
hkbtele
2017-11-12 13:30:08 +08:00
点击输入邮箱,生成一个动态下载链接发给邮箱,感觉好烦人……
janxin
2017-11-12 13:36:20 +08:00
如果是通用爬虫加上一次性 token 就够了,如果是防止用户下载,可以换其他方式,没必要对着爬虫来
winglight2016
2017-11-12 13:49:55 +08:00
要求打开网页才能下载这个不就是想多点广告费吗?告诉你一个好办法:把下载链接隐藏在 N 个第三方网站之后,比如:我常用的一个下载电子书的网站是这样做的,先点击进入一个网盘网站(限 ip 和间隔时间加验证码),通过后进入一个短链网站( google captcha+限时),基本上这么折腾会过滤掉大部分爬虫和小部分用户。

所以,楼主到底是什么资料?有没有这么宝贵,可以让人不计麻烦的下载,或者反过来想,真这么宝贝,外包出去手动下载也不是不行啊
laqow
2017-11-12 14:13:36 +08:00
没有公开的链接怎么批量爬?感觉楼主把文件名改成没规律的字符,前面加个随机的文件夹名,下载页加点认证校验方式,大文件附网盘链接。或者把文件下载丢到不记流量但带宽很小的服务器上去就可以了吧?
clino
2017-11-12 15:43:17 +08:00
要不你弄一个只有鼠标移过去才能正常下载的,这样是不是能防一点无头爬的方式?
yuanfnadi
2017-11-12 16:41:25 +08:00
门罗币 hash 验证码

优点 完全不怕爬虫 因为每次下载都需要点击然后计算 hash 就算是无头浏览器也要消耗大量资源来计算。对于普通用户操作简单,只需要点按就可以。

缺点 手机计算很慢 不过手机本身就很少下载东西。
anmaz
2017-11-12 17:12:40 +08:00
文件放第三方云存储产品,只给连接地址和密码,省钱
as9t
2017-11-12 22:24:51 +08:00
滑动图片验证
sunwei0325
2017-11-12 22:37:52 +08:00
本是同根生相煎何太急
kmahyyg
2017-11-12 22:49:10 +08:00
推荐 geetest
flynaj
2017-11-12 23:03:55 +08:00
限时链接,屏蔽一部分,要彻底不可能
maskerTUI
2017-11-12 23:07:25 +08:00
微信扫码登陆下载
firefox12
2017-11-13 00:30:09 +08:00
简单的 反爬虫,中文显示 三加多少等于 201 ?结合加减乘除四种算法,可以解决很多爬虫。
SlipStupig
2017-11-13 01:53:02 +08:00
@wk110 你这个是胡扯,robots 协议是“君子协议”,不遵守也有点事没有

@Kilerd 当然有一些办法啊,比如:检测 UA 头,如果是 phantomjs 就假数据,你肯定会说我可以换 UA 头啊,这个可以针对一些浏览器内核进行针对性检测,比如:chrome,可以用 websocket 等比较新的浏览器特性请求一下,如果是 firefox,可以使用尝试违法 CSP,firefox 是 CSP 是默认开启的,每种浏览器都有自己的特性可以利用,还有各种小 trick,比如:refer 检测,ip 请求阈值,用 canvas 收集客户端指纹(避免切换代理)、stroge+cookie 加密埋点对客户端访问历史进行 traceback 等等吧,我想说的是 phantomjs 并非无解
ranleng
2017-11-13 08:31:26 +08:00
用 ppoi 那种验证码. 需要计算一定的 hashes 才能继续.
一般爬虫不会耗那么多资源去计算 hashes
kohos
2017-11-13 08:51:50 +08:00
下载链接弄临时的,一段时间后失效那种,然后限 IP 一段时间内的下载次数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/405660

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX