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

突然想到一种简单的反爬虫方法,大家觉得可行性如何?

  •  1
     
  •   alwayshere · 2017-03-21 08:59:53 +08:00 · 11513 次点击
    这是一个创建于 2803 天前的主题,其中的信息可能已经有所发展或是发生改变。

    完全做到反爬虫肯定是个伪命题,反爬虫只能最大限度地去遏制,而不是杀绝,这几天一直在构思怎样将我辛辛苦苦的原创内容加以保护别被爬了,但杀爬虫杀得太猛把可爱的搜索引擎蜘蛛们也赶尽杀绝了,所以想了一种简单的方法:

    1. 把 header 包含有 bot 和 spider 的 ip 后台暂时放行,加入队列,后台 daemon 进程逐一验证其 host 地址是否为搜索引擎
    2. 验证客户端的 cookie ,我使用的是 Google analytics ,没有诸如“_ga ”或者“_gat ”之类的 cookie 把它 ban 了
    3. 在页面角落处插入一个隐形的动态图片: src="checkScraper.php" width="0" height="0",没加载这个图片的 ip 也给 ban 了

    上面这个 ban 了不是指给他抛出一个 400 错误,而是逐渐延迟加载时间,让采集者不能发现, php: sleep($i),$i 表示请求次数

    大家觉得是否可行,或者我在这抛砖引玉一下,除了通常的蜜罐法(烂大街了,我采集网站都是先看对方 robots.txt 有没有蜜罐),或者限制 ip 频率法(误伤蜘蛛),大家有没有更好的方法?

    58 条回复    2020-03-10 00:14:45 +08:00
    RE
        1
    RE  
       2017-03-21 09:02:42 +08:00 via iPhone
    你说的这三点,只要是针对你网站去爬的,不都可以伪造么……
    alwayshere
        2
    alwayshere  
    OP
       2017-03-21 09:05:15 +08:00
    @RE 同时满足这三点的,估计一大部分都过滤掉了吧
    friskfly
        3
    friskfly  
       2017-03-21 09:05:39 +08:00 via Android
    现在爬虫图省事直接用真实的浏览器去爬了。还是高级验证码什么的靠谱点。
    jininij
        4
    jininij  
       2017-03-21 09:06:47 +08:00 via Android   ❤️ 1
    我都是屏蔽所以 analytics js 的。
    alwayshere
        5
    alwayshere  
    OP
       2017-03-21 09:07:20 +08:00
    @friskfly 我写爬虫很少用浏览器去爬,要不对方一下流量突然暴涨,肯定要追查 ip 的
    notgod
        6
    notgod  
       2017-03-21 09:07:40 +08:00
    我忘记了域名是什么了
    就是显示很多域名注册商 域名注册量 还有 isp 的 IP isp 的 ip 绑定了多少网站
    使用的 webserver 等等 一个统计网站

    最早的时候 我是拿来抓淘宝新绑定的网店域名 二级域名 然后干些不可描述的事

    后来抓不到
    那边加了个 Cookies 有效期验证 这个我尝试 N 多方法 爬不到数据
    无论如何 都爬不到 但是人工访问没问题

    好像的算法是这个逻辑
    A 访问页面 生成一个 cookies 这个信息是加密的 包括有效期
    A 在访问其他页面 解密 验证 cookies 算有效时 有效放行 无效 显示 spam 验证
    alwayshere
        7
    alwayshere  
    OP
       2017-03-21 09:09:44 +08:00
    @notgod 搜索引擎支持 cookie 么?不会吧可爱的小蜘蛛也给误杀了?
    nicevar
        8
    nicevar  
       2017-03-21 09:11:33 +08:00 via iPhone
    只要你的网站能正常访问,就没法屏蔽爬虫,这个事情好无聊
    notgod
        9
    notgod  
       2017-03-21 09:12:07 +08:00   ❤️ 2
    @alwayshere 封 IP 什么的都是浮云,
    我也遇到封 IP 但是使用变态方式解决了
    直接拿 AKAMAI 的 CDN 去绑源站 , 然后利用 AKAMAI 的 N 多 IP 轮番上阵
    左一遍又一遍的把别人网站轮的不要不要的.......
    notgod
        10
    notgod  
       2017-03-21 09:13:29 +08:00
    @alwayshere 新一代的爬虫都支持 cookie , 而且可以解析 js 内容了 差不多和人访问的区别不大
    不要认为还是以前 爬网页 只是提取文本和图片内容
    practicer
        11
    practicer  
       2017-03-21 09:18:51 +08:00
    这两天发现一个没碰到过的防爬例子,
    用 css display: inline-block;width: auto 穿插着自动显示文本,蜘蛛和爬虫互不影响
    网址: http://club.autohome.com.cn/bbs/thread-c-3170-60727592-1.html
    darluc
        12
    darluc  
       2017-03-21 09:22:15 +08:00
    说一下,以前公司遇到爬虫都是吐脏数据的
    alwayshere
        13
    alwayshere  
    OP
       2017-03-21 09:22:52 +08:00
    @darluc 这个有点贱,不怕对方报复么
    alwayshere
        14
    alwayshere  
    OP
       2017-03-21 09:24:49 +08:00
    @practicer 这个。。。蜘蛛没法识别了吧,全是 css 显示文本。。。
    kindjeff
        15
    kindjeff  
       2017-03-21 09:26:51 +08:00 via iPhone
    百度知道在你大量访问的时候,返回的是字的图片,就是几个字中间出现一个图片的字,用户看起来没有区别,爬虫就爬不到所有的字。
    gamecreating
        16
    gamecreating  
       2017-03-21 09:27:59 +08:00
    你还是研究下机器学习...能自住修改反爬规则
    jininij
        17
    jininij  
       2017-03-21 09:28:15 +08:00 via Android
    我是每个 session 都随机新建一个密码。然后在输出页面里用这个密码对称加密。在页面 head 里放一个外部 js ,在这个 js 是用 php 生成的,将替换的字替解密换回去。因为 head 里的 js 会阻塞显示,所以用户根本看不出文字错误。但查看源码是一堆乱码。
    为了防止复制,这些解密后的字符是通过 canvas 绘制到页面中的。再加点与用户对应的水印最好。
    有本事就去逐行调试 js 。
    RE
        18
    RE  
       2017-03-21 09:35:02 +08:00 via iPhone   ❤️ 2
    @alwayshere 你想多了,要满足这三点太简单了, V2 的 API 调用限制了每 IP 每小时 120 次,照样都把三十万帖爬下来了,关键就看要不要爬而已
    xuan_lengyue
        19
    xuan_lengyue  
       2017-03-21 09:36:06 +08:00
    发现爬虫直接返回假数据怎么破。
    tabris17
        20
    tabris17  
       2017-03-21 09:48:21 +08:00
    太简单了,根本防不住。

    要防爬虫,最彻底的就是让程序抓取到内容也无法解读,而人类却能一眼看懂。

    我想到的一个办法是字体替换,类似于“ Font Awesome ”,动态生成字体映射文件,人类看到文字是有意义的文字,而程序抓取出来却是“ asdf ”这样无意义的文本。
    clino
        21
    clino  
       2017-03-21 09:52:13 +08:00
    @tabris17 但是这样对搜索引擎是不是就不友好了?
    tabris17
        22
    tabris17  
       2017-03-21 09:53:57 +08:00
    @clino 可搜索引擎不就是一种爬虫么
    firefox12
        23
    firefox12  
       2017-03-21 09:54:06 +08:00 via iPhone
    你用 css 这么复杂,你自己更新就很容易?其次你觉得你的网站有这么值钱的信息让爬虫这么感兴趣?如果真感兴趣,你这个手段也行?
    nthhdy
        24
    nthhdy  
       2017-03-21 09:58:38 +08:00
    @practicer 这个我也遇到了
    我觉得去掉一些字和标点用处不大吧?
    只是,自然语言处理它的时候,分句分词可能都出问题.
    这个手段直接调最终的 DOM 接口就能把它还原出来.
    clino
        25
    clino  
       2017-03-21 09:59:53 +08:00
    @tabris17 所以又防爬虫又对搜索引擎友好的就是不可能的
    只有那种数据都不想被搜索到的网站可以用这种方式
    qqpkat2
        26
    qqpkat2  
       2017-03-21 10:01:22 +08:00
    我有程序可以跟浏览器一样的访问网页,你这策略,跟没有一样
    mudone
        27
    mudone  
       2017-03-21 10:02:37 +08:00
    用 headless browser 采集 这些方法都不太管用。
    phrack
        28
    phrack  
       2017-03-21 10:37:03 +08:00 via Android
    攻防就是一个成本与收益的问题。

    这些做法会增加爬虫成本,就看爬你网站的收益够不够覆盖成本了~

    但是你这是一个个人站,原创内容,那肯定内容不多,就得看你这内容是不是真有料了。
    uqf0663
        29
    uqf0663  
       2017-03-21 11:03:29 +08:00
    那个...你知道 火车头浏览器 吗?
    linescape
        30
    linescape  
       2017-03-21 11:13:48 +08:00
    其实只要用户能看到的东西,就能采集起来,大不了你做成图片我来 OCR 识别嘛,至于什么封 IP ,验证 cookie 什么的,那就用真实浏览器+代理+脚本咯
    zuotech
        31
    zuotech  
       2017-03-21 11:36:04 +08:00
    可以的, 把所有内容弄成动态加载...
    dongoo
        32
    dongoo  
       2017-03-21 12:02:10 +08:00 via Android
    google analytics ,会被 adb 拦截
    alwayshere
        33
    alwayshere  
    OP
       2017-03-21 12:05:32 +08:00
    @dongoo 额。。。我的广告同样也被拦截了,我凭啥还让这个人访问我的网页??
    byfar
        34
    byfar  
       2017-03-21 12:46:56 +08:00
    朋友,留下你的原创内容地址 /奸笑
    dsg001
        35
    dsg001  
       2017-03-21 12:48:07 +08:00
    @tabris17 猫眼的一些数据就是这种显示 https://jizhi.im/blog/post/maoyan-anti-crawler
    byfar
        36
    byfar  
       2017-03-21 13:02:32 +08:00
    @dsg001 图像识别什么的是很好玩啊,不过我还是觉得用他说的第一种方法比较快
    jiangzhuo
        37
    jiangzhuo  
       2017-03-21 13:13:01 +08:00
    @gamecreating 但是现在爬虫也用机器学习(主要是内容识别提取方面),将来机器学习人类浏览网站的习惯,模拟人类。最后演变成 AI 大战了。[doge]
    practicer
        38
    practicer  
       2017-03-21 13:37:33 +08:00
    @nthhdy 请教一下怎么还原?我采集就是用来分词的。谢谢哈。
    JoyNeop
        39
    JoyNeop  
       2017-03-21 13:47:51 +08:00 via iPhone
    直接去搜索引擎拿快照,手动斜眼
    stormpeach
        40
    stormpeach  
       2017-03-21 15:43:08 +08:00
    又要支持搜索引擎,又要反爬虫,不是自相矛盾吗
    fiht
        41
    fiht  
       2017-03-21 16:35:44 +08:00
    爬虫反不了的。
    我觉得 @jiangzhuo 说得对,爬虫搞到后面就是 AI 的斗争。
    现在爬虫界最难搞的算是 Google 的那种点击的验证码和滑动验证码。
    以极验为例,就很难搞。后台机器学习出模型,前台的滑动数据给后台验证。验证不过就不让访问( AI 反爬虫)
    作为爬虫方要做的就是怎么让机器滑出来的轨迹能被对方接受,也需要用到数据搞机器学习( AI 爬虫)
    we3613040
        42
    we3613040  
       2017-03-21 16:50:01 +08:00
    @fiht 极验证也可以破解。我之前公司就用那个 就被破解了
    zaishanfeng
        43
    zaishanfeng  
       2017-03-21 16:53:05 +08:00 via Android
    没访问 10 个页面弹一个 recaptra
    zaishanfeng
        44
    zaishanfeng  
       2017-03-21 16:56:14 +08:00 via Android
    分析 nginx 日志 对于 pv 过多的 isp ,属于机房的相似 ip 将其加入黑名单,首次访问即弹 recaptra
    Technetiumer
        45
    Technetiumer  
       2017-03-21 18:56:07 +08:00
    对搜索引擎的 IP 段都显示正常纯文本内容,其他 IP 包括用户用楼上的各种牛逼反爬方式,但是需要收集搜索引擎 IP
    cdwyd
        46
    cdwyd  
       2017-03-21 19:10:46 +08:00 via Android
    @practicer
    这么巧,刚好有人让采集这个。前后用了好几个小时才找到了通用的方法。
    cdwyd
        47
    cdwyd  
       2017-03-21 19:19:14 +08:00 via Android
    @jininij
    其实,真的是一行一行调试的,我就干过。和你的思路差不多,变量名随机,函数名随机,逻辑结构都是随机的。
    kaneg
        48
    kaneg  
       2017-03-21 19:38:33 +08:00 via iPhone
    道高一尺,魔高一丈。除非你一直更新策略,否则没有一劳永逸的对策。最近很火的人工智能自我学习倒是个有可能持续起作用
    neurocomputing
        49
    neurocomputing  
       2017-03-21 22:42:11 +08:00
    这思路并不新 而且也不难实施 但是没有什么实际的用
    只要人家想抓 怎么都能抓

    内容防盗更多的是需要技术之外的东西
    victor
        51
    victor  
       2017-03-21 23:05:48 +08:00
    不如每次看你的网站,都要发手机验证码好不好
    falcon05
        52
    falcon05  
       2017-03-21 23:23:40 +08:00 via iPhone
    @notgod 很好奇 cdn 这个,具体是怎么做?
    mingyun
        53
    mingyun  
       2017-03-21 23:42:32 +08:00
    @dsg001 猫眼这个厉害了
    nazhenhuiyi294
        54
    nazhenhuiyi294  
       2017-03-22 09:03:25 +08:00
    @friskfly 请教一下,怎么用浏览器爬的
    practicer
        55
    practicer  
       2017-03-22 11:42:51 +08:00
    @crab 谢谢啊
    nthhdy
        56
    nthhdy  
       2017-03-22 11:49:42 +08:00
    @practicer
    每个标点或者常用字都是一个 span 标签,用她的 class 来表示是逗号还是句号等.
    但 class 名称对应哪个汉字,这个每次都在变.
    每一楼有一段 javascript,uglify 后的.class 名称到汉字的对应关系,就在这里.执行 js 代码的过程中,js 调用了 DOM 接口,把相应的 css rule 插入到该 class 的节点中(设置了 content 属性),汉字就显示出来了.

    根据上面的原理,我们不必管它 js 里面做了什么,只要看懂它最终调了哪个接口(我记得好像是 style node 的 insertRule 函数),用自己的函数将它替换,就能得到 class 到真实汉字的对应关系.
    大体的思路就是这样.

    比较罗嗦,希望我说明白了 :)
    dearmymy
        57
    dearmymy  
       2017-03-22 12:42:43 +08:00
    只要针对你的爬虫都没用
    pyengwoei
        58
    pyengwoei  
       2020-03-10 00:14:45 +08:00
    @darluc 有联系方式吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1578 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:01 · PVG 01:01 · LAX 09:01 · JFK 12:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.