这是一个专门讨论 idea 的地方。

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

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

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

  •  
  •   doubleflower · Sep 15, 2016 · 17054 views
    This topic created in 3706 days ago, the information mentioned may be changed or developed.

    如果,在网站的页面里随机插入坏链接,或在检测到是爬虫时,返回无限大响应的请求,比如发送无限大的永不结束的 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 replies  •  2017-12-22 11:06:54 +08:00
    windfarer
    windfarer
    Sep 15, 2016
    1
    多来这么几个爬虫,你自己服务器就先爆了
    doubleflower
    doubleflower
    OP
    Sep 15, 2016
    2
    @windfarer 为什么?压缩数据啊,一点点流量就爆了对方内存。
    mdzz
    mdzz
    Sep 15, 2016
    3
    choury
    choury
    Sep 15, 2016 via Android❤️1
    4
    为什么你写的爬虫会被识别出来,要是能识别出来我直接给你返回 403 不是更好?
    jackon
    jackon
    Sep 15, 2016 via iPhone
    5
    只是你自己的爬虫太弱而已
    doubleflower
    doubleflower
    OP
    Sep 15, 2016
    7
    @choury 那样对方完全没有受到伤害啊,比如各种新闻客户端爬盗版文章的,你发现它频率太高不象真人就给它 403 它转头去爬别人家回来再爬你,而一爬直接爆了的话对方就很难受了
    greatghoul
    greatghoul
    Sep 15, 2016❤️3
    8
    > 在网站的页面里随机插入坏链接

    牺牲用户体验

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

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

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

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

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

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

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

    都不用处理

    httplib.IncompleteRead: IncompleteRead(0 bytes read)

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

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

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

    233333
    good758
    good758
    Dec 22, 2017
    40
    然后 百度谷歌也不喜欢了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   492 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    ♥ Do have faith in what you're doing.