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

2016-09-15 16:17:00 +08:00
 doubleflower

如果,在网站的页面里随机插入坏链接,或在检测到是爬虫时,返回无限大响应的请求,比如发送无限大的永不结束的 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()
15592 次点击
所在节点    奇思妙想
40 条回复
windfarer
2016-09-15 16:18:39 +08:00
多来这么几个爬虫,你自己服务器就先爆了
doubleflower
2016-09-15 16:24:49 +08:00
@windfarer 为什么?压缩数据啊,一点点流量就爆了对方内存。
mdzz
2016-09-15 16:36:33 +08:00
choury
2016-09-15 16:38:49 +08:00
为什么你写的爬虫会被识别出来,要是能识别出来我直接给你返回 403 不是更好?
jackon
2016-09-15 16:39:01 +08:00
只是你自己的爬虫太弱而已
binux
2016-09-15 16:43:03 +08:00
doubleflower
2016-09-15 16:45:59 +08:00
@choury 那样对方完全没有受到伤害啊,比如各种新闻客户端爬盗版文章的,你发现它频率太高不象真人就给它 403 它转头去爬别人家回来再爬你,而一爬直接爆了的话对方就很难受了
greatghoul
2016-09-15 16:48:26 +08:00
> 在网站的页面里随机插入坏链接

牺牲用户体验

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

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

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

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

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

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

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

都不用处理

httplib.IncompleteRead: IncompleteRead(0 bytes read)

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

楼主你还停留在上个时代。
goodman001
2016-09-15 18:09:22 +08:00
@greatghoul 💪🏻💪🏻💪🏻精辟

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/306460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX