V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Reign
V2EX  ›  程序员

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

  •  
  •   Reign · 2017-11-12 10:14:44 +08:00 · 9257 次点击
    这是一个创建于 2561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前服务器上几百个 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 友有没有好点的办法?不胜感激

    51 条回复    2017-11-13 23:26:24 +08:00
    jugelizi
        1
    jugelizi  
       2017-11-12 10:30:05 +08:00
    只能说过滤大部分
    没有技术能百分百

    js 生成动态下载链接 一次性 复制出来过期就失效
    Reign
        2
    Reign  
    OP
       2017-11-12 10:35:39 +08:00
    @jugelizi 对 phantomjs 来说,你这个不成立
    jamfer
        3
    jamfer  
       2017-11-12 10:37:46 +08:00
    给下载链接生成一次性下载地址,XX 分钟后失效
    xmcp
        4
    xmcp  
       2017-11-12 10:37:53 +08:00 via iPhone
    recaptcha 在大陆可以用,参见 waifu2x.udp.jp 。此贴终结。
    dong3580
        5
    dong3580  
       2017-11-12 10:43:35 +08:00 via Android
    一次性 hash 链接,后端给出链接下载,链接一旦生成在请求就失效了,所以你需要一个表记录。
    Reign
        6
    Reign  
    OP
       2017-11-12 10:46:04 +08:00
    @jamfer
    @dong3580 这些防不了 phantomjs 啊
    Kilerd
        7
    Kilerd  
       2017-11-12 10:51:21 +08:00   ❤️ 2
    phantomjs 使用得恰当,跟真人访问无差。

    如果楼主找到一个能防 phantom 的方法,请麻烦告诉我一下,谢谢
    skyjerry
        8
    skyjerry  
       2017-11-12 10:51:49 +08:00 via iPhone
    点击下载弹出 confirm 哈哈
    kimown
        9
    kimown  
       2017-11-12 10:56:02 +08:00 via Android
    简化注册登陆流程,比如说只支持微信扫码登陆,虽然本人极为讨厌这种方法,但可以解决问题
    fiht
        10
    fiht  
       2017-11-12 11:07:10 +08:00
    上个滑动验证码能解决很大一部分爬虫。---别的都是扯淡
    crab
        11
    crab  
       2017-11-12 11:12:23 +08:00
    手机发短信才能获取一次性 hash 下载链接。
    alvinbone88
        12
    alvinbone88  
       2017-11-12 11:16:37 +08:00   ❤️ 2
    下载页加 ReCaptcha
    附一个国内能用的 ReCaptcha API 地址
    https://recaptcha.net/recaptcha/api.js
    vicki
        13
    vicki  
       2017-11-12 11:18:59 +08:00 via iPhone
    做 ip 时间 次数等限制
    lianyue
        14
    lianyue  
       2017-11-12 11:21:25 +08:00
    一个 ip x (分钟,小时,天)内下载数量 超过 x 次 加验证码就好了 ,, 拖拽验证的那种或者 ReCaptcha
    zea
        15
    zea  
       2017-11-12 12:09:36 +08:00
    "幼儿园大班毕业"这个有点……
    opengps
        16
    opengps  
       2017-11-12 12:11:58 +08:00
    ua 信息过滤,reffer 过滤,ip 过滤(排斥来自阿里云腾讯云的网段),下载链接有效期设置等方法
    won
        17
    won  
       2017-11-12 12:12:31 +08:00
    中间加个 token 服务器,被破解了就换 token
    colincat
        18
    colincat  
       2017-11-12 12:18:06 +08:00 via iPhone
    滑动验证码
    xeis
        19
    xeis  
       2017-11-12 12:30:41 +08:00 via Android   ❤️ 1
    后台用不显示的字符混淆链接,发到前端,只允许复制,不可以点击
    wk110
        20
    wk110  
       2017-11-12 12:38:00 +08:00
    做一个限制搜索引擎的 roobts,限制在你的那个下载文件的目录里。这样可能会好一点,针对所有爬虫
    chinvo
        21
    chinvo  
       2017-11-12 12:38:15 +08:00   ❤️ 2
    Invisible ReCaptcha + user-agent, refer, ip (asn) 过滤 + 一次性 token + js 动态输出地址

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

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

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

    所以还是信任 ReCaptcha 吧。

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

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

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

    缺点 手机计算很慢 不过手机本身就很少下载东西。
    anmaz
        31
    anmaz  
       2017-11-12 17:12:40 +08:00 via Android
    文件放第三方云存储产品,只给连接地址和密码,省钱
    as9t
        32
    as9t  
       2017-11-12 22:24:51 +08:00
    滑动图片验证
    sunwei0325
        33
    sunwei0325  
       2017-11-12 22:37:52 +08:00
    本是同根生相煎何太急
    kmahyyg
        34
    kmahyyg  
       2017-11-12 22:49:10 +08:00 via Android
    推荐 geetest
    flynaj
        35
    flynaj  
       2017-11-12 23:03:55 +08:00 via Android
    限时链接,屏蔽一部分,要彻底不可能
    maskerTUI
        36
    maskerTUI  
       2017-11-12 23:07:25 +08:00 via iPhone
    微信扫码登陆下载
    firefox12
        37
    firefox12  
       2017-11-13 00:30:09 +08:00 via iPad
    简单的 反爬虫,中文显示 三加多少等于 201 ?结合加减乘除四种算法,可以解决很多爬虫。
    SlipStupig
        38
    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
        39
    ranleng  
       2017-11-13 08:31:26 +08:00
    用 ppoi 那种验证码. 需要计算一定的 hashes 才能继续.
    一般爬虫不会耗那么多资源去计算 hashes
    kohos
        40
    kohos  
       2017-11-13 08:51:50 +08:00
    下载链接弄临时的,一段时间后失效那种,然后限 IP 一段时间内的下载次数
    Reign
        41
    Reign  
    OP
       2017-11-13 08:54:56 +08:00
    @kohos ip 换代理分分钟给你把资源爬完
    allenhu
        42
    allenhu  
       2017-11-13 09:20:54 +08:00 via Android   ❤️ 1
    @Reign 既然那么金贵的资源,那就要求登录或者验证码吧
    rswl
        43
    rswl  
       2017-11-13 09:50:30 +08:00
    爬虫与反爬虫的较量
    keenwon
        44
    keenwon  
       2017-11-13 10:02:33 +08:00
    recaptcha 其实挺烦的,每次都要花 1-2 分钟
    Kilerd
        45
    Kilerd  
       2017-11-13 10:45:44 +08:00
    @SlipStupig 那如果用上 chromeless 呢(好像是这么拼的),简直就是一个无头的 chrome
    vtwoextb
        46
    vtwoextb  
       2017-11-13 10:51:18 +08:00
    有必要加 个 滑动的 解锁功能就行 , 既能保证用户良好的 体验 ,又能滤掉大部分爬虫,这样就行了 没有百分之百,,, 我就比较喜欢研究爬虫 我现在爬了某东 一年多了 也还没有阻止我 https://github.com/hizdm/dynamic_ip 这本身就是攻与防的较量,要在利益之间做权衡
    580a388da131
        47
    580a388da131  
       2017-11-13 10:52:04 +08:00
    能下就能爬,强大如百度网盘不也没辙么。
    限速是绝招。
    stanjia
        48
    stanjia  
       2017-11-13 10:54:17 +08:00
    OSS token 校验下载
    greatghoul
        49
    greatghoul  
       2017-11-13 10:58:05 +08:00 via Android
    @firefox12 打码平台做这个还不是易如反掌
    firefox12
        50
    firefox12  
       2017-11-13 16:14:46 +08:00
    @greatghoul 本来就是成本问题, 给他出奥数 小学 1 年级的题目 保证就没打码公司接了。 但是你的客户也都没了。

    google 的反机器人是强,但是你做不到啊。
    x7395759
        51
    x7395759  
       2017-11-13 23:26:24 +08:00
    有一个理解,其实真正的人使用浏览器和爬虫在任何非人类的特征上都是没有区别的,浏览器不也是一个爬虫程序吗?只是人操作这个爬虫而已。所以也就是说如果要杜绝,只有在人类的特征上下文章。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2912 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:22 · PVG 14:22 · LAX 22:22 · JFK 01:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.