在编写网络爬虫/刮刀时,有哪些算法和技术可用于限制请求并避免服务器/被禁止的DoS?这通常是在阅读关于网络抓取时(例如,here),但总是像“我应该实施限制,但没有”:)
我的Google-fu可能很弱,因为我发现大多数关于如何限制服务器端请求的讨论,而其他人(如this question)则特定于某些库。
答案 0 :(得分:1)
最通用的跨语言方式是在请求之间休眠。像10秒睡眠这样的东西应该模仿真实的人通过网页的速度。为了避免机器人识别算法,有些人会随机睡一段时间:sleep(ten_seconds + rand())
。
您可以通过跟踪每个域的不同睡眠超时来使其变得更加漂亮,这样您就可以在等待睡眠超时的同时从另一台服务器获取内容。
第二种方法是实际尝试减少请求的带宽。您可能需要使用此功能编写自己的http客户端才能执行此操作。或者在Linux上,您可以使用网络堆栈为您完成 - 谷歌qdisc
。
你当然可以结合两种方法。
请注意,减少带宽对于拥有大量小资源的网站来说并不是非常友好。那是因为你增加了为每个资源连接的时间,因此占用了一个网络套接字,可能还有一个网络服务器线程。
另一方面,对于拥有大量资源(如mp3文件或视频)的网站而言,不减少带宽并不是非常友好。这是因为你的网络 - 交换机,路由器,ISP连接 - 通过尽可能快地下载来使其网络饱和。
智能实现将全速下载小文件,在下载之间休眠,但会减少大文件的带宽。