最近在写爬虫,发现一个干死 99.9999%爬虫的办法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
doubleflower
V2EX    奇思妙想

最近在写爬虫,发现一个干死 99.9999%爬虫的办法

  •  
  •   doubleflower 2016-09-15 16:17:00 +08:00 16252 次点击
    这是一个创建于 3312 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果,在网站的页面里随机插入坏链接,或在检测到是爬虫时,返回无限大响应的请求,比如发送无限大的永不结束的 http header ,或用 chunked 编码返回无限的大压缩率数据来直接撑暴对方服务器内存。

    据我所知,现在的 http 库都没有处理这种情况,比如 python 的 urllib3/requests/pyCURL 等。

    下面随手写的一个小程序来模拟一个无限大响应,我的爬虫处理不了这种情况啊!如果有人想这样干我我一点办法都没有的!(这里还没用压缩数据,一用的话内存马上就暴了)

    有谁知道有处理这类情况的库?

    爬虫代码:

    import requests r=requests.get('http://localhost:8888', timeout=20) 

    程序:

    #!/usr/bin/env python2 import socket from time import sleep host = '' port = 8888 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) s.listen(1) conn, addr = s.accept() print 'Connected by', addr data = conn.recv(4096) print data headers = [ 'HTTP/1.1 200 OK', 'Server: FuckingServer', 'Content-Type: text/plain', 'Transfer-Encoding: chunked', ] conn.send('\r\n'.join(headers)) conn.send('\r\n\r\n') data = '5\r\nFuck!\r\n2\r\n\r\n\r\n'*10000 end = '0\r\n\r\n' while True: conn.send(data) sleep(1) print '.' conn.close() 
    40 条回复    2017-12-22 11:06:54 +08:00
    windfarer
        1
    windfarer  
       2016-09-15 16:18:39 +08:00
    多来这么几个爬虫,你自己服务器就先爆了
    doubleflower
        2
    doubleflower  
    OP
       2016-09-15 16:24:49 +08:00
    @windfarer 为什么?压缩数据啊,一点点流量就爆了对方内存。
    mdzz
        3
    mdzz  
       2016-09-15 16:36:33 +08:00
    choury
        4
    choury  
       2016-09-15 16:38:49 +08:00 via Android   1
    为什么你写的爬虫会被识别出来,要是能识别出来我直接给你返回 403 不是更好?
    jackon
        5
    jackon  
       2016-09-15 16:39:01 +08:00 via iPhone
    只是你自己的爬虫太弱而已
    doubleflower
        7
    doubleflower  
    OP
       2016-09-15 16:45:59 +08:00
    @choury 那样对方完全没有受到伤害啊,比如各种新闻客户端爬盗版文章的,你发现它频率太高不象真人就给它 403 它转头去爬别人家回来再爬你,而一爬直接爆了的话对方就很难受了
    greatghoul
        8
    greatghoul  
       2016-09-15 16:48:26 +08:00   3
    > 在网站的页面里随机插入坏链接

    牺牲用户体验

    > 或在检测到是爬虫时,返回无限大响应的请求

    一般写爬虫超时,或者超量,就有机制自动 kill 掉了

    最寂寞的就是写了一堆反爬虫的策略,发现都没有生效过,没人来爬。。。
    doubleflower
        9
    doubleflower  
    OP
       2016-09-15 16:51:12 +08:00
    @greatghoul 不可见链接,有什么问题? 说说容易,请问你用什么机制自动 kill?
    imn1
        10
    imn1  
       2016-09-15 17:15:48 +08:00
    我收 chunk 超过一定字节就 close ,并记录,因为超出我的预期的字节数上限,我认为肯定某个环节出问题,根本还不到 unzip 这个步骤
    maomaomao001
        11
    maomaomao001  
       2016-09-15 17:15:54 +08:00 via Android
    怎么检测是爬虫还是正常用户?
    DesignerSkyline
        12
    DesignerSkyline  
       2016-09-15 17:22:19 +08:00 via iPad
    @greatghoul 犀利
    greatghoul
        13
    greatghoul  
       2016-09-15 17:29:52 +08:00   1
    kill 掉爬虫非常简单呀

    https://gist.github.com/greatghoul/7352ba71134cf9079eb5e049c235cd64

    楼主你写的爬虫太烂了。。

    另外你的链接不可见,总要写在源码里面吧,人家分析你网站的时候要是觉察不出来那还写的什么爬虫,就算你随机返回,人家爬虫多测试几次就知道了,针对你的伎俩,分分钟就有应对策略了。

    还什么超大响应,你不知道有 chunk 和 stream 这种东西吗?你以为那些抓取电影资源的爬虫都是把整部电影读进内存里面吗?
    doubleflower
        14
    doubleflower  
    OP
       2016-09-15 17:38:51 +08:00
    @maomaomao001 在文章列表里随机插一个被 css 隐藏起来的文章连接,用 css :nth-child 之类的技术设置不可见,普通用户不可能点的,爬虫不会分析 css 会爬去这个文章。
    greatghoul
        15
    greatghoul  
       2016-09-15 17:45:30 +08:00 via iPhone
    @doubleflower 你这规则也太简单了
    doubleflower
        16
    doubleflower  
    OP
       2016-09-15 17:46:31 +08:00
    @greatghoul


    那处理无限 header 呢?这总不能 stream 了吧。
    ```
    conn.send('\r\n'.join(headers))
    conn.send('\r\n')

    data = 'aaa: ' + 'bbb' * 1000 + '\r\n'
    while True:
    conn.send(data)
    sleep(1)
    print '.'
    conn.close()
    ```
    greatghoul
        17
    greatghoul  
       2016-09-15 17:56:07 +08:00
    @doubleflower 那处理无限 header 呢?这总不能 stream 了吧。

    都不用处理

    httplib.IncompleteRead: IncompleteRead(0 bytes read)

    curl 都会很快中断,还别说专门写爬虫了。
    laoyur
        18
    laoyur  
       2016-09-15 17:57:46 +08:00   1
    然后误伤一大片吃瓜群众,领导直接让你背锅
    greatghoul
        19
    greatghoul  
       2016-09-15 18:03:26 +08:00
    现在很多网站都是 js 动态渲染的,传统的发 request 的爬虫根本占不到 90.99999%,现在好多爬虫都是直接跑的 phantomjs ,还有跑在 Chrome Extension 上面的,那些弱鸡的规则压根不顶用,甚至还有直接截屏 ocr 的。。。

    楼主你还停留在上个时代。
    goodman001
        20
    goodman001  
       2016-09-15 18:09:22 +08:00 via iPhone
    @greatghoul 精辟
    imcocc
        21
    imcocc  
       2016-09-15 18:11:48 +08:00 via iPhone   1
    楼主不知道七伤拳 伤人先伤己吗
    Troevil
        22
    Troevil  
       2016-09-15 18:23:26 +08:00
    爬虫会控制深度吧 不可能无限循环下去的吧
    thinks
        23
    thinks  
       2016-09-15 21:04:30 +08:00 via Android
    @greatghoul 确实很寂寞,和我写防火墙策略一样了,结果一年过去了连条深层一点的端口扫描纪录都没有…
    wangxiaoer
        24
    wangxiaoer  
       2016-09-15 21:24:20 +08:00   1
    笑死了,你这个杀敌一万,自损八千啊,你服务端维持那么多长连接你扛得住?再说了,定向爬取都特么要到源码分析抓取地址的啊?你这种小伎俩分分钟过滤掉啊
    est
        25
    est  
       2016-09-15 21:47:05 +08:00   1
    都没我的策略淫荡。。。判断是爬虫就随机插入脏数据。。。。。

    比如电商。。就随机返回价格。。。让你们爬。 管够。
    scnace
        26
    scnace  
       2016-09-15 23:09:39 +08:00 via Android
    @greatghoul 截屏 ocr 有 demo 吗?好像看看
        27
    jyf007  
       2016-09-16 12:14:50 +08:00 via Android
    @est 高到哪里去都不知道了
    veelog
        28
    veelog  
       2016-09-16 15:51:41 +08:00 via Android
    你们这样做有考虑过浏览器的感受吗??除非你能识别是浏览器请求还是爬虫请求
    ty89
        29
    ty89  
       2016-09-20 18:42:23 +08:00
    满桶水不响,半桶水响叮当
    doubleflower
        30
    doubleflower  
    OP
       2016-09-20 19:15:56 +08:00
    @ty89 DSB
    soulmine
        31
    soulmine  
       2016-09-21 01:23:37 +08:00
    @est 我遇到过 爬了半个月 发现里面一半真的一半假的 然后 TM 还不知道哪些真的哪些假的 ....
    tsungkang
        32
    tsungkang  
       2016-09-22 18:03:37 +08:00
    写了半年多爬虫的半桶水路过,其实只要是你用浏览器能访问到的一切东西,都能用爬虫来爬,干翻爬虫其实不用这么麻烦,一个牛逼的验证码,或者要求注册帐号,一下子就没辙了。
    个人不建议去搞一些可能会牺牲用户体验的设计,之前爬过一个某机构的站(不止我们,还有很多人也在爬他们,我也不想去爬,只是领导安排而已),后来貌似对方知道了,一气之下加了一些判断,有时候故意卡个 1 、 2 分钟,写的爬虫倒是 30 秒搞不定就放弃换 ip 了,反而我用浏览器正常访问,有时候也被卡,严重影响用户体验。
    yanzixuan
        33
    yanzixuan  
       2016-09-28 17:49:47 +08:00
    @greatghoul 真相了。
    最大的笑话就是程序员不光找不到女朋友,就连爬虫都对你没兴趣。。。
    yanzixuan
        34
    yanzixuan  
       2016-09-28 17:52:02 +08:00
    @greatghoul 弱问, phatomjs 的 eval 是沙盒,开多个但载入网页也是独立的么?
    greatghoul
        35
    greatghoul  
       2016-09-28 21:35:25 +08:00
    @yanzixuan 这个真没有研究过,以后用 firefox 作浏览器的时候,是可以多开的,彼此也可以隔离, phantomjs 应该也能做到彼此独立吧。
    Technetiumer
        36
    Technetiumer  
       2016-09-29 12:24:42 +08:00
    Slowloris ?
    lyz8
        37
    lyz8  
       2016-09-30 22:05:13 +08:00
    写爬虫都是设置 5 秒超时的
    pyufftj
        38
    pyufftj  
       2016-10-02 20:48:48 +08:00
    这样对网站的 seo 也是很不好的,毕竟 google 之流才是最大的爬虫
    dongfang
        39
    dongfang  
       2016-10-04 18:13:45 +08:00
    @greatghoul
    >最寂寞的就是写了一堆反爬虫的策略,发现都没有生效过,没人来爬。。。

    233333
    good758
        40
    good758  
       2017-12-22 11:06:54 +08:00
    然后 百度谷歌也不喜欢了。
    关于     帮助文档     自助推广系统     博客     API    FAQ     Solana     2786 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:48 PVG 22:48 LAX 07:48 JFK 10:48
    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