如果,在网站的页面里随机插入坏链接,或在检测到是爬虫时,返回无限大响应的请求,比如发送无限大的永不结束的 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()
![]() | 1 windfarer 2016-09-15 16:18:39 +08:00 多来这么几个爬虫,你自己服务器就先爆了 |
![]() | 2 doubleflower OP @windfarer 为什么?压缩数据啊,一点点流量就爆了对方内存。 |
![]() | 3 mdzz 2016-09-15 16:36:33 +08:00 reference: https://en.wikipedia.org/wiki/Zip_bomb |
![]() | 4 choury 2016-09-15 16:38:49 +08:00 via Android ![]() 为什么你写的爬虫会被识别出来,要是能识别出来我直接给你返回 403 不是更好? |
![]() | 5 jackon 2016-09-15 16:39:01 +08:00 via iPhone 只是你自己的爬虫太弱而已 |
![]() | ![]() |
![]() | 7 doubleflower OP @choury 那样对方完全没有受到伤害啊,比如各种新闻客户端爬盗版文章的,你发现它频率太高不象真人就给它 403 它转头去爬别人家回来再爬你,而一爬直接爆了的话对方就很难受了 |
![]() | 8 greatghoul 2016-09-15 16:48:26 +08:00 ![]() > 在网站的页面里随机插入坏链接 牺牲用户体验 > 或在检测到是爬虫时,返回无限大响应的请求 一般写爬虫超时,或者超量,就有机制自动 kill 掉了 最寂寞的就是写了一堆反爬虫的策略,发现都没有生效过,没人来爬。。。 |
![]() | 9 doubleflower OP @greatghoul 不可见链接,有什么问题? 说说容易,请问你用什么机制自动 kill? |
![]() | 10 imn1 2016-09-15 17:15:48 +08:00 我收 chunk 超过一定字节就 close ,并记录,因为超出我的预期的字节数上限,我认为肯定某个环节出问题,根本还不到 unzip 这个步骤 |
![]() | 11 maomaomao001 2016-09-15 17:15:54 +08:00 via Android 怎么检测是爬虫还是正常用户? |
12 DesignerSkyline 2016-09-15 17:22:19 +08:00 via iPad @greatghoul 犀利 |
![]() | 13 greatghoul 2016-09-15 17:29:52 +08:00 ![]() kill 掉爬虫非常简单呀 https://gist.github.com/greatghoul/7352ba71134cf9079eb5e049c235cd64 楼主你写的爬虫太烂了。。 另外你的链接不可见,总要写在源码里面吧,人家分析你网站的时候要是觉察不出来那还写的什么爬虫,就算你随机返回,人家爬虫多测试几次就知道了,针对你的伎俩,分分钟就有应对策略了。 还什么超大响应,你不知道有 chunk 和 stream 这种东西吗?你以为那些抓取电影资源的爬虫都是把整部电影读进内存里面吗? |
![]() | 14 doubleflower OP @maomaomao001 在文章列表里随机插一个被 css 隐藏起来的文章连接,用 css :nth-child 之类的技术设置不可见,普通用户不可能点的,爬虫不会分析 css 会爬去这个文章。 |
![]() | 15 greatghoul 2016-09-15 17:45:30 +08:00 via iPhone @doubleflower 你这规则也太简单了 |
![]() | 16 doubleflower OP @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() ``` |
![]() | 17 greatghoul 2016-09-15 17:56:07 +08:00 @doubleflower 那处理无限 header 呢?这总不能 stream 了吧。 都不用处理 httplib.IncompleteRead: IncompleteRead(0 bytes read) curl 都会很快中断,还别说专门写爬虫了。 |
18 laoyur 2016-09-15 17:57:46 +08:00 ![]() 然后误伤一大片吃瓜群众,领导直接让你背锅 |
![]() | 19 greatghoul 2016-09-15 18:03:26 +08:00 现在很多网站都是 js 动态渲染的,传统的发 request 的爬虫根本占不到 90.99999%,现在好多爬虫都是直接跑的 phantomjs ,还有跑在 Chrome Extension 上面的,那些弱鸡的规则压根不顶用,甚至还有直接截屏 ocr 的。。。 楼主你还停留在上个时代。 |
![]() | 20 goodman001 2016-09-15 18:09:22 +08:00 via iPhone @greatghoul 精辟 |
![]() | 21 imcocc 2016-09-15 18:11:48 +08:00 via iPhone ![]() 楼主不知道七伤拳 伤人先伤己吗 |
![]() | 22 Troevil 2016-09-15 18:23:26 +08:00 爬虫会控制深度吧 不可能无限循环下去的吧 |
![]() | 23 thinks 2016-09-15 21:04:30 +08:00 via Android @greatghoul 确实很寂寞,和我写防火墙策略一样了,结果一年过去了连条深层一点的端口扫描纪录都没有… |
24 wangxiaoer 2016-09-15 21:24:20 +08:00 ![]() 笑死了,你这个杀敌一万,自损八千啊,你服务端维持那么多长连接你扛得住?再说了,定向爬取都特么要到源码分析抓取地址的啊?你这种小伎俩分分钟过滤掉啊 |
![]() | 25 est 2016-09-15 21:47:05 +08:00 ![]() 都没我的策略淫荡。。。判断是爬虫就随机插入脏数据。。。。。 比如电商。。就随机返回价格。。。让你们爬。 管够。 |
26 scnace 2016-09-15 23:09:39 +08:00 via Android @greatghoul 截屏 ocr 有 demo 吗?好像看看 |
![]() | 28 veelog 2016-09-16 15:51:41 +08:00 via Android 你们这样做有考虑过浏览器的感受吗??除非你能识别是浏览器请求还是爬虫请求 |
29 ty89 2016-09-20 18:42:23 +08:00 满桶水不响,半桶水响叮当 |
![]() | 30 doubleflower OP @ty89 DSB |
32 tsungkang 2016-09-22 18:03:37 +08:00 写了半年多爬虫的半桶水路过,其实只要是你用浏览器能访问到的一切东西,都能用爬虫来爬,干翻爬虫其实不用这么麻烦,一个牛逼的验证码,或者要求注册帐号,一下子就没辙了。 个人不建议去搞一些可能会牺牲用户体验的设计,之前爬过一个某机构的站(不止我们,还有很多人也在爬他们,我也不想去爬,只是领导安排而已),后来貌似对方知道了,一气之下加了一些判断,有时候故意卡个 1 、 2 分钟,写的爬虫倒是 30 秒搞不定就放弃换 ip 了,反而我用浏览器正常访问,有时候也被卡,严重影响用户体验。 |
33 yanzixuan 2016-09-28 17:49:47 +08:00 @greatghoul 真相了。 最大的笑话就是程序员不光找不到女朋友,就连爬虫都对你没兴趣。。。 |
34 yanzixuan 2016-09-28 17:52:02 +08:00 @greatghoul 弱问, phatomjs 的 eval 是沙盒,开多个但载入网页也是独立的么? |
![]() | 35 greatghoul 2016-09-28 21:35:25 +08:00 @yanzixuan 这个真没有研究过,以后用 firefox 作浏览器的时候,是可以多开的,彼此也可以隔离, phantomjs 应该也能做到彼此独立吧。 |
![]() | 36 Technetiumer 2016-09-29 12:24:42 +08:00 Slowloris ? |
![]() | 37 lyz8 2016-09-30 22:05:13 +08:00 写爬虫都是设置 5 秒超时的 |
![]() | 38 pyufftj 2016-10-02 20:48:48 +08:00 这样对网站的 seo 也是很不好的,毕竟 google 之流才是最大的爬虫 |
39 dongfang 2016-10-04 18:13:45 +08:00 |
40 good758 2017-12-22 11:06:54 +08:00 然后 百度谷歌也不喜欢了。 |