合理设置爬取延时可有效避免IP被封,通过time.sleep()实现固定或随机延时,结合User-Agent、Session及Scrapy的自动限速配置,模拟人类行为降低反爬风险。

在使用Python编写爬虫时,频繁请求目标网站容易触发反爬机制,导致IP被封禁。为了避免这种情况,合理设置爬取延时、控制访问频率是关键措施之一。通过引入时间间隔,让爬虫行为更接近人类操作,能有效降低被识别为自动化程序的风险。
使用time.sleep()进行基础延时
最简单直接的延时方式是使用Python内置的time.sleep()函数,在每次请求之间暂停一段时间。
示例:
import requests import timeurls = ['https://www.php.cn/link/a306a13c6c1ee387390fdc96c7bdca66', 'https://www.php.cn/link/922a7fd3b1c537453af87329140dcfb2'] for url in urls: response = requests.get(url)
处理响应
print(f"已抓取: {url}") time.sleep(2) # 每次请求后等待2秒
这种固定延时适用于大多数普通场景,一般建议设置在1~3秒之间,避免对服务器造成压力。
立即学习“Python免费学习笔记(深入)”;
使用随机延时模拟人类行为
固定间隔仍可能被识别为机器行为。采用随机延时能更真实地模拟用户浏览习惯。
结合random模块实现动态等待:
import time import random随机等待1到3秒
time.sleep(random.uniform(1, 3))
也可使用randint或triangular等方法调整分布,使间隔更具自然波动。
结合请求框架的高级控制(如Scrapy)
若使用Scrapy框架,可通过配置项自动管理下载延迟:
在settings.py中添加:
# 开启自动限速 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 1 AUTOTHROTTLE_MAX_DELAY = 5 AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0或手动设置固定延迟
DOWNLOAD_DELAY = 2 RANDOMIZE_DOWNLOAD_DELAY = True CONCURRENT_REQUESTS_PER_DOMAIN = 2
这些设置能让Scrapy根据服务器响应自动调节请求频率,更加智能和安全。
使用Session与请求头配合延时策略
除了时间控制,搭配合理的请求头和会话管理也能提升稳定性:
- 设置User-Agent模拟浏览器访问
- 使用Session保持连接复用,减少开销
- 结合延时策略,整体请求更接近正常用户行为
示例:
session = requests.Session()
session.headers.update({'User-Agent': 'Mozilla/5.0 ...'})
for url in urls:
response = session.get(url)
time.sleep(random.uniform(1.5, 3.5))
基本上就这些。合理设置延时不只是加个sleep,而是结合随机性、请求头、并发控制等多方面协调。既能保护目标服务器,也能提高爬虫的长期可用性。不复杂但容易忽略细节。










