写爬虫的时候你遇到过哪些厉害的反爬手段? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jko123
V2EX    程序员

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

  •  1
     
  •   jko123 2017-10-09 15:07:35 +08:00 21474 次点击
    这是一个创建于 2925 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    522976135611868623145167941594123212189691661622940143851845123085156721864746812335615973169122328617506173882280118479173282298017397151584601650046178434976512095105584660684511447105961183710149114224680500648924940550746597285683455685036489180044610881150575437528046276548659667614694677972708309453756195658509070188823469410901107201184

    解密方式是这样的: 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 搬过来照用。。

    第 1 条附言    2017-10-09 16:27:06 +08:00

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

    浏览器运行

    llq_test.png

    python使用execjs

    py_test.png

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

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

    第 2 条附言    2017-10-09 17:32:33 +08:00

    原来如此简单:

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

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

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

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

    这个网站,挺恶心的
    anoymoux
        20
    anoymoux  
       2017-10-09 16:56:09 +08:00
    <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
        21
    annielong  
       2017-10-09 16:57:32 +08:00
    汤不热还是使用 api 抓取比较好,
    vtwoextb
        22
    vtwoextb  
       2017-10-09 17:02:33 +08:00
    京东防爬, 我用的是 动态 ip 策略 https://github.com/hizdm/dynamic_ip
    xxdd
        23
    xxdd  
       2017-10-09 17:19:29 +08:00
    @zbl430 不是国家上了反爬 好多商标平台都要倒闭了
    CareiOS
        24
    CareiOS  
       2017-10-09 17:19:37 +08:00
    @PythoneerDev6 你源码,现在还工作吗?
    jko123
        25
    jko123  
    OP
       2017-10-09 17:25:01 +08:00
    catfish
        26
    catfish  
       2017-10-09 17:30:57 +08:00
    给假数据
    zbl430
        27
    zbl430  
       2017-10-09 17:39:07 +08:00
    @xxdd 又不是什么值钱的内容吧,何必呢
    macleek
        28
    macleek  
       2017-10-09 17:45:31 +08:00
    @xxdd 为啥上了反爬才不会倒闭啊?
    PythonAnswer
        29
    PythonAnswer  
       2017-10-09 17:54:11 +08:00 via Android
    蜜罐,文字嵌图
    abcbuzhiming
        30
    abcbuzhiming  
       2017-10-09 18:24:40 +08:00
    其实我觉得再牛逼的反爬都对付不了真浏览器,所以我觉得无头浏览器才是未来主流技术
    jadec0der
        31
    jadec0der  
       2017-10-09 18:27:51 +08:00 via Android
    携程还是去哪儿,价格数字用一种随机字体,比如 7 在这个字体里可能是 4
    yu099
        32
    yu099  
       2017-10-09 18:49:16 +08:00 via Android
    @abcbuzhiming 我看到有加挖矿 JS 的做反爬,如果像淘宝一样屏蔽跟踪 JS 就触反爬怎么办?
    NsLib
        33
    NsLib  
       2017-10-09 19:26:09 +08:00
    前去哪儿员工,你可以试试爬爬看,假数据、前端混淆、字体混淆,23333 ……
    airbasic
        34
    airbasic  
       2017-10-09 19:39:59 +08:00
    猫眼的票房=。= 得用图像识别
    j3n5en
        35
    j3n5en  
       2017-10-09 19:43:01 +08:00 via Android
    啧,这不是黑科云么,。。。,我前两天刚写完。。。。
    jko123
        36
    jko123  
    OP
       2017-10-09 20:03:04 +08:00 via Android
    @j3n5en 你说的没错,就是某科云
    abcbuzhiming
        37
    abcbuzhiming  
       2017-10-09 20:04:43 +08:00
    @yu099 它一定要探测你也是没办法的,所以爬虫这玩意就是比拼服务器,你服务器众多,伪装的像正常浏览器,它就没招了是不是
    j3n5en
        38
    j3n5en  
       2017-10-09 20:06:00 +08:00
    @chen2016 #36 我是用 nodejs 写的,,,所以复制过去就可以了,,,,嘻嘻嘻
    jko123
        39
    jko123  
    OP
       2017-10-09 20:10:59 +08:00 via Android
    @j3n5en 我用 python 重写了这部分,几行搞定了
    scriptB0y
        40
    scriptB0y  
       2017-10-09 20:15:50 +08:00
    碰到过一个页码记录在 session 中的,也就是你每次发一样的 curl,结果是不一样的…… session 是通过一个 cookie 判断的……不知道算不算反爬

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

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

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

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

    客服:那个网站价格爬取正常了。
    我再去看了一下……原来是他们网站出问题了= =。导致非会员价格不显示。
    yxy2829
        67
    yxy2829  
       2017-10-10 14:07:03 +08:00
    各种验证码算吗?一堆汉字里面选四字成语,按顺序点击
    SlipStupig
        68
    SlipStupig  
       2017-10-10 14:15:09 +08:00
    数据真假掺着来....
    ZiLong
        69
    ZiLong  
       2017-10-10 14:26:35 +08:00
    @qqpkat2 不懂,还请赐教
    qqpkat2
        70
    qqpkat2  
       2017-10-10 15:33:06 +08:00
    @ZiLong 不指教不指教
    wineast
        71
    wineast  
       2017-10-10 20:25:55 +08:00   1
    @Lguo 解析下 xml,class 里面含有 port 不就行了?
    ZiLong
        72
    ZiLong  
       2017-10-10 23:53:38 +08:00
    @qqpkat2 haha,3ks for u's tan cheng
    qqpkat2
        73
    qqpkat2  
       2017-10-11 02:26:30 +08:00
    @ZiLong 程序内嵌浏览器调用鼠标移动 API 即可
    Lguo
        74
    Lguo  
       2017-10-11 07:54:22 +08:00 via Android
    @wineast 感谢回复,那个是假的
    mingyun
        75
    mingyun  
       2017-10-29 14:21:29 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5433 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 01:22 PVG 09:22 LAX 18:22 JFK 21:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86