46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
"""
|
|
Rate limiting utility to prevent overloading target servers.
|
|
"""
|
|
import time
|
|
import random
|
|
from typing import Optional
|
|
|
|
|
|
class RateLimiter:
|
|
"""
|
|
Simple rate limiter with random jitter to avoid detection.
|
|
"""
|
|
|
|
def __init__(self, min_delay: float = 1.0, max_delay: Optional[float] = None):
|
|
"""
|
|
Initialize rate limiter.
|
|
|
|
Args:
|
|
min_delay: Minimum delay between requests in seconds
|
|
max_delay: Maximum delay between requests. If None, uses min_delay
|
|
"""
|
|
self.min_delay = min_delay
|
|
self.max_delay = max_delay or min_delay
|
|
self.last_request_time = 0
|
|
|
|
def wait(self):
|
|
"""
|
|
Wait for the appropriate amount of time before the next request.
|
|
Adds random jitter to avoid pattern detection.
|
|
"""
|
|
elapsed = time.time() - self.last_request_time
|
|
delay = random.uniform(self.min_delay, self.max_delay)
|
|
|
|
if elapsed < delay:
|
|
time.sleep(delay - elapsed)
|
|
|
|
self.last_request_time = time.time()
|
|
|
|
def __enter__(self):
|
|
"""Context manager entry."""
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
"""Context manager exit."""
|
|
self.wait()
|
|
|