0

在编写网络爬虫/爬虫时,有哪些算法和技术可用于限制请求并避免 DoS 攻击服务器/被禁止?这在阅读有关网络抓取的信息时经常出现(例如,here),但总是像“我应该实现节流,但没有”:)

我的 Google-fu 可能很弱,因为我发现主要是关于如何在服务器端限制请求的讨论,而其他人(比如这个问题)是特定于某些库的。

4

1 回答 1

1

最通用的跨语言方式是在请求之间休眠。像 10 秒的睡眠应该模仿真人浏览网页的速度。为了避免机器人识别算法,有些人会随机睡觉:sleep(ten_seconds + rand()).

您可以通过跟踪每个域的不同睡眠超时来使其更有趣,这样您就可以在等待睡眠超时时从另一台服务器获取某些内容。

第二种方法是实际尝试减少您的请求的带宽。您可能需要使用此功能编写自己的 http 客户端来执行此操作。或者在 linux 上,您可以使用网络堆栈为您做这件事 - google qdisc

你当然可以结合这两种方法。

请注意,减少带宽对于拥有大量小资源的站点不是很友好。那是因为您增加了每个资源的连接时间,因此占用了一个网络套接字,并且可能在您使用它时占用了一个 Web 服务器线程。

另一方面,不减少带宽对于拥有大量大型资源(如 mp3 文件或视频)的网站不是很友好。那是因为您通过尽可能快地下载来使他们的网络(交换机、路由器、ISP 连接)饱和。

智能实现将全速下载小文件,在下载之间休眠,但会减少大文件的带宽。

于 2014-08-25T02:30:45.680 回答