V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
woshinide300yuan
V2EX  ›  NGINX

这种爬虫是不是无解?

  •  
  •   woshinide300yuan · 2017-05-06 10:07:09 +08:00 · 11371 次点击
    这是一个创建于 2750 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://wx1.sinaimg.cn/large/7e8b4ac8ly1ffbewcp4wrj20wl0d50y1.jpg

      • 对于封禁爬虫,我只会屏蔽 IP 和屏蔽 UA 两种,并且这个 UA 屏蔽起来似乎误伤面积会很大。

    问题来了,这么写 if ($http_user_agent ~ "Mozilla/5.0" ) { return 403;
    }

    是不是所有 Mozilla/5.0 都进不来了。

    不会不懂了,请 dalao 明示,嘿嘿,谢谢,周末愉快~

    62 条回复    2017-09-13 16:18:45 +08:00
    woshinide300yuan
        1
    woshinide300yuan  
    OP
       2017-05-06 10:07:19 +08:00
    dd99iii
        2
    dd99iii  
       2017-05-06 10:10:59 +08:00   ❤️ 1
    道高一尺魔高一丈
    woshinide300yuan
        3
    woshinide300yuan  
    OP
       2017-05-06 10:15:06 +08:00
    @dd99iii 我觉得也是 = = 已送去感谢!!
    zhs227
        4
    zhs227  
       2017-05-06 10:15:43 +08:00   ❤️ 1
    只要不是把服务器采挂了,对方采就让它采。万一对方是用真实浏览器采的呢,怎么区分
    频度高的封 IP,频度低的就只能任由它,根本没有简单的处理的办法
    woshinide300yuan
        5
    woshinide300yuan  
    OP
       2017-05-06 10:20:14 +08:00
    @zhs227 如果到采挂了的底部,是不是挂 CDN 会好点?

    还好现在不疼不痒的。

    已感谢!
    liuhaotian
        6
    liuhaotian  
       2017-05-06 10:27:42 +08:00   ❤️ 1
    你可以看到它们都是在一个 C 段下
    很直接的一个做法:用 redis 之类做一个记录 key 是 x.x.x.0/24,超过了一个阈值就封禁这个 C 段

    更复杂的话 可以用前端再做一层验证
    zhs227
        7
    zhs227  
       2017-05-06 10:29:05 +08:00   ❤️ 1
    挂 CDN 能应对更大规模的开采,如果你的源服务器应付不了那么大的访问量的话。
    如果是固定 IP 大规模开,直接排一下序把最顶上的用 iptables 干掉,或者采用某些手段限制访问频次。不痛不痒就算了,随便让它开采。本来开放的 web 就是让人访问的,人和机器访问的界限有时候很模糊。
    woshinide300yuan
        8
    woshinide300yuan  
    OP
       2017-05-06 10:30:36 +08:00
    @zhs227 回答很有帮助,不管是技术还是思路,谢谢。
    woshinide300yuan
        9
    woshinide300yuan  
    OP
       2017-05-06 10:31:27 +08:00   ❤️ 1
    @liuhaotian 谢谢,我去学习下如何做一个访问频率。V2 就好棒,那天我机械键盘 F5 回弹卡住了,一直刷的封了 IP - - 破键盘~买到残次品了。
    O14
        10
    O14  
       2017-05-06 10:35:06 +08:00 via Android   ❤️ 1
    把他这几个 IP 封一段时间,重点照顾下这几个 IP,每秒超过 5 个请求就屏蔽一天,让他学乖点,一秒只请求你网站一次
    winterbells
        11
    winterbells  
       2017-05-06 10:47:48 +08:00   ❤️ 1
    关于防爬虫有个想法
    可不可以在页面添加几个链接,用 css 隐藏掉(或者用 js 禁止点击?),保证正常浏览网页的人不会去访问这几个链接
    有用户访问其中两个或以上链接的时候就暂时禁掉这个 ip [._________.]⊿
    hcymk2
        12
    hcymk2  
       2017-05-06 11:07:09 +08:00   ❤️ 1
    $http_user_agent='Mozilla/5.0'
    当然这只是临时的方法。别人换个 UA 你就没办法了。
    taineric
        13
    taineric  
       2017-05-06 11:11:06 +08:00 via Android   ❤️ 1
    @winterbells 浏览器预读会不会预读到
    quericy
        14
    quericy  
       2017-05-06 11:16:36 +08:00   ❤️ 2
    @winterbells #11 11 楼的方法可行,但也可能误伤一些待预缓存功能的浏览器的正常流量;

    其实还可以反向扩展:
    对页面里加载的一些静态资源的访问可以记录下来,如果访问了页面又没访问静态资源的 ip,可以设计一套规则给 ban 掉(或弹验证码),也能防止一部分非模拟浏览器的爬虫
    crab
        15
    crab  
       2017-05-06 11:23:25 +08:00   ❤️ 1
    无解的。BAT 都不能防止。也只能靠限制 IP,出验证码这种方案。
    ryd994
        16
    ryd994  
       2017-05-06 11:25:29 +08:00 via Android   ❤️ 1
    不要 regex 匹配,直接检查等于
    没有浏览器会只有这一段 UA
    另外,这种不是 Nginx 强项,if is evil
    ytmsdy
        17
    ytmsdy  
       2017-05-06 13:07:43 +08:00   ❤️ 4
    设置个蜜罐页面吧,列表页面里面增加一个隐藏连接,链接的格式和正常的一样,但是在 css 中做限制不显示出来。
    如果有 ip 访问蜜罐页面,直接小黑屋伺候。
    正常用户是不会去访问蜜罐页面的,误伤率会比较低。
    lgpqdwjh
        18
    lgpqdwjh  
       2017-05-06 13:52:21 +08:00   ❤️ 1
    埋点。。 加 js 验证。。ip+url 的 hash 漏桶。。 但都只是提高爬的门槛,仅此而已
    beyoung
        19
    beyoung  
       2017-05-06 14:14:40 +08:00 via iPhone   ❤️ 1
    让他爬!
    harker
        20
    harker  
       2017-05-06 14:22:18 +08:00   ❤️ 1
    简单有效的方法就是限流了,每分钟访问超过多少次就屏蔽一段时间,或者给他个验证码输,输入对了就重置请求频次,错了就屏蔽 ip,大公司大多都这么搞的吧
    SlipStupig
        21
    SlipStupig  
       2017-05-06 15:27:13 +08:00   ❤️ 3
    @woshinide300yuan 爬虫对抗我觉得可以尽量让对方察觉的不要那么明显而达到目的

    1.做一个 Qos 去限速,不建议封 ip 而是给一堆假数据给对方,而我方可以减少内容被盗并且减少数据库压力, 这样采集的人会过一段时间发现自己采集的内容是假的,会花很长时间调试从而增加对方的痛苦值
    2.页面 cookie 跟踪,处了首页以外,每次访问其它页面都需要上报上一次的 cookie 里面的 key,否则不让访问(如果这样会导致百度这些也无法爬行,下面会将)
    3.前端页面使用 JS 渲染,对百度和 Google 这些爬虫给一个特定的页面,但是要校验 ip,如果 UA 和 ip 不符合的给予半真半假的数据(可以是 2:8 的比例, 也可以是 1:9 )
    4.JS 页面混淆压缩,使用多层嵌套,使用随机的函数名和变量
    5.对特定浏览器使用浏览器特性检测,比如用 canvas 检测浏览器指纹,还有 IP 的鼠标点击事件或滚轮事件,如果在规定时间内一次都没有,必定是爬虫

    先说这么多方法,如果这些都还能过,可以尝试招安对方 +_+
    woostundy
        22
    woostundy  
       2017-05-06 16:34:12 +08:00   ❤️ 1
    再各种防御办法,也挡不住代理池。
    可以换格式,用在前端用 js + 随机 key 解密再展示。
    abcbuzhiming
        23
    abcbuzhiming  
       2017-05-06 16:47:14 +08:00
    爬虫把自己伪装的足够像一般的浏览器的时候,所有的屏蔽方式就失效了,你难道要影响正常访问吗?
    ddd2500
        24
    ddd2500  
       2017-05-06 17:09:10 +08:00   ❤️ 3
    大部分爬虫不会用 v8, 所以 js,images, css 的不会加载。
    利用这个思路, 我写过 python 脚本是,分析服务器 apache 日志, 如果一个 IP 在一天内达到多少访问量, 这个 IP 不属于 google, msn 之类的。 那么判断他请求的 URL 资源类型, 如果 非 js, images, css 的请求量大于一半, 直接把 IP 递交给防火墙。
    aabbccli
        25
    aabbccli  
       2017-05-06 17:14:01 +08:00   ❤️ 2
    @SlipStupig
    什么前端渲染,混淆都挡不住抓包软件的黑手
    justtery
        26
    justtery  
       2017-05-06 17:41:09 +08:00 via Android   ❤️ 1
    ua 的你就放弃吧。
    woshinide300yuan
        27
    woshinide300yuan  
    OP
       2017-05-06 17:47:20 +08:00
    @O14 我去按照你的思路百度学习一下如何操作,谢谢哈!
    @abcbuzhiming 对啊,图中的 UA 一封,基本就全封了,很机智又很巧妙的设定。

    @SlipStupig 厉害了大哥哥,我只会封 IP 和 UA。因为……我是个渣渣的 FTP 操作员!
    @beyoung 好,就这么定了。
    @harker 我去学习一下怎么限流,谢谢思路。
    ytmsdy
        28
    ytmsdy  
       2017-05-06 17:55:58 +08:00   ❤️ 1
    @SlipStupig 你这一整套组合拳太狠了。。
    hsmocc
        29
    hsmocc  
       2017-05-06 18:01:09 +08:00 via iPhone   ❤️ 1
    @O14 如果一个小区用一个公网 IP,你的做法是不是会误伤他人?非常奇怪为什么那么多人喜欢封 ip 这种粗暴的方式。
    hard2reg
        30
    hard2reg  
       2017-05-06 18:19:33 +08:00   ❤️ 1
    添加暗链接,访问了直接 ban 三分钟- -或者 JS 监听鼠标,方向键。回调添加识别参数
    Hardrain
        31
    Hardrain  
       2017-05-06 18:35:25 +08:00
    如果支持正则表达式的话
    应该不会
    这么写 ^Mozilla/5\.0$
    没有加多位通配符 .* 的话 其他包含 Mozilla/5.0 的 UA 不会一并被屏蔽.
    Hardrain
        32
    Hardrain  
       2017-05-06 18:37:07 +08:00   ❤️ 1
    当然这不是长久之计,爬虫和反爬虫就如病毒和杀软……

    30# @hard2reg 说的算是很高端的了。
    IP 对方可以扫代理
    UA 的话,提供常见浏览器 UA 的网站很多,可以来回改,伪装成正常的浏览器.
    Reign
        33
    Reign  
       2017-05-06 18:46:32 +08:00   ❤️ 1
    我写爬虫从来都是把浏览器访问你网站的所有 header 复制下来,你来防我吧,防爬虫就是一个伪命题,做的足够好的反爬基本最后把用户和蜘蛛干跑了
    jarlyyn
        34
    jarlyyn  
       2017-05-06 20:21:49 +08:00   ❤️ 1
    现在不是说都是超频率返回假数据么?
    herozhang
        35
    herozhang  
       2017-05-06 20:47:41 +08:00 via iPhone   ❤️ 2
    之前见过一个网站,需要和站长线下见面,提交身份证和银行流水证明,一顿饭之后通过面试拿到登陆网站的 token 卡。一个下载站做成这样也很奇葩了
    SlipStupig
        36
    SlipStupig  
       2017-05-06 21:15:16 +08:00   ❤️ 1
    @aabbccli 链接可以动态拼接的,每次请求会产生一个 sessionID 对应一个密钥( session 是有过期时间的),这个密钥产生一个加密链接这个会去请求一个数据库真实的地址,响应的结果的正文放到 DOM 里面随机插入放入不规则的 DIV 里面,你抓包每次地址都不一样,抓包作用有限,逼着你去分析恶心的 JS,如果非要较真的话,我去非洲找 1000 个老黑手动采集,你一点办法没有
    woshinide300yuan
        37
    woshinide300yuan  
    OP
       2017-05-06 22:00:10 +08:00
    @herozhang 太神奇了 还记得 URL 吗
    jarlyyn
        38
    jarlyyn  
       2017-05-06 22:14:04 +08:00
    @SlipStupig

    网站上放一堆带木马的小电影网站广告
    SlipStupig
        39
    SlipStupig  
       2017-05-06 22:33:22 +08:00
    @jarlyyn 并没有什么用,人家根本不会下载和解析,如果非要造成困扰,是给一个死递归的函数让浏览器解析,让其爆栈
    6oML852dJf9Kn2l7
        40
    6oML852dJf9Kn2l7  
       2017-05-06 22:46:28 +08:00
    对于 怀疑对象 用验证码来验证一下,如果是人 就放到白名单里面
    popu111
        41
    popu111  
       2017-05-06 23:12:53 +08:00
    @SlipStupig "会花很长时间调试从而增加对方的痛苦值",这也太狠毒了点。。。
    632333300
        42
    632333300  
       2017-05-06 23:14:40 +08:00
    哦呵呵
    murmur
        43
    murmur  
       2017-05-06 23:15:15 +08:00
    @zhs227 真是浏览器就跳验证码啊,google 不经常怀疑你是机器人
    lk1ngaa7
        44
    lk1ngaa7  
       2017-05-06 23:53:36 +08:00
    基于 ip 频次的惩罚式封禁
    xiongbiao
        45
    xiongbiao  
       2017-05-07 00:52:15 +08:00
    吐点脏数据
    lightforce
        46
    lightforce  
       2017-05-07 01:01:36 +08:00
    如果要精确,只有靠 cf,aka 这种 cdn 的大数据,你自己判断总有失误的时候
    我是最近总有啥 b 扫 dede 的漏洞,尝试 post 注入 plus 目录下的文件。。。我也是醉了
    jarlyyn
        47
    jarlyyn  
       2017-05-07 02:11:55 +08:00
    @SlipStupig

    我说的是对付你那 1000 个老黑
    SlipStupig
        48
    SlipStupig  
       2017-05-07 06:39:16 +08:00
    @jarlyyn 那已经不是反爬虫了,你成了挂马网站了.....
    herozzm
        49
    herozzm  
       2017-05-07 08:15:11 +08:00 via Android
    爬虫会自动从各种 UA 和 ip 代理池中随机挑选一个,你的方法无效,至于密罐无法应对精准采集,会跳过蜜罐的
    zjqzxc
        50
    zjqzxc  
       2017-05-07 09:53:56 +08:00
    如果想完全屏蔽爬虫,页面内容都通过 ajax 异步加载进去
    mingl0280
        51
    mingl0280  
       2017-05-07 13:41:03 +08:00
    iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 --rttl -j DROP
    mingl0280
        52
    mingl0280  
       2017-05-07 13:42:12 +08:00
    @lightforce 我那个人搞的没啥卵用连后台都没有的网站天天被各种爬虫和攻击工具扫……你这还算好的了……
    bombless
        53
    bombless  
       2017-05-07 16:12:38 +08:00 via Android
    感觉常见手段就是出验证码了。能在 iptables 断下自然是最好的
    woshinide300yuan
        54
    woshinide300yuan  
    OP
       2017-05-07 20:40:02 +08:00
    @mingl0280 这防火墙规则是干啥滴?
    mingl0280
        55
    mingl0280  
       2017-05-07 22:38:23 +08:00
    @woshinide300yuan 80 端口新建连接限制 30 秒内 10 个连接,否则丢包。
    woshinide300yuan
        56
    woshinide300yuan  
    OP
       2017-05-07 23:26:53 +08:00
    @mingl0280 哇哦。66666
    gladuo
        57
    gladuo  
       2017-05-08 00:21:25 +08:00   ❤️ 1
    暴力点,1 个 ip 1h 就只能访问 50 次,超过了,就拉黑 IP 3h,期间页面正常渲染,重要内容转换为乱码
    8355
        58
    8355  
       2017-05-08 02:42:46 +08:00
    我自己的经验就是建议你不要限制 UA,其次只要限制 ip 短时间内的访问量即可,不要限制全天多少。因为我们之前公司项目做测试的时候 如果你的项目定向流量很大,那么很容易误伤很多正常流量,比如说有很多免费的公共 WIFI 比如公车 地铁上的 wifi ip 都是固定几个 这样的话就会造成很多自然日很多合法流量被禁止。所以只要访问量不对你服务器进行大量冲击 采集就采集吧。
    XiaoFaye
        59
    XiaoFaye  
       2017-05-08 11:26:50 +08:00
    @ddd2500 有些网站你不开 JS,内容根本就出不来。。。
    woshinide300yuan
        60
    woshinide300yuan  
    OP
       2017-05-08 12:00:20 +08:00
    @gladuo 那蜘蛛呢大哥哥?
    yatesun
        61
    yatesun  
       2017-05-17 01:36:10 +08:00 via Android
    我是这么做的
    1.按规则过滤,比如超 5000 次封一段时间,还超就封一天,跳验证码
    2.验证码的页面带 sleep,每次等够 5s 才响应
    3.在验证码页面还强刷的,有一定几率跳到各大镜像网站的 iso 包,让他去下载

    这么做下来,数量级少了,但是他还说坚持不懈,我也没办法了。
    vtwoextb
        62
    vtwoextb  
       2017-09-13 16:18:45 +08:00
    如果不停的换 ip 是没有方法防的 , 我的抓取就是用的动态 更换 ip,动态更换 IP 策略 DEMO https://github.com/hizdm/dynamic_ip
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1189 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:41 · PVG 07:41 · LAX 15:41 · JFK 18:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.