V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

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

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

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

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

    如果,在网站的页面里随机插入坏链接,或在检测到是爬虫时,返回无限大响应的请求,比如发送无限大的永不结束的 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 吗?好像看看🐸🐸
    jyf007
        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   ·   我们的愿景   ·   实用小工具   ·   954 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:50 · PVG 03:50 · LAX 12:50 · JFK 15:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.