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

写爬虫的时候你遇到过哪些厉害的反爬手段?

  •  1
     
  •   jko123 · Oct 9, 2017 · 22761 views
    This topic created in 3323 days ago, the information mentioned may be changed or developed.

    这里举个例子,某磁力离线云,对数据标题进行加密。

    前端展示是这样的: 1.png 源码是这样的: 2.png 就是一堆数字

    52297·61356·11868·62314·51679·41594·12321·21896·91661·62294·01438·51845·12308·51567·21864·7468·12335·61597·31691·22328·61750·61738·82280·11847·91732·82298·01739·71515·8460·1650·0461·7843·4976·51209·51055·8466·0684·51144·71059·61183·71014·91142·2468·0500·6489·2494·0550·7465·9728·5683·4556·8503·6489·1800·4461·0881·1505·7543·7528·0462·7654·8659·6676·1469·4677·9727·0830·9453·7561·9565·8509·0701·8882·3469·41090·11072·01184

    解密方式是这样的: 3.png 4.png

    $("[decode=true]").each(function () { var obj = $(this); var text = obj.text(); text = text.split("·"); var str = ''; for (var i = 0, len = text.length; i < len; ++i) { text[i] = text[i].substr(1); text[i] = text[i].substring(0, text[i].length - 1); str += String.fromCharCode(text[i]) } obj.text(utf8to16(str)); obj.removeAttr("decode"); });
    
     function utf8to16(str) {
                var out, i, len, c;
                var char2, char3;
    
                out = "";
                len = str.length;
                i = 0;
                while (i < len) {
                    c = str.charCodeAt(i++);
                    switch (c >> 4) {
                        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                            // 0xxxxxxx
                            out += str.charAt(i - 1);
                            break;
                        case 12: case 13:
                            // 110x xxxx   10xx xxxx
                            char2 = str.charCodeAt(i++);
                            out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                            break;
                        case 14:
                            // 1110 xxxx  10xx xxxx  10xx xxxx
                            char2 = str.charCodeAt(i++);
                            char3 = str.charCodeAt(i++);
                            out += String.fromCharCode(((c & 0x0F) << 12) |
                                           ((char2 & 0x3F) << 6) |
                                           ((char3 & 0x3F) << 0));
                            break;
                    }
                }
                return out;
            }
    
    
    

    原本想要用 python 重写这个解密过程,但是发现挺麻烦的,基于“反正都是在网页上展示内容”,干脆将他的解密 js 搬过来照用。。

    Supplement 1  ·  Oct 9, 2017

    亲测,浏览器可以运行,python用execjs调用返回空值,不然我直接解析结果了。

    浏览器运行

    llq_test.png

    python使用execjs

    py_test.png

    或许脚本有错。发出来大家指正一下

    https://gist.github.com/anonymous/420c233004e1dbfbd98fe543a2d3ad15

    Supplement 2  ·  Oct 9, 2017

    原来如此简单:

    def tochar(text):
        text= text.split("·")
        str_=''
        for idx,num in enumerate(text):
            num=num[1:-1]
            str_+=chr(int(num))
        return str_
    
    Supplement 3  ·  Oct 9, 2017
    这个所谓的解密就是,将以·分隔的每串数字,去头去尾,取中间的数字,然后用 chr()函数将数字转为字符,最后把字符拼接起来。。。
    75 replies  •  2017-10-29 14:21:29 +08:00
    jas0ndyq
    jas0ndyq
    Oct 9, 2017
    1
    也做过和 lz 一样的事情
    bearsiji
    bearsiji
    Oct 9, 2017
    2
    类似这种的 多重混淆 一层套一层 酸爽
    PythoneerDev6
    PythoneerDev6
    Oct 9, 2017
    3
    之前爬过 汤不热。 源代码放在 github 上,star 达到 2k 之后。 汤不热就开始做反扒。

    给 next 的标签加了一个空格。 也是雷到我了。

    https://github.com/xiyouMc/WebHubBot
    jijiwaiwai
    jijiwaiwai
    Oct 9, 2017
    4
    你这个办法很笨的。。。
    直接使用 pyv8,调用 js 函数获取返回值就行了
    jko123
    jko123
    OP
    Oct 9, 2017
    5
    @jijiwaiwai #4 试过了,会出错
    mansur
    mansur
    Oct 9, 2017
    6
    最厉害的是投毒,缠假内容
    af463419014
    af463419014
    Oct 9, 2017
    7
    后台检测到肯定是爬虫的时候,不禁止访问,装作正常的页面,返回错误的数据
    crab
    crab
    Oct 9, 2017❤️5
    8
    这种算好了,直接拿它 js 解密。
    最厉害的应该是发现你是爬虫,不拒绝你,继续让你爬,但给脏数据。
    xujialiang
    xujialiang
    Oct 9, 2017
    9
    哈哈哈 我会用 node 写一个接口,然后调接口
    clino
    clino
    Oct 9, 2017
    10
    以前不是有看过变成竖排文的办法,不知道效果如何
    nikoo
    nikoo
    Oct 9, 2017
    11
    怎么把汉字转为楼主贴的这种数字?
    kbdancer
    kbdancer
    Oct 9, 2017 via Android
    12
    phantomJS 直接解析执行 js 或者自定义执行 js 脚本
    x8
    x8
    Oct 9, 2017
    13
    根本不知道怎么触发的反爬机制,返回一些错误数据混在正确数据里
    Luckyray
    Luckyray
    Oct 9, 2017
    14
    这种乱七八糟的就直接用 chrome driver 了...重写一遍还不够麻烦的
    murmur
    murmur
    Oct 9, 2017❤️1
    15
    能被你发现的都是小 case

    真正发现不了的都是用投毒的
    ytmsdy
    ytmsdy
    Oct 9, 2017
    16
    最惨的就是掉进蜜罐里面,爬虫一切正常,但是返回的数据都是假数据。
    最可怕的就是掉进去了,你还不知道!!还在那里很开心的爬,等爬完了,看到结果就 SB 了。
    luoshuangfw
    luoshuangfw
    Oct 9, 2017 via Android
    17
    楼主你看这函数名不是很明确吗,这就是把变长编码的 utf8 转换成定长编码的 utf16 的非常标准的做法啊,我觉得压根不是在加解密
    Xrong
    Xrong
    Oct 9, 2017
    18
    有见过免费代理 IP 池网站,IP 最后一段是用 CSS 展示出来的。。。
    zbl430
    zbl430
    Oct 9, 2017
    19
    http://wsjs.saic.gov.cn/

    这个网站,挺恶心的
    anoymoux
    anoymoux
    Oct 9, 2017
    20
    <ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>X</li>
    ...
    ...
    </ul>

    你需要的数据是 X,但是他会生成很多的垃圾数据 A,B,C 等等..X 出现的位置是随机的,而且 A,B,C 等垃圾数据的格式跟 X 相同,无法用正则区分.
    然后每个 li 都有一个随机的 class 属性,用动态生成的 css 样式控制只显示 X,其他的隐藏掉....
    另外 css 用了继承,嵌套还有复杂的计算等等
    annielong
    annielong
    Oct 9, 2017
    21
    汤不热还是使用 api 抓取比较好,
    vtwoextb
    vtwoextb
    Oct 9, 2017
    22
    京东防爬, 我用的是 动态 ip 策略 https://github.com/hizdm/dynamic_ip
    xxdd
    xxdd
    Oct 9, 2017
    23
    @zbl430 不是国家上了反爬 好多商标平台都要倒闭了
    CareiOS
    CareiOS
    Oct 9, 2017
    24
    @PythoneerDev6 你源码,现在还工作吗?
    jko123
    jko123
    OP
    Oct 9, 2017
    25
    catfish
    catfish
    Oct 9, 2017
    26
    给假数据
    zbl430
    zbl430
    Oct 9, 2017
    27
    @xxdd 又不是什么值钱的内容吧,何必呢
    macleek
    macleek
    Oct 9, 2017
    28
    @xxdd 为啥上了反爬才不会倒闭啊?
    PythonAnswer
    PythonAnswer
    Oct 9, 2017 via Android
    29
    蜜罐,文字嵌图
    abcbuzhiming
    abcbuzhiming
    Oct 9, 2017
    30
    其实我觉得再牛逼的反爬都对付不了真浏览器,所以我觉得无头浏览器才是未来主流技术
    jadec0der
    jadec0der
    Oct 9, 2017 via Android
    31
    携程还是去哪儿,价格数字用一种随机字体,比如 7 在这个字体里可能是 4
    yu099
    yu099
    Oct 9, 2017 via Android
    32
    @abcbuzhiming 我看到有加挖矿 JS 的做反爬,如果像淘宝一样屏蔽跟踪 JS 就触反爬怎么办?
    NsLib
    NsLib
    Oct 9, 2017
    33
    前去哪儿员工,你可以试试爬爬看,假数据、前端混淆、字体混淆,23333 ……
    airbasic
    airbasic
    Oct 9, 2017
    34
    猫眼的票房=。= 得用图像识别
    j3n5en
    j3n5en
    Oct 9, 2017 via Android
    35
    啧,这不是黑科云么,。。。,我前两天刚写完。。。。
    jko123
    jko123
    OP
    Oct 9, 2017 via Android
    36
    @j3n5en 你说的没错,就是某科云
    abcbuzhiming
    abcbuzhiming
    Oct 9, 2017
    37
    @yu099 它一定要探测你也是没办法的,所以爬虫这玩意就是比拼服务器,你服务器众多,伪装的像正常浏览器,它就没招了是不是
    j3n5en
    j3n5en
    Oct 9, 2017
    38
    @chen2016 #36 我是用 nodejs 写的,,,所以复制过去就可以了,,,,嘻嘻嘻
    jko123
    jko123
    OP
    Oct 9, 2017 via Android
    39
    @j3n5en 我用 python 重写了这部分,几行搞定了
    scriptB0y
    scriptB0y
    Oct 9, 2017
    40
    碰到过一个页码记录在 session 中的,也就是你每次发一样的 curl,结果是不一样的…… session 是通过一个 cookie 判断的……不知道算不算反爬

    另外记录了一些遇到过的垃圾网站:

    https://www.kawabangga.com/posts/2017

    https://www.kawabangga.com/posts/2240
    PythoneerDev6
    PythoneerDev6
    Oct 9, 2017
    41
    @CareiOS 许久未试
    jijiwaiwai
    jijiwaiwai
    Oct 9, 2017
    42
    @chen2016 你的代码问题
    jko123
    jko123
    OP
    Oct 9, 2017 via Android
    43
    @jijiwaiwai 已经不用 execjs 了,看最后
    fuxkcsdn
    fuxkcsdn
    Oct 9, 2017 via iPhone
    44
    @jadec0der 肯定是去哪儿,携程的技术实力在去哪儿面前…
    爬过最难的是去哪儿,不用 headless 浏览器简直难爬,曾尝试跟踪解密 js,跟踪了半天被叫去做其他事,之后再没心情弄了…
    swirling
    swirling
    Oct 9, 2017
    45
    我最近很烦 silverlight 数据传输通过 WCF 传输 contenttype 是 msbin 1
    大概是我没见过世间险恶吧
    opengps
    opengps
    Oct 9, 2017 via Android
    47
    我说个吧,很多人好奇为啥方式不能偷我接口,原因是,没有 reffer 的都被我关闭了输出,就这样很多人第一步没走通就不走了
    doubleflower
    doubleflower
    Oct 10, 2017
    48
    @anoymoux 搞这么费劲其实真要破也容易,用个 headless 浏览器,用 js 判断这个 li 的样式是否被隐藏了。
    shiny
    shiny
    Oct 10, 2017
    49
    @opengps 确实可以挡掉大部分小白用户,但如果是专业选手,第一件事情应该是完全模拟浏览器发出的请求。
    Lguo
    Lguo
    Oct 10, 2017 via Android
    50
    请教一下各位兄弟们这个代理网站列出来的端口要怎么抓 http://www.goubanjia.com/
    RqPS6rhmP3Nyn3Tm
    RqPS6rhmP3Nyn3Tm
    Oct 10, 2017
    51
    我遇到最恶心的是哔哩哔哩,appkey 混淆得没法看
    最后乖乖 youtube-dl
    gfcddz
    gfcddz
    Oct 10, 2017 via Android
    52
    国外的一个全站 http/2.0 协议,python 支持 http2.0 的库压根用不了,只能用 seleniim 了
    kran
    kran
    Oct 10, 2017❤️1
    53
    投毒假数据啊,最坑的一次,见过一本写神经病的小说,看了两章胡言乱语才发现是网站爬虫被投假数据。文笔不错,没得逻辑。
    Marsss
    Marsss
    Oct 10, 2017
    54
    遇到最恶心的是 js 检测是否有鼠标操作且正常,并将其一并参与请求。
    opengps
    opengps
    Oct 10, 2017
    55
    @shiny 的确,不过起码这个成为我目前最基本的条件,很多人是因为顺便看了一眼可以利用,才做了进一步的决定
    grey0207
    grey0207
    Oct 10, 2017❤️1
    56
    这个网站的源图片都打乱的,又禁止右键,感觉要抓图只能靠截图了
    http://viewer.comic-earthstar.jp/viewer.html?cid=1e48c4420b7073bc11916c6c1de226bb&cty=1&lin=0
    qqpkat2
    qqpkat2
    Oct 10, 2017
    57
    这种反扒太简单了,程序内嵌浏览器直接破了
    遇到最厉害的还是百度的,提交的时候记录了鼠标动作.....不过还是能破解
    wfd0807
    wfd0807
    Oct 10, 2017
    58
    这个还算简单,毕竟可以分析出来,解密过程不依赖浏览器;
    看看汽车之家的反爬虫技术,用伪元素的 text 渲染文字。。。
    ZiLong
    ZiLong
    Oct 10, 2017
    59
    @qqpkat2 这种怎么玩?记录的鼠标动作重放应该还有效吧?
    BlackGrasshopper
    BlackGrasshopper
    Oct 10, 2017
    60
    @grey0207 这个网址厉害了
    huangfs
    huangfs
    Oct 10, 2017
    61
    最恶心的应该是不限制你 但是给假数据吧 这种真的防不胜防。
    sucaihuo
    sucaihuo
    Oct 10, 2017
    62
    从来没研究过这方面,要学的东西还真多啊
    wmhx
    wmhx
    Oct 10, 2017
    63
    之前搞刷单用 paypal 支付, 先是写代码全程模拟结果发现 paypal 的 js 请求参数和名称全是动态生成,没找到规律,就换了 seleniim, 结果检测是否是 robot,用的是一家以色列公司的技术,花了近 2 周时间没搞定, 后来一查,这家牛逼的公司首页就说,如果用了他的技术被 robot 操作了. 全额赔付.
    xxdd
    xxdd
    Oct 10, 2017
    64
    @wmhx 感觉以色列 it 很强啊
    qqpkat2
    qqpkat2
    Oct 10, 2017
    65
    @ZiLong 鼠标移动轨迹你记录给我看看?
    Felldeadbird
    Felldeadbird
    Oct 10, 2017
    66
    目前遇到过最搞笑的:
    客服:某个网站的价格爬取失效了。快去看看

    我认真观看后,发现他们价格要登录才可以看到价格。
    终于弄好了。准备上线。

    客服:那个网站价格爬取正常了。
    我再去看了一下……原来是他们网站出问题了= =。导致非会员价格不显示。
    yxy2829
    yxy2829
    Oct 10, 2017
    67
    各种验证码算吗?一堆汉字里面选四字成语,按顺序点击
    SlipStupig
    SlipStupig
    Oct 10, 2017
    68
    数据真假掺着来....
    ZiLong
    ZiLong
    Oct 10, 2017
    69
    @qqpkat2 不懂,还请赐教
    qqpkat2
    qqpkat2
    Oct 10, 2017
    70
    @ZiLong 不指教不指教
    wineast
    wineast
    Oct 10, 2017❤️1
    71
    @Lguo 解析下 xml,class 里面含有 port 不就行了?
    ZiLong
    ZiLong
    Oct 10, 2017
    72
    @qqpkat2 haha,3ks for u's tan cheng
    qqpkat2
    qqpkat2
    Oct 11, 2017
    73
    @ZiLong 程序内嵌浏览器调用鼠标移动 API 即可
    Lguo
    Lguo
    Oct 11, 2017 via Android
    74
    @wineast 感谢回复,那个是假的
    mingyun
    mingyun
    Oct 29, 2017
    75
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1140 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 146ms · UTC 17:58 · PVG 01:58 · LAX 09:58 · JFK 12:58
    ♥ Do have faith in what you're doing.