• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Reign
V2EX  ›  程序员

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

  •  
  •   Reign · Nov 12, 2017 · 10828 views
    This topic created in 3278 days ago, the information mentioned may be changed or developed.

    目前服务器上几百个 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 replies  •  2017-11-13 23:26:24 +08:00
    jugelizi
    jugelizi
    Nov 12, 2017
    1
    只能说过滤大部分
    没有技术能百分百

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

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

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

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

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

    所以还是信任 ReCaptcha 吧。

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

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

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

    缺点 手机计算很慢 不过手机本身就很少下载东西。
    anmaz
    anmaz
    Nov 12, 2017 via Android
    31
    文件放第三方云存储产品,只给连接地址和密码,省钱
    as9t
    as9t
    Nov 12, 2017
    32
    滑动图片验证
    sunwei0325
    sunwei0325
    Nov 12, 2017
    33
    本是同根生相煎何太急
    kmahyyg
    kmahyyg
    Nov 12, 2017 via Android
    34
    推荐 geetest
    flynaj
    flynaj
    Nov 12, 2017 via Android
    35
    限时链接,屏蔽一部分,要彻底不可能
    maskerTUI
    maskerTUI
    Nov 12, 2017 via iPhone
    36
    微信扫码登陆下载
    firefox12
    firefox12
    Nov 13, 2017 via iPad
    37
    简单的 反爬虫,中文显示 三加多少等于 201 ?结合加减乘除四种算法,可以解决很多爬虫。
    SlipStupig
    SlipStupig
    Nov 13, 2017
    38
    @wk110 你这个是胡扯,robots 协议是“君子协议”,不遵守也有点事没有

    @Kilerd 当然有一些办法啊,比如:检测 UA 头,如果是 phantomjs 就假数据,你肯定会说我可以换 UA 头啊,这个可以针对一些浏览器内核进行针对性检测,比如:chrome,可以用 websocket 等比较新的浏览器特性请求一下,如果是 firefox,可以使用尝试违法 CSP,firefox 是 CSP 是默认开启的,每种浏览器都有自己的特性可以利用,还有各种小 trick,比如:refer 检测,ip 请求阈值,用 canvas 收集客户端指纹(避免切换代理)、stroge+cookie 加密埋点对客户端访问历史进行 traceback 等等吧,我想说的是 phantomjs 并非无解
    ranleng
    ranleng
    Nov 13, 2017
    39
    用 ppoi 那种验证码. 需要计算一定的 hashes 才能继续.
    一般爬虫不会耗那么多资源去计算 hashes
    kohos
    kohos
    Nov 13, 2017
    40
    下载链接弄临时的,一段时间后失效那种,然后限 IP 一段时间内的下载次数
    Reign
    Reign
    OP
    Nov 13, 2017
    41
    @kohos ip 换代理分分钟给你把资源爬完
    allenhu
    allenhu
    Nov 13, 2017 via Android❤️1
    42
    @Reign 既然那么金贵的资源,那就要求登录或者验证码吧
    rswl
    rswl
    Nov 13, 2017
    43
    爬虫与反爬虫的较量
    keenwon
    keenwon
    Nov 13, 2017
    44
    recaptcha 其实挺烦的,每次都要花 1-2 分钟
    Kilerd
    Kilerd
    Nov 13, 2017
    45
    @SlipStupig 那如果用上 chromeless 呢(好像是这么拼的),简直就是一个无头的 chrome
    vtwoextb
    vtwoextb
    Nov 13, 2017
    46
    有必要加 个 滑动的 解锁功能就行 , 既能保证用户良好的 体验 ,又能滤掉大部分爬虫,这样就行了 没有百分之百,,, 我就比较喜欢研究爬虫 我现在爬了某东 一年多了 也还没有阻止我 https://github.com/hizdm/dynamic_ip 这本身就是攻与防的较量,要在利益之间做权衡
    580a388da131
    580a388da131
    Nov 13, 2017
    47
    能下就能爬,强大如百度网盘不也没辙么。
    限速是绝招。
    stanjia
    stanjia
    Nov 13, 2017
    48
    OSS token 校验下载
    greatghoul
    greatghoul
    Nov 13, 2017 via Android
    49
    @firefox12 打码平台做这个还不是易如反掌
    firefox12
    firefox12
    Nov 13, 2017
    50
    @greatghoul 本来就是成本问题, 给他出奥数 小学 1 年级的题目 保证就没打码公司接了。 但是你的客户也都没了。

    google 的反机器人是强,但是你做不到啊。
    quickma
    quickma
    Nov 13, 2017
    51
    有一个理解,其实真正的人使用浏览器和爬虫在任何非人类的特征上都是没有区别的,浏览器不也是一个爬虫程序吗?只是人操作这个爬虫而已。所以也就是说如果要杜绝,只有在人类的特征上下文章。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3082 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 12:22 · PVG 20:22 · LAX 04:22 · JFK 07:22
    ♥ Do have faith in what you're doing.