如何通过Python代码添加延迟实现慢速网页爬取以避免封禁?
控制Python爬虫速率的实用方案
嘿,这个问题我爬允许机器人访问的站点时也踩过坑!既然网站明确允许爬虫,那核心就是控制请求的频率,别触发它的速率限制。下面给你几个Python里实用的方案:
1. 基础方案:用time模块加固定/随机延迟
最直接的方法就是在每次请求后暂停一段时间。推荐用随机延迟,比固定间隔更难被反爬机制识别:
import time import random import requests # 你的目标URL列表 target_urls = ["https://example.com/page1", "https://example.com/page2", ...] for url in target_urls: # 发送请求(记得配置合法的User-Agent) response = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"}) # 处理页面内容(解析、存储等) process_response(response) # 随机暂停1-3秒,避免规律请求 time.sleep(random.uniform(1, 3))
这里的random.uniform(a, b)会生成a到b之间的随机浮点数,让请求间隔更贴近真实用户的访问节奏。
2. 进阶方案:用backoff库实现智能速率控制
如果需要兼顾容错(比如请求失败后重试)和灵活的延迟策略,可以用backoff这个专门的库。它支持指数退避(失败后延迟时间递增)和随机抖动,既降速又提升爬虫的稳定性:
import requests from backoff import on_exception, expo # 定义带重试和延迟的请求函数 @on_exception( expo, # 指数退避策略 requests.exceptions.RequestException, # 捕获所有请求异常 max_tries=3, # 最多重试3次 jitter=0.5 # 添加随机抖动,避免固定间隔 ) def fetch_with_backoff(url): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"} response = requests.get(url, headers=headers) response.raise_for_status() # 触发HTTP错误(比如429)时自动重试 return response # 遍历URL for url in target_urls: resp = fetch_with_backoff(url) process_response(resp) # 额外添加基础延迟,进一步降低速率 time.sleep(random.uniform(0.5, 2))
安装这个库的命令很简单:pip install backoff
3. 大规模爬虫:用Scrapy框架的内置配置
如果你的爬虫规模较大,推荐用Scrapy框架——它自带成熟的速率控制配置,不用自己写sleep逻辑。只需要在settings.py里修改几个参数:
# settings.py # 基础延迟(秒) DOWNLOAD_DELAY = 2 # 开启随机化延迟,实际间隔会在0.5*DOWNLOAD_DELAY到1.5*DOWNLOAD_DELAY之间 RANDOMIZE_DOWNLOAD_DELAY = True # 限制并发请求数,避免同时发送太多请求 CONCURRENT_REQUESTS = 1 # 配置合法的User-Agent USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
Scrapy会自动帮你处理请求间隔,比手动控制更可靠。
额外小提示
- 一定要设置合法的User-Agent,不要用Python请求库的默认UA(比如
python-requests/2.31.0),尽量模拟真实浏览器的UA字符串。 - 先查看目标网站的
robots.txt(比如https://example.com/robots.txt),有些网站会明确给出爬虫的请求间隔建议,按照建议来更稳妥。
内容的提问来源于stack exchange,提问作者Davis Roberto




