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

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

  •  1
     
  •   alwayshere · 214 天前 · 6287 次点击
    这是一个创建于 214 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 频率法(误伤蜘蛛),大家有没有更好的方法?

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

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

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

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

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

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

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

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

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

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

    比较罗嗦,希望我说明白了 :)
        57
    dearmymy   213 天前
    只要针对你的爬虫都没用
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   561 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 66ms · UTC 19:37 · PVG 03:37 · LAX 12:37 · JFK 15:37
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1