Language agnostic 自动限制请求

Language agnostic 自动限制请求,language-agnostic,web-scraping,bandwidth-throttling,Language Agnostic,Web Scraping,Bandwidth Throttling,在编写web爬虫/刮板时,有哪些算法和技术可用于限制请求并避免拒绝服务器/被禁止?当阅读有关web抓取(例如)的文章时,经常会出现这种情况,但总是类似于“我应该实施节流,但没有”: 我的Google fu可能很弱,因为我发现大多数讨论都是关于如何限制服务器端请求的,而其他(如)讨论都是关于某个库的。最通用的跨语言方式是在请求之间休眠。像10秒钟的睡眠应该能模拟真实的人类浏览网页的速度。为了避免机器人识别算法,有些人会随机睡上一段时间:sleep(十秒+rand()) 您可以通过跟踪每个域的不同睡

在编写web爬虫/刮板时,有哪些算法和技术可用于限制请求并避免拒绝服务器/被禁止?当阅读有关web抓取(例如)的文章时,经常会出现这种情况,但总是类似于“我应该实施节流,但没有”:


我的Google fu可能很弱,因为我发现大多数讨论都是关于如何限制服务器端请求的,而其他(如)讨论都是关于某个库的。

最通用的跨语言方式是在请求之间休眠。像10秒钟的睡眠应该能模拟真实的人类浏览网页的速度。为了避免机器人识别算法,有些人会随机睡上一段时间:
sleep(十秒+rand())

您可以通过跟踪每个域的不同睡眠超时来让它更有趣,这样您就可以在等待睡眠超时的同时从另一台服务器获取一些东西

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

当然,您可以结合使用这两种方法

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

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


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

如何知道资源是否大?将HEAD请求发送到实际下载之前?通常要注意
内容长度
。虽然分块响应没有内容长度。尽管如此,大多数小文件都可以一次性发送。因此,一个分块的响应也可能意味着大尺寸。