You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动